Les variables globales du Script Google (feuille de calcul)
J'ai essayé d'obtenir certaines fonctions dans un Google apps script (à l'intérieur d'une feuille de calcul) pour modifier une variable globale, mais je n'arrive pas à le comprendre.
Fondamentalement, je veux déclarer une variable (dans ce cas "globalTestVar"), et à chaque fois que l'une des deux fonctions (globalVarTestFunctionOne et deux) lance cette variable incrémentée de un.
Le problème est que la variable est déclarée à nouveau chaque fois qu'un bouton est pressé, même si le if(typeof(globalTestVar) == 'undefined')-la déclaration doit prendre soin de cela.
Je suis habitué à l'Objective-C et Java où je peux déclarer mes variables au début, et de modifier ces variables n'importe où dans le code.
Je suis désolé si c'est une question de base, mais j'ai cherché sur google pendant des heures et je ne peux pas le faire fonctionner.
Voici le code:
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);
}
De sortie:
- outside3
- de déclarer une variable globale
- outside3
- de déclarer une variable globale
- globalVarTestFunctionOne
- Valeur de globalTestVar: 1
- outside3
- de déclarer une variable globale
- globalVarTestFunctionTwo
- Valeur de globalTestVar: 1
J'ai écrit ma propre fonction "logstuff" pour imprimer les messages, car je n'aime pas le construit dans l'Enregistreur.journal-fonction.
Merci!
OriginalL'auteur Eric | 2013-06-29
Vous devez vous connecter pour publier un commentaire.
Vous n'aimez pas ceci: les variables globales de GAZ sont statiques - vous ne pouvez pas les mettre à jour et à les conserver leurs valeurs. Moi aussi, j'ai googlé ce pendant des heures.
Vous pouvez utiliser
CacheService
ouScriptDB
possible de stockage pour ce genre de problème.CacheService
est rapide et facile à utiliser, mais limitée, car l'expiration du cache par la suite. Je n'ai pas essayé ScriptDBJ'ai utilisé
CacheService
de faire ce dont j'avais besoin, mais c'était un stockage à court terme pour l'amélioration de la performance. Vous pourriez trouverScriptDB
est mieux, mais je n'ai pas essayé.Oui, cacheService fonctionne bien pour les chaînes et les nombres, mais est-il possible de stocker des tableaux avec cacheService?
Pas - vous ne pouvez pas stocker des tableaux dans le cache, et pour le pire:
JSON.stringify()
ne semble pas renvoyer une chaîne JSON, et de ne pas signaler une erreur. Vous pouvez stocker des tableaux dans ScriptDB, cependant. Si c'est mieux que de les stocker sous forme de fourchettes dans une Feuille dépendra de ce que vous faites avec eux.Les gars, ce n'est pas tout à fait ce qui se passe. Globals ne sont pas statique, ils sont global, qui se réfère à leur portée. Dans un contexte d'exécution, une variable globale est disponible pour tous les blocs de code. Lorsque vous appuyez sur un bouton dans un script côté client (UiApp, HtmlService), un côté serveur contexte est créé pour exécuter le gestionnaire approprié - et ce nouveau contexte a un unique "global" des variables. Strictement parlant, la variable n'est pas "redéclarée", et la comparaison à "undefined" signifie seulement qu'il n'a pas de valeur assignée dans ce contexte.
OriginalL'auteur
PropertiesService -> Propriétés
Actuellement (2015), je pense que le chemin à parcourir est l'utilisation de la classe PropertiesService et le type de retour Propriétés.
Sur la portée globale de
Si je comprends bien, chaque nouvelle invokation d'une fonction de script (temps déclencheurs, l'utilisateur a cliqué sur un élément du menu, appuyé sur un bouton, etc), conduira à une nouvelle pleine d'analyser le script sans la mémoire des précédentes exécutions, à moins qu'ils ont persisté en quelque sorte (dans une plage de feuille de calcul ou à l'aide de
Properties
par exemple).OriginalL'auteur consideRatio