【发布时间】:2020-12-04 20:21:29
【问题描述】:
请看下面的例子,
function doSomething1(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doSomething2(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doItAll(){
doSomething1();
doSomething2();
}
不用在两个函数中调用电子表格,这可以使用全局变量来简化
const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
doSomething1();
doSomething2();
}
这里的问题可以在不使用全局变量的情况下解决,只需在函数之间传递ss变量即可。但是,如果需要访问ss 变量的多个函数,这将变得更加复杂。传递ss 很麻烦。没有很多方法可以避免 Apps 脚本中的全局变量。不支持模块。如果您使用 IIFE,则所有函数都对 IDE 隐藏 - 从 IDE 或其他任何地方调用函数是不可能的。在这里使用全局变量要优雅得多。但是如果我有一个简单的触发器就会出现问题:
const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
doSomething1();
doSomething2();
}
function onOpen(){/*Adds a menu*/}
菜单添加onOpen 将失败,因为此行在onOpen 之前加载了SpreadsheetApp.openById(/*SPREADSHEET_ID*/),并且该行需要权限/授权,而onOpen 作为一个简单的触发器不会运行任何需要授权的代码。
如何在不遇到授权错误的情况下声明全局变量?
【问题讨论】:
标签: google-apps-script google-sheets global-variables lazy-loading