1

Mit Google Apps Script versuche ich eine globale Variable (zB ein Array) zu erstellen, die in mehreren Funktionen verwendet werden kann, aber ich kann die Antwort nirgends finden und ich brauche ich, damit mein Google Spreadsheet funktioniert.Global Variable Wert nicht in mehreren Funktionen verwendbar

Code:

var infoSheetArray = null; 

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Custom Menu') 
     .addItem('Fetch Info', 'grabInfo') 
     .addItem('Run Program', 'itemSetup') 
     .addToUi(); 
} 

function grabInfo() { 
    var infoSheet = SpreadsheetApp.openByUrl('....'); 
    infoSheetArray = infoSheet.getSheetValues(1, 1, infoSheet.getLastRow(), 10); 
}  
+0

Zeigen Sie uns Ihren Code, damit wir sehen können, warum das, was Sie versuchen, nicht funktioniert. – jfriend00

+0

ging voran und schrieb den Code. – mds93

+0

Haben Sie einen Fehler erhalten? –

Antwort

3

in Ihrem Code infoSheetArray ist eine Variable mit globalem Umfang, was bedeutet, dass sie von allen Code in Ihrem Programm zugänglich sind. Was nicht so offensichtlich ist, ist, dass Ihr Programm mehrmals & in verschiedenen "Maschinen" läuft, und deshalb kann es vorkommen, dass infoSheetArray zurückgesetzt wird.

Jede separate Ausführung eines Skripts erfolgt in einer neuen Ausführungsinstanz, und jede davon hat ihren eigenen Satz von "globals". In Ihrem Beispiel-Snippet, z. B. onOpen(), handelt es sich um eine automatische Triggerfunktion, die unabhängig aufgerufen wird, wenn das Arbeitsblatt im Webeditor geöffnet wird. Sie haben zwei andere Funktionen, grabInfo() und itemSetup() (nicht gezeigt), die unabhängig über Benutzermenüerweiterungen aufgerufen werden.

Wenn eine dieser drei Funktionen unabhängig aufgerufen wird, wird eine Ausführungsinstanz dafür erstellt, Ihr Programm wird geladen und die Ausführung beginnt. Alle globalen Anweisungen (z. B. var infoSheetArray = null;) werden zuerst ausgewertet, gefolgt von der spezifisch ausgelösten Funktion. Änderungen an globalen Variablen bleiben nur in der Ausführungsinstanz bestehen, in der die Änderung aufgetreten ist, und nur so lange, wie diese Instanz benötigt wird. Sobald die Funktion abgeschlossen ist, ist die Instanz weggeblasen. Wenn Sie Werte zwischen Ausführungsinstanzen beibehalten müssen, müssen Sie eine Speichermethode wie die Properties Service oder eine External Database verwenden.

+0

Hervorragende Erklärung. Google sollte dies auf der Startseite sehr betonen. Sie leiten JS-Neulinge in das CodeAcademy-JavaScript-Tutorial ein, das auf allgemeine Web-/clientseitige Anwendungen ausgerichtet ist und daher in Bezug auf das Problem irreführend ist. Es ist ein Stolperstein für viele Neulinge bei GAS. Ich würde dem ursprünglichen Fragesteller empfehlen, anstatt den Properties Service zu verwenden, der knifflig sein kann, versuchen Sie, die Tabelle selbst zu verwenden, um den "globalen" Wert zu speichern, wenn überhaupt möglich. Eigenschaften und der Cache sind ebenfalls in der Größe beschränkt und der Cache läuft ab. –