1

使用Google Apps脚本我试图创建一个全局变量(例如一个数组),可以在多个函数中使用,但我似乎无法在任何地方找到答案,需要它为我的Google Spreadsheet工作。全局变量值不能在多个函数中使用

代码:

var infoSheetArray = null; 

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Custom Menu') 
     .addItem('Fetch Info', 'grabInfo') 
     .addItem('Run Program', 'itemSetup') 
     .addToUi(); 
} 

function grabInfo() { 
    var infoSheet = SpreadsheetApp.openByUrl('....'); 
    infoSheetArray = infoSheet.getSheetValues(1, 1, infoSheet.getLastRow(), 10); 
}  
+0

向我们展示您的代码,以便我们看到为什么您所尝试的操作不起作用。 – jfriend00

+0

发送并发布代码。 – mds93

+0

你有错误吗? –

回答

3

在你的代码,infoSheetArray是全球范围一个变量,这意味着它是在你的程序中的所有代码访问。不太明显的是,你的程序在不同的“机器”中运行多次&,这就是为什么infoSheetArray可能被重置。

脚本的每个单独执行都是在新的执行实例中完成的,每个脚本都有自己的一组“全局变量”。例如,在您的示例代码片段中,onOpen()是在Web编辑器中打开电子表格时独立调用的自动触发器函数。您还有两个其他功能,grabInfo()itemSetup()(未显示),通过用户菜单扩展独立地调用

当这三个函数中的任何一个被独立调用时,为它创建一个执行实例,加载程序,然后开始执行。所有全局语句(例如var infoSheetArray = null;)都会先进行评估,然后是特定的触发函数。对全局变量所做的任何更改只会在发生更改的执行实例内持续存在,并且只会在需要该实例的情况下才会更改。一旦函数完成,实例就会被吹走。

如果您需要在执行实例之间保留值,则需要使用某些存储方法,如Properties ServiceExternal Database

+0

优秀的解释。谷歌应该在入门页面上真正强调这一点。他们将JS新手引导到CodeAcademy JavaScript教程,该教程针对的是一般网络/客户端应用程序,因此在这个问题上存在误导。对于许多GAS新手来说,这是一块绊脚石。我建议最初的提问者不要使用属性服务,它可能是一个挑剔的问题,尽可能使用电子表格本身来存储“全局”值。属性和缓存的大小也受到限制,并且缓存过期。 –