Динамическое обновление формул из другой таблицы Google - PullRequest
0 голосов
/ 01 июня 2019

У меня есть две электронные таблицы 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 ()

1 Ответ

0 голосов
/ 01 июня 2019

Пользовательские функции выполняются анонимно, поэтому они не могут вызывать службы, требующие авторизации, например openById.

Вместо использования пользовательской функции для выполнения сценария используйте другой метод, например пользовательское меню, назначьте сценарий изображению и т. Д. Или просто запустите его из редактора сценариев.

ПРИМЕЧАНИЕ. Вам придется немного изменить сценарий или использовать другую функцию для передачи необходимых аргументов.

...