google-apps-script apps - Google App-Skript-Timeout ~ 5 Minuten?





array for (5)


Finden Sie heraus, wie Sie Ihre Arbeit aufteilen können, so dass es weniger als 6 Minuten dauert, da dies das Limit für jedes Skript ist. Im ersten Durchgang können Sie die Liste der Dateien und Ordner in einer Tabelle durchlaufen und speichern und einen zeitgesteuerten Trigger für Teil 2 hinzufügen.

Löschen Sie in Teil 2 jeden Eintrag in der Liste, während Sie ihn bearbeiten. Wenn keine Elemente in der Liste vorhanden sind, löschen Sie den Trigger.

So verarbeite ich ein Blatt mit etwa 1500 Zeilen, das auf ungefähr ein Dutzend verschiedener Tabellen verteilt wird. Aufgrund der Anzahl der Aufrufe von Tabellenkalkulationen wird das Zeitlimit überschritten, aber es wird fortgesetzt, wenn der Trigger erneut ausgeführt wird.

Mein Google App-Skript iteriert durch die Google Drive-Dateien des Nutzers und kopiert und überträgt manchmal Dateien in andere Ordner. Das Skript wird immer nach 5 Minuten ohne Fehlermeldung im Protokoll gestoppt.

Ich sortiere zehn oder manchmal tausende Dateien in einem Lauf.

Gibt es irgendwelche Einstellungen oder Workarounds?




Wenn Sie ein Geschäftskunde sind, können Sie sich jetzt für den Early Access für App Maker anmelden, der flexible Kontingente enthält .

Im Rahmen des flexiblen Quotensystems werden solche harten Kontingentgrenzen entfernt. Skripts stoppen nicht, wenn sie eine Kontingentgrenze erreichen. Vielmehr werden sie verzögert, bis die Quote verfügbar wird, und zu diesem Zeitpunkt wird die Skriptausführung fortgesetzt. Sobald Kontingente verwendet werden, werden sie regelmäßig aufgefüllt. Skriptverzögerungen sind für eine vernünftige Nutzung selten.




Kontingente

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

Aber es gibt andere Einschränkungen, mit denen Sie sich vertraut machen müssen. Zum Beispiel ist Ihnen nur eine Gesamtauslöserlaufzeit von 1 Stunde / Tag erlaubt, so dass Sie nicht einfach eine lange Funktion in 12 verschiedene 5-Minuten-Blöcke aufteilen können.

Optimierung

Das heißt, es gibt nur wenige Gründe, warum Sie wirklich sechs Minuten brauchen, um sie auszuführen. JavaScript sollte kein Problem haben, Tausende von Datenzeilen in wenigen Sekunden zu sortieren. Ihre Leistung wird wahrscheinlich durch Serviceanrufe an Google Apps beeinträchtigt.

Sie können Skripts schreiben, um das integrierte Caching 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 ein, führen alle Operationen an den Daten im Array aus und schreiben die Daten mit einem Befehl aus.
- https://developers.google.com/apps-script/best_practices

Chargen

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

Als triviales Beispiel: Stattdessen :

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

Mach das :

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

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

Interweaving liest und schreibt

Außerdem sollten Sie darauf achten, nicht häufig zwischen Lesen und Schreiben hin und her zu gehen. Sie werden nicht nur potenzielle Gewinne bei Batch-Operationen verlieren, sondern Google wird auch nicht in der Lage sein, das integrierte Caching zu verwenden.

Jedes Mal, wenn Sie einen Lesevorgang durchführen, müssen Sie zuerst den Schreibcache leeren (Commit), um sicherzustellen, dass Sie die neuesten Daten lesen (Sie können ein Schreiben des Caches durch Aufrufen von SpreadsheetApp.flush() erzwingen). Jedes Mal, wenn Sie einen Schreibvorgang durchführen, müssen Sie den Lesecache 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 statt :

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

Verkettung von Funktionsaufrufen

Als letzte Möglichkeit, wenn Ihre Funktion in weniger als sechs Minuten nicht fertig ist, können Sie Anrufe verketten oder Ihre Funktion aufteilen, um an einem kleineren Datensegment zu arbeiten.

Sie können Daten in den Buckets Cache-Service (temporär) oder Properties-Service (permanent) speichern, um sie über verschiedene Ausführungen abzurufen (da Google Apps Scripts eine statusfreie 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 für einen engen Zeitplan einrichten.




Ich habe eine Google Apps Script-Bibliothek entwickelt, die UserProperties und programmgesteuerte Trigger verwendet, um einen Batch auszuführen, der länger als 6 Minuten dauert. Sie können diese Bibliothek in Ihr GAS-Projekt importieren und Ihren Code mit der API einbinden, so dass er FOREVER ausführen kann (also nicht wirklich, wir sind durch Quoten eingeschränkt, die sich auf die Anzahl der Stunden beziehen, die Trigger auslösen können).

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




Ich nehme an, dass Sie nur daran interessiert sind, eine eindeutige ID programmatisch zuzuweisen, bevor der Benutzer Ihr Formular ausfüllt.

Nein, Google Forms bietet weiterhin keine direkte Unterstützung für versteckte Felder, wie Sie sie in HTML-Formularen haben. Ihre einzige Option scheint die benutzerdefinierte Styling- Route zu sein, die Ihnen bereits bekannt ist.

Hier sind zwei vielversprechende Ideen, die einfach nicht funktionieren ...

  1. Füllen Sie eine gelöschte Frage aus. Wenn Sie eine Frage aus einem Formular löschen, verbleibt sie in der Antwort-Tabelle. Leider unterdrückt Forms die Werte für gelöschte Fragen, die in vorgefüllten URLs angezeigt werden. Andernfalls könnten Sie Ihre eindeutige ID so in die Einreichung übernehmen. (Ich dachte, das wäre ein cleverer Work-Around, war aber enttäuscht, dass es nicht funktioniert hat.)

  2. Füllen Sie eine Frage auf einer übersprungenen Seite 1 aus . Sie können eine Frage auf einer zweiten Seite einrichten, die vom Live-Formular übersprungen wird, und Sie können auch eine vorgefüllte URL für diese Frage generieren. So weit, so gut - aber wenn der Benutzer nicht wirklich zu dieser Seite navigiert, wird die vorgefüllte Antwort nicht übermittelt.

1 Danke an @AdamL, der diese Idee bei einer früheren Diskussion zu diesem Thema im alten Forum postuliert hat.





google-apps-script google-drive-sdk