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新手來說,這是一塊絆腳石。我建議最初的提問者不要使用屬性服務,它可能是一個挑剔的問題,儘可能使用電子表格本身來存儲「全局」值。屬性和緩存的大小也受到限制,並且緩存過期。 –