2014-07-13 24 views
18

Vedo la maggior parte degli esempi di Google è che usano solo le funzioni in un unico script gigante.Come definire la variabile globale in Google Apps Script

ad es. https://developers.google.com/apps-script/quickstart/macros

Ma nel nostro stile, scriviamo solitamente tutte le funzioni sotto un unico spazio dei nomi, come ad esempio

MyCompany = (MyCompany || {}); 
MyCompany.init = function() { 
    Logger.log('init'); 
}; 

function onOpen() { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var menus = [{ 
     name: "Init", 
     functionName: MyCompany.init 
    }]; 
    spreadsheet.addMenu("Test", menus); 
}; 

Tuttavia, quando si esegue il codice di cui sopra, è tornare

"MyCompany is not defined." 

Come risolvere ?

+2

hai provato a usare 'var':' var MyCompany = (MyCompany || {}); ' –

+0

Google apps Script è il lato server di Javascript (forse sapete questo). Anche lo script di google apps "resetta" dopo ogni chiamata al server, quindi le modifiche alle variabili vengono scartate. – eddyparkinson

risposta

3

Nelle variabili globali GAS non sono ciò che sono in altre lingue. Non sono costanti né variabili disponibili in tutte le routine.

Ho pensato che avrei potuto utilizzare variabili globali per coerenza anche tra funzioni ed efficienza. Ma ho sbagliato, come sottolineato da alcune persone qui in SO.

La variabile globale verrà valutata ad ogni esecuzione di uno script, quindi non solo una volta ogni volta che si esegue l'applicazione.
Le variabili globali POSSONO essere modificate in uno script (quindi non sono costanti che non possono essere modificate per errore), ma verranno reinizializzate quando verrà richiamato un altro script.
C'è anche una penalità di velocità sull'uso delle variabili globali. Se all'interno di una funzione si utilizza la stessa variabile globale due o più volte, sarà più veloce assegnare una variabile locale e utilizzarla al suo posto.

Se si desidera conservare le variabili tra tutte le funzioni nell'applicazione, potrebbe essere utile utilizzare una cacheService. Ho scoperto che il ciclo di tutti i file e le cartelle su un'unità richiede molto tempo. Ma puoi memorizzare informazioni su file e cartelle all'interno della cache (o anche proprietà) e accelerare almeno 100 volte.

L'unico modo in cui utilizzo le variabili globali ora è per alcuni prefissi e per assegnare nomi ai widget.

+0

Dubito che le prestazioni siano influenzate quando si utilizza un ambiente globale o locale. Per favore dettagli –

+0

Mi riferisco alla risposta e alla discussione di Serge Insas http://stackoverflow.com/questions/24326524/addtimer-not-working-with-global-app-in-gas Ho anche visto un'altra discussione su SO per quanto riguarda local vs variabili globali. Ma non l'ho trovato ora – SoftwareTester

+0

Ok, capisco. Notare che il risultato della performance sarebbe dato dal codice chiamante per inizializzare la variabile e non dal fatto che è globale o locale. –

43

Potrebbe essere meglio utilizzare il servizio Proprietà poiché è possibile utilizzarli come una sorta di variabile globale persistente.

click 'File> Proprietà del progetto> Proprietà progetto' per impostare un valore chiave, oppure è possibile utilizzare

PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue'); 

I dati possono essere recuperati con

variabili

var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');

+1

La tua risposta ha funzionato perfettamente per me. Ho usato "File> Proprietà progetto> Proprietà script". Ho quindi aggiunto una "Proprietà" e un "Valore" e poi ho usato il tuo codice "recuperato con". Molto bella! –

1

globali certamente fare esiste in GAS, ma è necessario comprendere la relazione client/server dell'ambiente per poterli utilizzare correttamente. Vedere questa domanda: Global variables in Google Script (spreadsheet)

Tuttavia questo non è il problema con il tuo codice; la documentazione indica che la funzione deve essere eseguito dal menu deve essere fornita al metodo come una stringa, in questo momento si sta fornendo l'output della funzione: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#addMenu%28String,Object%29

function MainMenu_Init() { 
    Logger.log('init'); 
}; 

function onOpen() { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var menus = [{ 
     name: "Init", 
     functionName: "MainMenu_Init" 
    }]; 
    spreadsheet.addMenu("Test", menus); 
}; 
-1

sto usando una soluzione con il ritorno una funzione con un oggetto delle mie variabili globali:

function globalVariables(){ 
    sheetName: 'Sheet1',  
    variable1: 1, 
    varibale2: 2 
} 

function functionThatUsesVariable(){ 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName); 
} 
+0

Per farlo funzionare dovrebbe essere: 'function globalVariables() {var variables = {sheetName: 'Sheet1', variabile1: 1, variable2: 2}; restituire variabili; } ' –