Подтвердить что ты не робот

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

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

например. 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."

Как решить?

4b9b3361

Ответ 1

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

щелкните 'файл > свойства проектa > свойства проекта', чтобы установить значение ключа, или вы можете использовать

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

Данные можно получить с помощью

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

Я использую обходной путь, возвращая функцию с объектом моих глобальных переменных:

function globalVariables(){
  sheetName: 'Sheet1',    
  variable1: 1,
  varibale2: 2
}

function functionThatUsesVariable (){
  var sheet =   SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}