web-dev-qa-db-fra.com

Comment définir une variable globale dans le script Google Apps

Je vois que la plupart des exemples de Google utilisent des fonctions uniquement dans un seul script géant. 

par exemple. https://developers.google.com/apps-script/quickstart/macros

Mais dans notre style, nous écrivons généralement toutes les fonctions sous un seul espace de noms, tel que

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

Cependant, lorsque je lance le code ci-dessus, il retourne

"MyCompany is not defined."

Comment résoudre?

28
Ryan

Dans GAS, les variables globales ne sont pas ce qu'elles sont dans d'autres langues. Ce ne sont ni des constantes ni des variables disponibles dans toutes les routines.

Je pensais pouvoir utiliser des variables globales pour assurer la cohérence entre les fonctions et l'efficacité. Mais je me suis trompé, comme l'ont souligné certaines personnes ici à SO.

La variable globale sera évaluée à chaque exécution d'un script, donc pas une fois à chaque fois que vous exécutez votre application.
Les variables globales PEUVENT être modifiées dans un script (elles ne sont donc pas des constantes qui ne peuvent pas être modifiées par accident), mais seront réinitialisées lorsqu'un autre script sera appelé.
Il y a aussi une pénalité de vitesse sur l'utilisation de variables globales. Si, dans une fonction, vous utilisez plusieurs fois la même variable globale, il sera plus rapide d'affecter une variable locale et de l'utiliser à la place. 

Si vous souhaitez conserver les variables entre toutes les fonctions de votre application, il sera peut-être préférable d'utiliser cacheService. J'ai découvert que la lecture en boucle de tous les fichiers et dossiers d'un lecteur prend BEAUCOUP de temps. Mais vous pouvez stocker des informations sur les fichiers et les dossiers dans le cache (ou même les propriétés) et accélérer au moins 100 fois.

J'utilise désormais uniquement des variables globales pour certains préfixes et pour nommer des widgets.

3
SoftwareTester

Les variables globales existent certes dans GAS, mais vous devez comprendre la relation client/serveur de l'environnement pour pouvoir les utiliser correctement. Consultez la question suivante: Les variables globales dans Google Script (tableur)

Cependant, ce n'est pas le problème avec votre code; la documentation indique que la fonction à exécuter par le menu doit être fournie à la méthode sous forme de chaîne; vous fournissez maintenant le résultat de la fonction: https://developers.google.com/apps- script/référence/feuille de calcul/feuille de calcul # addMenu% 28Chaîne, objet% 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
Tim

J'utilise ceci: si vous déclarez var x = 0; avant les déclarations de fonctions, la variable fonctionne pour tous les fichiers de code, mais elle sera déclarée chaque fois que vous modifiez une cellule dans la feuille de calcul