Apps Script best practices maken het verschil tussen een script dat traag is, sleutels lekt en niemand durft aan te raken, en een script dat snel, veilig en onderhoudbaar is. In dit artikel verzamel ik de belangrijkste richtlijnen rond prestaties, veiligheid en onderhoudbaarheid, zodat je scripts in productie betrouwbaar blijven draaien.
Prestaties: werk in batch
De grootste prestatiewinst zit in batchverwerking. Elke aanroep naar een Google-dienst (zoals getValue of setValue) gaat over het netwerk en kost tijd. Lees daarom een heel bereik in een keer en schrijf het in een keer terug:
function batchVerwerking() {
const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const data = blad.getDataRange().getValues();
for (let i = 0; i < data.length; i++) {
data[i][2] = data[i][0] + ' ' + data[i][1];
}
blad.getRange(1, 1, data.length, data[0].length).setValues(data);
}
Dit leest alles, verwerkt in het geheugen en schrijft een keer terug. Vergelijk dat met honderden losse setValue-aanroepen in een loop, die tientallen keren trager zijn.
De gouden vuistregel voor snelheid
Lezen en schrijven buiten de loop, rekenen binnen de loop. Haal je data met een enkele getValues op, bewerk de array volledig in het geheugen en schrijf met een enkele setValues terug. Dit ene principe lost de meeste trage scripts op.
Veiligheid: geheimen en scopes
Veilige scripts beginnen bij het beschermen van geheimen. Zet API-sleutels en tokens nooit in je broncode, maar in de PropertiesService:
function leesGeheim() {
const props = PropertiesService.getScriptProperties();
const sleutel = props.getProperty('API_KEY');
return sleutel;
}
Beperk daarnaast de scopes die je script vraagt. In appsscript.json kun je expliciet de minimale scopes opgeven, zodat je script niet meer rechten krijgt dan nodig.
Te brede scopes zijn een beveiligingsrisico
Vraagt je script volledige Gmail-toegang terwijl het alleen mails verstuurt, dan kan een fout of misbruik veel meer schade aanrichten dan nodig. Geef in appsscript.json het kleinste rechtenpakket op dat werkt, en bewaar alle geheimen in PropertiesService, nooit in de code.
Onderhoudbaarheid: kleine functies en structuur
Splits je code op in kleine functies met een duidelijke taak en naam. Een functie die data leest, een die verwerkt en een die mailt is veel makkelijker te testen en aan te passen dan een functie van tweehonderd regels:
function hoofd() {
const data = leesData();
const samenvatting = verwerk(data);
verstuur(samenvatting);
}
Zo lees je in de hoofdfunctie precies wat er gebeurt, en kun je elk onderdeel los testen.
Manifest en scopes bekijken
Je kunt het manifest appsscript.json zichtbaar maken via Project-instellingen, optie Manifestbestand tonen. Daar zie en beheer je de scopes en andere projectinstellingen. De volledige manifeststructuur staat op developers.google.com/apps-script/manifest.
Fouten en quota beheersen
Vang fouten netjes af zodat een enkele mislukking niet je hele run sloopt, vooral in loops en triggers. Houd ook rekening met de quota: een uitvoering mag maximaal zes minuten draaien (dit geldt sinds 2026 voor zowel gratis Gmail-accounts als betaalde Workspace-accounts), en diensten hebben dagelijkse limieten. Workspace-accounts krijgen wel ruimere dagquota, zoals meer trigger-uitvoeringstijd per dag.
Loopt een taak tegen de zes-minutenlimiet aan, dan kun je het werk opdelen. Twee veelgebruikte aanpakken:
| Aanpak | Wanneer kies je dit |
|---|---|
| Verwerk per run een kleinere batch | Als de dataset netjes in delen op te knippen is, bijvoorbeeld per honderd rijen. |
| Sla de voortgang op en hervat de volgende run | Als je niet vooraf weet hoeveel werk er is en je wilt automatisch doortellen. |
In de praktijk combineer je ze: verwerk per run een deel, sla de voortgang op in PropertiesService en laat een tijdgestuurde trigger het vervolg oppakken tot alles klaar is.
Een script productieklaar maken
- Vervang losse get- en set-aanroepen door batch
getValuesensetValues. - Verplaats alle sleutels en tokens naar
PropertiesService. - Beperk de scopes in
appsscript.jsontot het minimum. - Splits grote functies op in kleine, testbare onderdelen.
- Voeg
try/catchen logging toe en controleer het uitvoeringslogboek.
Test triggers apart van de editor
Een functie die handmatig in de editor werkt, kan via een tijdgestuurde trigger toch falen, bijvoorbeeld door ontbrekende autorisatie of een andere actieve gebruiker. Controleer na het instellen van een trigger altijd het uitvoeringslogboek van een echte triggeruitvoering, niet alleen je handmatige test.
Waarom is mijn script zo traag?
Bijna altijd door losse lees- en schrijfaanroepen in een loop. Lees in een keer met getValues, verwerk in het geheugen en schrijf in een keer met setValues.
Waar bewaar ik API-sleutels veilig?
In PropertiesService, niet in de broncode. Zo lekken ze niet mee bij het delen van het script en staan ze los van je code.
Hoe ga ik om met de zes-minutenlimiet?
Verdeel het werk in batches, bewaar de voortgang in PropertiesService en laat een trigger het vervolg uitvoeren tot alles klaar is.
Geldt die zes minuten ook voor mijn Workspace-account?
Ja. Sinds 2026 is de uitvoeringslimiet zes minuten voor zowel gratis Gmail- als betaalde Workspace-accounts. Workspace krijgt wel ruimere dagelijkse quota, zoals meer totale trigger-uitvoeringstijd per dag.
Hoe houd ik mijn code onderhoudbaar?
Schrijf kleine functies met een duidelijke taak, gebruik sprekende namen, voeg foutafhandeling toe en log genoeg context om problemen later te begrijpen.
Hoe debug ik een script dat alleen via een trigger faalt?
Open het uitvoeringslogboek in de Apps Script-editor en filter op de triggeruitvoeringen. Daar zie je de exacte foutmelding en het tijdstip, ook voor runs die je niet zelf hebt gestart.
Tot slot
Deze richtlijnen gelden voor elk script dat je bouwt, van een dagelijks rapport tot een offboarding-flow. Pas ze vanaf het begin toe, dan blijven je automatiseringen snel, veilig en plezierig om aan te werken.