wake-up-neo.net

Zeitlimit für Google-App-Skript ~ 5 Minuten?

Mein Google-App-Skript durchläuft die Google-Laufwerksdateien des Benutzers und kopiert und verschiebt Dateien manchmal in andere Ordner. Das Skript wird immer nach 5 Minuten ohne Fehlermeldung im Protokoll angehalten. 

Ich sortiere zehn oder manchmal tausende Dateien in einem Durchlauf.

Gibt es Einstellungen oder Problemumgehungen?

23
Martin V.

Quoten

Die maximale Ausführungszeit für ein einzelnes Skript beträgt 6 Minuten/Ausführung
- https://developers.google.com/apps-script/guides/services/quotas

Es gibt jedoch andere Einschränkungen, mit denen Sie sich vertraut machen sollten. Zum Beispiel ist nur eine Gesamtauslöserlaufzeit von 1 Stunde/Tag zulässig, sodass Sie eine lange Funktion nicht einfach in 12 verschiedene 5-Minuten-Blöcke aufteilen können.

Optimierung

Allerdings gibt es nur wenige Gründe, warum Sie wirklich sechs Minuten für die Ausführung benötigen würden. JavaScript sollte kein Problem damit haben, Tausende von Datenzeilen in wenigen Sekunden zu sortieren. Was Ihre Leistung wahrscheinlich beeinträchtigt, sind Serviceanrufe an Google Apps.

Sie können Skripts schreiben, um die integrierte Zwischenspeicherung optimal zu nutzen, indem Sie die Anzahl der Lese- und Schreibvorgänge minimieren. Abwechselnde Lese- und Schreibbefehle sind langsam. Um ein Skript zu beschleunigen, lesen Sie alle Daten mit einem Befehl in ein Array, führen Sie die Daten im Array aus und schreiben Sie die Daten mit einem Befehl aus.
- https://developers.google.com/apps-script/best_practices

Batching

Das Beste, was Sie tun können, ist die Anzahl der Serviceanrufe zu reduzieren. Google ermöglicht dies, indem Batchversionen der meisten API-Aufrufe zugelassen werden. 

Als triviales Beispiel Statt dessen:

for (var i = 1; i <= 100; i++) {
  SpreadsheetApp.getActiveSheet().deleteRow(i);
}

Mach das:

SpreadsheetApp.getActiveSheet().deleteRows(i, 100);

In der ersten Schleife benötigten Sie nicht nur 100 Aufrufe von deleteRow auf dem Arbeitsblatt, sondern Sie mussten auch das aktive Arbeitsblatt 100 Mal abrufen. Die zweite Variante sollte mehrere Größenordnungen besser als die erste sein.

Verflechten von Lesen und Schreiben

Außerdem sollten Sie sehr sorgfältig darauf achten, nicht häufig zwischen Lesen und Schreiben hin und her zu wechseln. Sie verlieren nicht nur potenzielle Gewinne beim Batch-Betrieb, sondern können die integrierte Zwischenspeicherung von Google nicht verwenden.

Bei jedem Lesevorgang müssen Sie den Schreibcache zuerst leeren (Commit), um sicherzustellen, dass Sie die neuesten Daten lesen (Sie können das Schreiben des Caches durch Aufruf von SpreadsheetApp.flush() erzwingen). Ebenso müssen wir den Lese-Cache jedes Mal, wenn Sie schreiben, wegwerfen, da er nicht mehr gültig ist. Wenn Sie also das Verschachteln von Lese- und Schreibvorgängen vermeiden können, können Sie den Cache voll nutzen.
- http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html

Zum Beispiel anstelle von:

sheet.getRange("A1").setValue(1);
sheet.getRange("B1").setValue(2);
sheet.getRange("C1").setValue(3);
sheet.getRange("D1").setValue(4);

Mach das:

sheet.getRange("A1:D1").setValues([[1,2,3,4]]);

Verketten von Funktionsaufrufen

Als letztes Mittel können Sie, wenn Ihre Funktion wirklich nicht in weniger als sechs Minuten beendet werden kann, Anrufe verketten oder Ihre Funktion unterbrechen, um ein kleineres Datensegment zu bearbeiten. 

Sie können Daten in den Cache Service (temporär) oder Eigenschaften Service (permanent) Buckets speichern, um sie über mehrere Ausführungen hinweg abzurufen (da Google Apps Scripts eine zustandslose Ausführung hat).

Wenn Sie ein anderes Ereignis starten möchten, können Sie mit der Trigger Builder-Klasse einen eigenen Trigger erstellen oder einen wiederkehrenden Trigger auf einer engen Zeittabelle einrichten.

41
KyleMit

Finden Sie heraus, wie Sie Ihre Arbeit aufteilen können. Das dauert weniger als 6 Minuten, da dies die Grenze für jedes Skript ist. Beim ersten Durchlauf können Sie die Liste der Dateien und Ordner in einer Tabelle durchlaufen und speichern und einen zeitgesteuerten Auslöser für Teil 2 hinzufügen.

Löschen Sie in Teil 2 jeden Eintrag in der Liste, während Sie ihn bearbeiten. Wenn sich keine Elemente in der Liste befinden, löschen Sie den Auslöser.

So verarbeite ich ein Blatt mit etwa 1500 Zeilen, das sich auf etwa ein Dutzend verschiedene Tabellenkalkulationen erstreckt. Aufgrund der Anzahl der Aufrufe von Tabellenkalkulationen tritt eine Zeitüberschreitung auf, die jedoch fortgesetzt wird, wenn der Trigger erneut läuft.

10
Fred

Ich habe eine Google Apps Script-Bibliothek entwickelt, die UserProperties und programmatische Trigger zum Ausführen eines Stapels verwendet, der über 6 Minuten hinausgeht. Sie können diese Bibliothek in Ihr GAS-Projekt importieren und Ihren Code mit der API umschließen, sodass FOREVER ausgeführt werden kann (nicht wirklich, wir sind durch Quota begrenzt, die sich auf die Anzahl der Stunden bezieht, die Trigger ausführen können.)

Sie können alles darüber erfahren: http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html

2
patt0

Wenn Sie G Suite als Business-, Enterprise- oder EDU-Kunde verwenden, wird die Ausführungszeit für die Ausführung von Skripts auf Folgendes festgelegt: 

30 min/Ausführung

Siehe: https://developers.google.com/apps-script/guides/services/quotas

0
ScottMcC

Wenn Sie ein Geschäftskunde sind, können Sie sich jetzt für Early Access to App Maker anmelden, darunter Flexible Quotas .

Im Rahmen des flexiblen Quotensystems werden solche harten Kontingentgrenzen aufgehoben. Skripts werden nicht angehalten, wenn sie eine Kontingentgrenze erreichen. Sie werden vielmehr verzögert, bis die Quote verfügbar wird. Zu diesem Zeitpunkt wird die Skriptausführung fortgesetzt. Sobald die Quoten verwendet werden, werden sie regelmäßig wieder aufgefüllt. Für eine vernünftige Verwendung sind Skriptverzögerungen selten.

0
browly