Google Script setValue разрешение

Я пытаюсь установить какое-либо значение для ячейки в электронной таблице Google.

function exampleFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var range1 = sheet.getRange("A1");
  var value1 = range1.getValue();
  value1+=1;
  range1.setValue(2);
  return value1;
}

Если я пытаюсь повлиять на ячейку с помощью этой функции, появляется эта ошибка:

У вас нет разрешения, необходимого для установки значения. (строка 10, файл "ddd")

Вы знаете, как я мог сделать это возможным? Я действительно хочу, чтобы затронутая ячейка приняла значение ячейки A1 и увеличила значение A1 +1.

Спасибо

4 ответа

Решение

Из документации:

Пользовательские функции возвращают значения, но они не могут устанавливать значения вне ячеек, в которых они находятся. В большинстве случаев пользовательская функция в ячейке A1 не может изменять ячейку A5. Однако если пользовательская функция возвращает двойной массив, результаты переполняют ячейку, содержащую функцию, и заполняют ячейки ниже и справа от ячейки, содержащей настраиваемую функцию. Вы можете проверить это с помощью пользовательской функции, содержащей return [[1,2],[3,4]];.

ссылка: пользовательские функции в электронных таблицах

Похоже, что вы используете вышеупомянутую функцию как пользовательскую функцию, другими словами, она вызывается по формуле ячейки в пользовательском интерфейсе Google Sheets следующим образом:

=exampleFunction()

Пользовательские функции в Google Sheets имеют ограничения, например, их нельзя использовать для вызова служб скриптов Google Apps, для которых требуются разрешения. Обходной путь должен использовать другое средство для вызова функции:

Также их можно вызывать из диалоговых окон и боковых панелей, веб-приложений скриптов Google Apps и с помощью API выполнения скриптов Google Apps.

наконец, я нашел способ установить формулу ...
Просто она немного отличается от того, что думают мы, программисты.
Вы можете использовать SetFormula в макросе, но не в CustomFunction.
Просто создайте простой макрос из Tools->Macros->Record Macro, а затем откройте редактор сценариев и измените код макроса на свой код ...
Вот мой код макроса:

      function SetFormula() {
  var spreadsheet = SpreadsheetApp.getActive();
  var formulaValue = spreadsheet.getRange('formulaText').getValue().toString();
  spreadsheet.getRange('total').setFormula(formulaValue);
  return formulaValue;
};

Затем, чтобы запустить макрос автоматически (вы можете запустить его вручную из Tools->Macros->YOUR-MACRO-NAME) просто создайте триггер следующим образом:

  1. Откройте редактор скриптов:

  2. Затем перейдите к триггерам на левой боковой панели и нажмите кнопку Добавить триггер:

  3. Наконец, создайте триггер, выберите свой макрос из списка (мой - SetFormula ), выберите источник события как From SpreadSheet, а тип события - On Edit и сохраните его.

Вот и все!
Примечание. Я назвал свои диапазоны как FormulaText и totalбыть более гибким.
вы можете сделать это отсюда:

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

Использование триггера - это еще один способ сделать что-то вроде этого примера, что делает его автоматическим.

Простой триггер в сценарии приложения, например onSelectionChange(e)работает, не сталкиваясь с проблемой разрешений для помещения пользовательской функции в ячейку. Этот триггер новее, чем то, что было в исходном посте. В приведенном ниже простом примере ячейка A1 станет белой с четным целым числом и красной с любым остальным. Конечно, скорость срабатывания триггеров может быть разной. Это не всегда так мгновенно, как можно было бы ожидать.

function onSelectionChange(e) {

  const sheet = SpreadsheetApp.getActive()
  var value1 = sheet.getRange("A1").getValue()
    if(value1 % 2 == 0) {
        sheet.getRange("A1").setBackground("#FFFFFF") //white
    } else {
        sheet.getRange("A1").setBackground("#FF0000") //red
    }
}