如何在Google Apps脚本中定义全局变量

Rya*_*yan 38 google-docs google-sheets google-apps-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);
};
Run Code Online (Sandbox Code Playgroud)

但是,当我运行上面的代码时,它返回

"MyCompany is not defined."
Run Code Online (Sandbox Code Playgroud)

怎么解决?

Ash*_*rke 87

您可能最好使用Properties Service,因为您可以将它们用作一种持久的全局变量.

单击"文件>项目属性>项目属性"以设置键值,或者您可以使用

PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue');
Run Code Online (Sandbox Code Playgroud)

可以使用检索数据

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

  • 您的回答对我来说很完美,我使用了"文件>项目属性>脚本属性".然后我添加了"属性"和"值",然后我使用了"检索到的"代码.非常好! (2认同)
  • 好的!谢谢!这仅存储字符串,因此我使用 json 字符串来存储复杂对象。:) (2认同)

Sof*_*ter 8

GAS 中的全局变量与其他语言中的不同。它们不是在所有例程中都可用的常量或变量。

我想我也可以使用全局变量来保持功能和效率之间的一致性。但正如这里的一些人所指出的那样,我错了。

全局变量将在每次执行脚本时评估,因此不是每次运行应用程序时都评估一次。
全局变量可以在脚本中更改(因此它们不是不能意外更改的常量),但会在调用另一个脚本时重新初始化。
使用全局变量也有速度损失。如果在一个函数中您两次或多次使用相同的全局变量,分配一个局部变量并使用它会更快。

如果您想保留应用程序中所有函数之间的变量,最好使用 cacheService。我发现遍历驱动器上的所有文件和文件夹需要很多时间。但是您可以将有关文件和文件夹的信息存储在缓存(或什至属性)中并加速至少 100 倍。

我现在使用全局变量的唯一方法是用于某些前缀和命名小部件。

  • 好的我明白了。但请注意,性能下降将来自调用代码来初始化变量,而不是全局或局部的事实。 (3认同)

小智 5

我通过返回一个带有全局变量对象的函数来使用一种解决方法:

function globalVariables(){
  var variables = {
    sheetName: 'Sheet1',
    variable1: 1,
    variable2: 2
  };
  return variables;
}

function functionThatUsesVariable (){
  var sheet =   SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}
Run Code Online (Sandbox Code Playgroud)

  • 为此,它应该是:`function globalVariables(){ var variables = { sheetName: 'Sheet1', variable1: 1, variable2: 2}; 返回变量;}` (6认同)