2013-06-29 82 views
9

我一直在嘗試在谷歌應用程序腳本(電子表格內)中修改一個全局變量,但我似乎無法弄清楚它的一些功能。谷歌腳本(電子表格)中的全局變量

基本上我想聲明一個變量(在本例中爲「globalTestVar」),並且每次兩個函數(globalVarTestFunctionOne和two)中的一個啓動時,此變量應該遞增1。

問題是,即使if(typeof(globalTestVar)=='undefined') - 語句應該處理該問題,每次按下按鈕時都會再次聲明該變量。

我習慣於Objective C和Java,我可以在開頭聲明我的變量,並在代碼的任何地方修改這些變量。

對不起,如果這是一個基本的問題,但我一直在谷歌搜索幾個小時,我只是不能得到它的工作。

下面是代碼:

logstuff("outside"); 


function logstuff(logInput){ 
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); 
var lastRow = sheet.getLastRow() + 1; 
sheet.getRange("A"+lastRow).setValue(logInput); 
return; 
} 


if (typeof(globalTestVar) == 'undefined') { 
logstuff('declaring global variable'); 
globalTestVar = 0; 

} else { 
logstuff('global variable has been declared'); 
} 



function globalVarTestUIFunction() { 
var app = UiApp.createApplication().setTitle('Test UI'); 
var doc = SpreadsheetApp.getActive(); 
var formPanel = app.createVerticalPanel(); 


var buttonF1 = app.createButton('F1'); 
var buttonbuttonF1ClickHandler = app.createServerClickHandler("globalVarTestFunctionOne"); 
buttonF1.addClickHandler(buttonbuttonF1ClickHandler); 
buttonbuttonF1ClickHandler.addCallbackElement(formPanel); 

var buttonF2 = app.createButton('F2'); 
var buttonbuttonF2ClickHandler = app.createServerClickHandler("globalVarTestFunctionTwo"); 
buttonF2.addClickHandler(buttonbuttonF2ClickHandler); 
buttonbuttonF2ClickHandler.addCallbackElement(formPanel); 


app.add(formPanel); 

formPanel.add(buttonF1); 
formPanel.add(buttonF2); 


doc.show(app); 

return app; 
} 



function globalVarTestFunctionOne() { 
logstuff('globalVarTestFunctionOne'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

function globalVarTestFunctionTwo() { 
logstuff('globalVarTestFunctionTwo'); 
globalTestVar++; 
logstuff('Value of globalTestVar: ' + globalTestVar); 
} 

輸出:

  • outside3
  • 聲明全局變量
  • outside3
  • 聲明全局變量
  • globalVarTestFunctionOne
  • 價值globalTestVar的:1
  • outside3
  • 聲明全局變量
  • globalVarTestFunctionTwo
  • globalTestVar的價值:1

我寫我自己的函數 「logstuff」 打印出來的消息因爲我不喜歡內置的Logger.log函數。

謝謝!

回答

8

你不會喜歡這樣:GAS中的全局變量是靜態的 - 你不能更新它們,並期望它們保留它們的值。我也一起搜索了好幾個小時。

您可以使用CacheServiceScriptDB作爲此類問題的可能存儲。 CacheService快速且易於使用,但受限制,因爲緩存將最終過期。我還沒有嘗試過的ScriptDb

+0

嗯,這很令人不安。必須有一種方法來使用某種全局變量。我想到了一個解決方法,並使用「變量」表單來保存/修改並獲取全局變量。但這不是很優雅,也不是很有效率。 – Eric

+0

我使用'CacheService'來做我所需要的,但這是短期存儲以提高性能。你可能會發現'ScriptDB'更好,但我沒有嘗試過。 – 2013-06-29 00:28:11

+0

是的,cacheService適用於字符串和數字,但可以使用cacheService存儲數組嗎? – Eric

6

PropertiesService - >屬性

目前(2015年),我覺得去使用類PropertiesService和返回類型Properties的方式。

關於在全球範圍內

據我瞭解,一個腳本函數的每一個新invokation(時間觸發器,用戶點擊菜單項,按下按鈕等),將會導致的一個新的全解析腳本沒有先前執行的記憶,除非它們以某種方式持續存在(例如在電子表格範圍內或使用Properties)。

相關問題