当前位置: 首页 > 知识库问答 >
问题:

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

沙海
2023-03-14

我看到谷歌的大多数例子是他们只在单个巨型脚本中使用函数。

例如 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个答案

胡修伟
2023-03-14

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

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

function functionThatUsesVariable (){
  var sheet =   SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}
百里渊
2023-03-14

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

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

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

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

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

谈琦
2023-03-14

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

点击“文件

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

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

var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');
 类似资料:
  • 问题内容: 在Coffeescript.org上: 将编译为: 通过在node.js下的coffee-script进行编译可以做到: 文件说: 如果要创建供其他脚本使用的顶级变量,请将它们作为属性附加到窗口或CommonJS中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root = exports?这个 然

  • 我用global.d.ts定义全局变量: 但是在执行main.ts的时候 报错:

  • 我的文件中有这段代码,在这里我可以简单地使用。 现在,我需要使用socket从各种文件发出事件,而不想连接此

  • 问题内容: 是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用变量(在函数中声明)。 问题答案: 是的,正如其他人所说的,您可以在全局范围内(在所有函数之外)使用声明全局变量: 或者,您可以在上分配一个属性: …因为在浏览器中,用声明的 所有全局变量 都是对象的属性。(在最新规范ECMAScript 2015中,全局范围内的new ,和语句创建的不是全局对象属性的全局变量;这

  • 问题内容: 有没有一种方法可以将一个函数定义为在一个类中是全局的(或者,实际上是在另一个函数中)?类似于定义全局变量。 问题答案: 将函数添加到当前名称空间,就像将添加任何其他名称一样。这意味着您可以在函数或方法中使用关键字: 同样适用于类主体或方法: 区别将在导入时执行顶级类主体时立即定义。 像您的所有用途一样,您可能想重新思考问题并找到另一种解决方法。例如,您可以 返回 如此创建的函数。 演示

  • 我准备我的API文档的方式是每只手做一次,而不是自动生成。我有应该发送到所有API的头,不知道是否可以为整个API全局定义参数? 这些头中有些是静态的,有些必须在调用API时设置,但它们在所有API中都是相同的,我不想为每个API和每个方法复制和粘贴参数,因为这在将来是不可维护的。 我看到了API定义的静态头,但没有一个文档说明如何设置或使用它们。 这到底有没有可能?

  • 我正在为全局窗口对象指定一个属性,但当我运行eslint时,我得到以下结果: “窗口”未定义 我在eslint文档中看到了这一点: 下面将窗口定义为不应该触发正在测试的规则的代码的全局变量: 我曾尝试将类似的内容添加到package.json文件中,以使eslint allow“window”作为全局变量,但我一定是做错了什么。从文档来看,我可能需要在一个单独的文件中执行类似的操作,但是有没有办法

  • 问题内容: 目前,我正在使用一个大量的JavaScript,jQuery,Microsoft客户端JavaScript和其他库的旧网页。底线- 我无法从头开始重写整个页面,因为企业无法证明它的合理性。所以…就是这样。无论如何,我需要使用变量来污染(我确实没有尝试过)全局名称空间。我在考虑三个选项- 只需使用普通的JavaScript声明存储/检索它- 使用jQuery在DOM标签中存储/获取值-