In diesem Dokument finden Sie Best Practices zur Verbesserung der Scriptleistung.
Aufrufe anderer Dienste minimieren
Die Verwendung von JavaScript-Vorgängen in Ihrem Script ist schneller als der Aufruf anderer Dienste. Alles, was Sie in Google Apps Script selbst erledigen, geht schneller, als wenn Sie Daten von den Google-Servern oder einem externen Server abrufen, z. B. Anfragen an Sheets, Docs, Sites, Translate und UrlFetch. Ihre Skripts werden schneller ausgeführt, wenn Sie die Anzahl der Dienstaufrufe minimieren.
Zusammenarbeit mit geteilten Ablagen
Wenn Sie mit anderen Entwicklern an einem Scriptprojekt arbeiten, arbeiten Sie über geteilte Ablagen zusammen. Dateien in einer geteilten Ablage gehören der Gruppe und nicht einzelnen Personen. Das erleichtert die Projektentwicklung und -wartung.
Batchvorgänge verwenden
Mit Skripts werden in der Regel Daten aus einer Tabelle gelesen, Berechnungen durchgeführt und Ergebnisse zurückgeschrieben. Apps Script verwendet integrierte Optimierungen wie Look-Ahead und Write-Caching.
Maximieren Sie das integrierte Caching, indem Sie Lese- und Schreibvorgänge minimieren. Das abwechselnde Ausführen von Lese- und Schreibbefehlen ist langsam. Um ein Script zu beschleunigen, lesen Sie alle Daten mit einem Befehl in ein Array ein, führen Sie Vorgänge für die Arraydaten aus und schreiben Sie die Daten mit einem Befehl aus.
Vermeiden Sie abwechselnde Lese- und Schreibvorgänge wie in diesem ineffizienten Beispiel:
// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
xcoord = xmin;
for (var x = 0; x < 100; x++) {
var c = getColorFromCoordinates(xcoord, ycoord);
cell.offset(y, x).setBackgroundColor(c);
xcoord += xincrement;
}
ycoord -= yincrement;
SpreadsheetApp.flush();
}
Das Skript ist ineffizient,da es 10.000 Zellen mit aufeinanderfolgenden Schreibvorgängen durchläuft. Der Write-Back-Cache ist zwar hilfreich, aber das Zusammenfassen von Aufrufen in Batches ist viel effizienter:
// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
xcoord = xmin;
colors[y] = new Array(100);
for (var x = 0; x < 100; x++) {
colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
xcoord += xincrement;
}
ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);
Die Ausführung des ineffizienten Codes dauert etwa 70 Sekunden, während der effiziente Code in nur einer Sekunde ausgeführt wird.
Bibliotheken in UI-lastigen Skripts vermeiden
Bibliotheken sind praktisch, um Code wiederzuverwenden, erhöhen aber die Startzeit des Skripts. Diese Verzögerung ist in clientseitigen HTML Service-Benutzeroberflächen zu beobachten, die wiederholte, kurz laufende google.script.run-Aufrufe ausführen. Verwenden Sie Bibliotheken sparsam in Add-ons und vermeiden Sie sie in Skripts, die viele google.script.run-Aufrufe ausführen.
Cache-Dienst verwenden
Mit dem Cache-Dienst können Sie Ressourcen zwischen Scriptausführungen im Cache speichern. Durch das Caching wird die Häufigkeit des Datenabrufs reduziert. Im folgenden Beispiel wird gezeigt, wie Sie den Cache-Dienst verwenden, um den Zugriff auf einen langsamen RSS-Feed zu beschleunigen.
function getRssFeed() {
var cache = CacheService.getScriptCache();
var cached = cache.get("rss-feed-contents");
if (cached != null) {
return cached;
}
// This fetch takes 20 seconds:
var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
var contents = result.getContentText();
cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
return contents;
}
Wenn sich das Element nicht im Cache befindet, müssen Sie weiterhin 20 Sekunden warten. Bei nachfolgenden Zugriffen ist die Wartezeit jedoch kurz, bis das Element abläuft.
Umfangreiche Datasets und komplexe Berechnungen
Google Sheets ist ein leistungsstarkes Tool. Wenn Datasets jedoch größer werden und Berechnungen komplexer werden, können Leistungsprobleme wie Tabellenkalkulationsverzögerungen, IMPORTRANGE-Fehler und Script-Timeouts auftreten.
Wann sollte eine Datenbank verwendet werden?
Wenn Ihre Tabelle sich dem Limit von 10 Millionen Zellen nähert oder Sie viele verknüpfte Formulare (z.B. 10 oder mehr) und komplexe tabellenübergreifende Formeln haben, sollten Sie eine spezielle Datenbanklösung in Betracht ziehen.
- Google Cloud SQL: Ein vollständig verwalteter Dienst für relationale Datenbanken für MySQL, PostgreSQL und SQL Server. Verwenden Sie den JDBC-Dienst, um eine Verbindung zu Cloud SQL oder anderen externen Datenbanken wie Oracle oder MongoDB (über entsprechende Bridges) herzustellen.
- BigQuery: Ein serverloses, hoch skalierbares Data Warehouse. Mit verbundenen Tabellenblättern können Sie umfangreiche BigQuery-Datasets direkt in Google Sheets analysieren. Mit dem BigQuery-Dienst können Sie über Apps Script mit Daten interagieren.
Formelleistung optimieren
Die intensive Verwendung bestimmter Formeln kann die Leistung Ihrer Tabelle beeinträchtigen:
- ARRAYFORMULA: Diese Funktion ist zwar nützlich, aber
ARRAYFORMULA-Berechnungen im großen Maßstab können teuer sein. - SVERWEIS und BEREICH.VERSCHIEBEN: Diese Funktionen können bei großen Datasets langsam sein. Verwenden Sie
INDEXundMATCHoder Apps Script, um Suchvorgänge im Speicher effizienter auszuführen. - IMPORTRANGE: Die häufige Verwendung von
IMPORTRANGEin vielen Tabellenblättern kann zu „Internen Fehlern“ führen, wenn die Quelltabellenblätter groß sind oder stark ausgelastet werden. Das Zusammenführen von Daten in einer zentralen Quelle kann helfen.
Umgang mit Zeitlimits für Scripts
Für Apps Script gelten Ausführungszeitlimits (in der Regel 6 Minuten pro Ausführung oder 30 Minuten für einige Google Workspace-Konten). Wenn Ihr Skript häufig abstürzt, weil das Ausführungslimit überschritten wird, haben Sie folgende Möglichkeiten:
- Batchvorgänge verwenden: Wie im Abschnitt Batchvorgänge verwenden beschrieben, sollten Sie die Anzahl der Aufrufe von Tabellen und anderen Diensten minimieren.
- Aufgaben aufteilen: Teilen Sie große Aufgaben in kleinere Aufgaben auf, die jeweils innerhalb des Zeitlimits abgeschlossen werden können.
- Trigger für Fortsetzungen verwenden: Richten Sie einen installierbaren zeitgesteuerten Trigger ein, um einen lang laufenden Prozess fortzusetzen. Ihr Skript kann seinen aktuellen Status (z.B. den Index der zuletzt verarbeiteten Zeile) mit dem Properties-Dienst speichern und bei der nächsten Ausführung an dieser Stelle fortfahren.