2013-06-29 18 views
9

Ho cercato di ottenere alcune funzioni in uno script di app Google (all'interno di un foglio di calcolo) per modificare una variabile globale, ma non riesco a capirlo.Variabili globali in Google Script (foglio di calcolo)

Fondamentalmente voglio dichiarare una variabile (in questo caso "globalTestVar"), e ogni volta che una delle due funzioni (globalVarTestFunctionOne e due) lancia questa variabile dovrebbe aumentare di uno.

Il problema è che la variabile viene nuovamente dichiarata ogni volta che si preme un pulsante, anche se l'istruzione if (typeof (globalTestVar) == 'undefined') - dovrebbe occuparsene.

Sono abituato all'Obiettivo C e Java dove posso dichiarare le mie variabili all'inizio e modificare queste variabili ovunque nel codice.

Mi dispiace se questa è una domanda di base, ma sono stato googling per ore e non riesco a farlo funzionare.

Ecco il codice:

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); 
} 

uscita:

  • outside3
  • dichiarando variabile globale
  • outside3
  • dichiarando variabile globale
  • globalVarTestFunctionOne
  • Valore della globalTestVar: 1
  • outside3
  • dichiarando variabile globale
  • globalVarTestFunctionTwo
  • Valore della globalTestVar: 1

ho scritto la mia funzione "logstuff" per stampare i messaggi perché non mi piace la funzione Logger.log integrata.

Grazie!

risposta

8

Non ti piace questo: le variabili globali in GAS sono statiche: non puoi aggiornarle e aspettarti che mantengano i loro valori. Anch'io ho cercato su Google per ore.

È possibile utilizzare CacheService o ScriptDB come possibile spazio per questo tipo di problema. CacheService è veloce e facile da usare, ma limitato perché la cache scadrà alla fine. Non ho provato ScriptDB

+0

Beh, è ​​inquietante. Deve esserci un modo per usare una sorta di variabili globali. Ho pensato a una soluzione e ho usato un foglio "Variabili" per salvare/modificare e ottenere variabili globali. Ma non è molto elegante, né efficiente. – Eric

+0

Ho usato 'CacheService' per fare ciò di cui avevo bisogno, ma quello era lo storage a breve termine per il miglioramento delle prestazioni. Potresti trovare che 'ScriptDB' è migliore, ma non l'ho provato. –

+0

Sì, cacheService funziona bene per stringhe e numeri, ma è possibile archiviare gli array con cacheService? – Eric

6

PropertiesService -> Proprietà

Attualmente (2015), credo che la strada da percorrere è utilizzando la classe PropertiesService e il tipo di ritorno Properties.

circa la portata globale

Da quanto ho capito, ogni nuova invocazione di una funzione di script (tempo di trigger, l'utente fa clic su una voce di menu, premuto un pulsante, ecc), porterà ad una nuova parse completa del script senza memoria delle precedenti esecuzioni a meno che non fossero persistenti in qualche modo (in un intervallo di fogli di calcolo o usando Properties per esempio).

Problemi correlati