[google-apps-script] So definieren Sie eine globale Variable in Google Apps Script


Answers

In GAS sind globale Variablen nicht das, was sie in anderen Sprachen sind. Sie sind weder Konstanten noch Variablen, die in allen Routinen verfügbar sind.

Ich dachte, ich könnte globale Variablen für die Konsistenz zwischen Funktionen und Effizienz verwenden. Aber ich habe mich geirrt, wie einige Leute hier bei SO gezeigt haben.

Die globale Variable wird bei jeder Ausführung eines Skripts ausgewertet, also nicht nur einmal bei der Ausführung Ihrer Anwendung.
Globale Variablen KÖNNEN in einem Skript geändert werden (sie sind also keine Konstanten, die nicht versehentlich geändert werden können), werden aber beim erneuten Aufruf eines anderen Skripts erneut initialisiert.
Es gibt auch eine Geschwindigkeitsstrafe bei der Verwendung von globalen Variablen. Wenn Sie innerhalb einer Funktion die gleiche globale Variable zwei- oder mehrmals verwenden, ist es schneller, eine lokale Variable zuzuweisen und diese stattdessen zu verwenden.

Wenn Sie Variablen zwischen allen Funktionen in Ihrer Anwendung beibehalten möchten, ist es möglicherweise am besten, einen Cache-Service zu verwenden. Ich fand heraus, dass das Durchlaufen aller Dateien und Ordner auf einem Laufwerk viel Zeit in Anspruch nimmt. Aber Sie können Informationen über Dateien und Ordner im Cache (oder sogar Eigenschaften) speichern und mindestens 100 Mal beschleunigen.

Die einzige Möglichkeit, jetzt globale Variablen zu verwenden, ist für einige Präfixe und Widgets zu benennen.

Question

Ich sehe die meisten Beispiele von Google, dass sie nur Funktionen in einem einzigen riesigen Skript verwenden.

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

Aber in unserem Stil schreiben wir normalerweise alle Funktionen unter einem einzigen Namespace, z.

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

Wenn ich jedoch den obigen Code ausführe,

"MyCompany is not defined."

Wie löst man?




Ich verwende eine Problemumgehung, indem ich eine Funktion mit einem Objekt meiner globalen Variablen zurückgebe:

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

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



Related