it-swarm.com.ru

Как определить глобальную переменную в Google Apps Script

Я вижу большинство примеров от Google, они используют только функции в одном гигантском скрипте. 

например https://developers.google.com/apps-script/quickstart/macros

Но в нашем стиле мы обычно пишем все функции в одном пространстве имен, например

MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: MyCompany.init
    }];
    spreadsheet.addMenu("Test", menus);
};

Однако, когда я запускаю приведенный выше код, он возвращает

"MyCompany is not defined."

Как решить?

28
Ryan

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

нажмите «Файл> Свойства проекта> Свойства проекта», чтобы установить значение ключа, или вы можете использовать 

PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue');

Данные могут быть получены с 

var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');

67
AshClarke

В GAS глобальные переменные не такие, как в других языках. Они не являются ни константами, ни переменными, доступными во всех подпрограммах.

Я думал, что смогу использовать глобальные переменные для согласованности функций и эффективности. Но я был неправ, как указали некоторые люди здесь, в SO.

Глобальная переменная будет оцениваться при каждом выполнении скрипта, а не только один раз при каждом запуске приложения.
Глобальные переменные МОГУТ быть изменены в скрипте (поэтому они не являются константами, которые не могут быть изменены случайно), но будут повторно инициализированы при вызове другого скрипта.
Существует также снижение скорости при использовании глобальных переменных. Если внутри функции вы используете одну и ту же глобальную переменную два или более раз, будет быстрее назначить локальную переменную и использовать ее вместо этого. 

Если вы хотите сохранить переменные между всеми функциями в вашем приложении, лучше всего использовать cacheService. Я обнаружил, что цикл по всем файлам и папкам на диске занимает много времени. Но вы можете хранить информацию о файлах и папках в кеше (или даже в свойствах) и ускорить их как минимум в 100 раз.

Единственный способ использовать глобальные переменные сейчас - это использовать некоторые префиксы и присваивать имена виджетам.

3
SoftwareTester

Глобальные переменные, безусловно, существуют в GAS, но вы должны понимать взаимоотношения клиент/сервер в среде, чтобы правильно их использовать - см. Этот вопрос: Глобальные переменные в Google Script (электронная таблица)

Однако это не проблема с вашим кодом; в документации указано, что функция, которая должна быть выполнена с помощью меню, должна быть предоставлена ​​методу в виде строки, прямо сейчас вы предоставляете выходные данные функции: https://developers.google.com/apps- скрипт/ссылка/электронная таблица/электронная таблица # addMenu% 28String, объект% 29

function MainMenu_Init() {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: "MainMenu_Init"
    }];
    spreadsheet.addMenu("Test", menus);
};
1
Tim

Я использую это: если вы объявляете var x = 0; до объявления функций переменная работает для всех файлов кода, но переменная будет объявляться каждый раз, когда вы редактируете ячейку в электронной таблице

0