# Apps Script best practices: veilig, snel en onderhoudbaar 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. [[TOC]] ## 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: ```javascript 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. :::tip title="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`: ```javascript 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. :::danger title="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: ```javascript 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. :::info title="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. :::howto title="Een script productieklaar maken" 1. Vervang losse get- en set-aanroepen door batch `getValues` en `setValues`. 2. Verplaats alle sleutels en tokens naar `PropertiesService`. 3. Beperk de scopes in `appsscript.json` tot het minimum. 4. Splits grote functies op in kleine, testbare onderdelen. 5. Voeg `try`/`catch` en logging toe en controleer het uitvoeringslogboek. ::: :::warn title="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. ::: :::faq ### 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 [[apps-script-dagelijks-rapport|dagelijks rapport]] tot een [[apps-script-offboarding|offboarding-flow]]. Pas ze vanaf het begin toe, dan blijven je automatiseringen snel, veilig en plezierig om aan te werken.