У меня есть две электронные таблицы Google, основная копия и дочерняя копия. Когда я обновляю формулы в основной копии, я хочу, чтобы она также обновляла формулы в дочерней копии. Я намереваюсь создать много копий дочерней копии и не хочу обновлять формулы в каждой каждый раз, когда что-то маленькое должно измениться.
Я пытался использовать IMPORTRANGE (), и он дает мне только значения, а не формулы. Поэтому я решил создать свой собственный сценарий, чтобы сделать это Я использую следующий код, чтобы попытаться это:
function REMOTEDATA(inKey, inRange) {
var outData;
var ss = SpreadsheetApp.openById(inKey);
if (ss) {
outData = ss.getRange(inRange).getFormulas();
}
return outData;
}
//My manifest is the following:
{
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets"
],
"timeZone": "America/Denver",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER"
}
Я очень плохо знаком с oAuth и не понимаю, как заставить это работать. Когда я пытаюсь это сделать, это дает мне следующее:
"У вас нет разрешения на вызов SpreadsheetApp.openById. Необходимые разрешения: https://www.googleapis.com/auth/spreadsheets (строка 4)."
Может кто-нибудь сказать мне, что мне нужно добавить, чтобы это заработало? Если есть более простой способ, я весь слух.
EDIT:
После прочтения комментария Рубена, приведенного ниже, я изменил способ сделать так, чтобы кнопка на листе сама запускала функцию. Первая проблема была исправлена, но теперь я столкнулся с другой проблемой. Я не могу скопировать все данные напрямую с одного листа на другой. Я пытаюсь получить формулы, значения и форматирование. Если я просто использую getFormulas () и setFormulas () с диапазонами, он избавляется от всех значений, которые не являются формулами, и не меняет форматирование. Я пытался использовать copyTo (), но он говорит мне, что я не могу сделать это между электронными таблицами. Мой текущий код:
function REMOTEDATA() {
var MASTERKEY = "key";
var UPDATERANGES = ["A1:B200", "C7:C200", "D1:H200", "J1:L200", "N1:S200", "U1:X200", "z1:ac200", "AE1:AH200", "AJ1:AL200"];
var ss = SpreadsheetApp.openById(MASTERKEY);
var cur_ss = SpreadsheetApp.getActiveSpreadsheet();
UPDATERANGES.forEach(function(range) {
data = ss.getRange(range).copyTo(cur_ss.getRange(range));
});
}
У меня начинает болеть голова, когда я смотрю на различные методы для класса Ранджес. Я не вижу никаких способов сделать это, но мне кажется, что я что-то упустил. Есть еще идеи?
РЕДАКТИРОВАТЬ 3:
Хорошо. Я нашел обходной путь. По сути, я скопировал весь лист из одной электронной таблицы в другую, используя функцию sheet.copyTo (). Затем после этого я использовал range.copyTo (), чтобы получить то, что я хотел. Затем я удалил скопированный лист, используя sheet.deleteSheet ()