提问者:小点点

如何在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);
};

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

"MyCompany is not defined."

怎么解决?


共3个答案

匿名用户

最好使用属性服务,因为您可以将它们用作一种持久性全局变量。

点击“文件

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

数据可以通过以下方式检索

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

匿名用户

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

我想我可以使用全局变量来保证函数间的一致性和效率。但是正如这里的一些人指出的那样,我错了。

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

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

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

匿名用户

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

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

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