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
- Используйте пользовательское меню
- Используйте триггер
Также их можно вызывать из диалоговых окон и боковых панелей, веб-приложений скриптов 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
) просто создайте триггер следующим образом:
Затем перейдите к триггерам на левой боковой панели и нажмите кнопку Добавить триггер:
Наконец, создайте триггер, выберите свой макрос из списка (мой - 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
}
}