# Apps Script-triggers: taken automatisch laten draaien Met **Google Apps Script** automatiseer je terugkerend werk in Google Workspace. Een trigger zorgt ervoor dat een functie vanzelf draait, zonder dat iemand het script handmatig start. Dat is de kern van automatisering: een rapport dat elke ochtend wordt verstuurd, een Spreadsheet die zichzelf opschoont, of een actie die volgt op een ingezonden formulier. ## Twee soorten triggers Apps Script kent **eenvoudige triggers** en **installeerbare triggers**. Het verschil is belangrijk. - **Eenvoudige triggers** zoals `onOpen` en `onEdit` zijn functies met een vaste naam die automatisch draaien. Ze hebben beperkte rechten: ze mogen geen diensten aanroepen die autorisatie vragen, zoals mail versturen of een ander bestand benaderen. - **Installeerbare triggers** stel je bewust in en kunnen wel diensten gebruiken die autorisatie vereisen. Ze draaien altijd onder het account van de persoon die de trigger heeft aangemaakt. Voor echte automatisering gebruik je vrijwel altijd installeerbare triggers. ## Tijdgestuurde triggers Een tijdgestuurde trigger draait op een interval, van elke minuut tot eens per maand. Je maakt hem aan in de editor of in code. :::howto title="Een tijdgestuurde trigger via de editor" 1. Open je project op [script.google.com](https://script.google.com). 2. Klik links op het wekker-icoon (**Triggers**). 3. Kies rechtsonder **Trigger toevoegen**. 4. Selecteer de functie die moet draaien en kies bij gebeurtenisbron **Tijdgestuurd**. 5. Stel het type tijdinterval in (bijvoorbeeld **Dagteller** met een tijdvak), en sla op. ::: **In code** met de builder-API: ```javascript function maakTriggers() { ScriptApp.newTrigger('dagelijksRapport') .timeBased() .everyDays(1) .atHour(9) .create(); ScriptApp.newTrigger('controleerInbox') .timeBased() .everyMinutes(10) .create(); } ``` :::warn title="Alleen vaste minuut-intervallen" Bij `everyMinutes()` accepteert Apps Script alleen de waarden 1, 5, 10, 15 of 30. Een andere waarde geeft een foutmelding. ::: Voor een vaste dag in de week gebruik je `onWeekDay`: ```javascript ScriptApp.newTrigger('weekoverzicht') .timeBased() .onWeekDay(ScriptApp.WeekDay.MONDAY) .atHour(8) .create(); ``` Het tijdvak bij `atHour` is geen exact tijdstip maar een venster van een uur. Een trigger met `atHour(9)` draait ergens tussen 9 en 10 uur, in de tijdzone die in de projectinstellingen staat. ## Gebeurtenis-triggers Een gebeurtenis-trigger reageert op een actie in een bestand. Veelgebruikte gevallen zijn een bewerking in een Spreadsheet, een wijziging van de structuur, of een ingezonden Google Formulier. ```javascript function maakEditTrigger() { ScriptApp.newTrigger('verwerkWijziging') .forSpreadsheet(SpreadsheetApp.getActive()) .onEdit() .create(); } ``` De functie die je koppelt, ontvangt een gebeurtenis-object met details over wat er gebeurde, zoals de bewerkte cel of de ingezonden formulierantwoorden. :::tip title="Installeerbare onEdit voor echte acties" Gebruik een installeerbare `onEdit`-trigger in plaats van de eenvoudige variant zodra je actie mail moet versturen of een ander bestand moet bijwerken. Alleen de installeerbare trigger heeft daar de rechten voor. ::: ## Triggers beheren en opruimen In het Triggers-overzicht zie je alle triggers van het project, met de uitvoeringsgeschiedenis en eventuele fouten. Verwijder triggers die je niet meer nodig hebt; ze blijven anders draaien en tellen mee voor je dagelijkse limiet. In code haal je bestaande triggers op en verwijder je ze gericht: ```javascript function verwijderTriggers() { const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(t => ScriptApp.deleteTrigger(t)); } ``` :::info title="Voorkom dubbele triggers" Laat een script niet bij elke uitvoering opnieuw dezelfde trigger aanmaken. Doe je dat wel, dan stapelen identieke triggers zich op en draait je functie veel vaker dan bedoeld. Controleer met `getProjectTriggers()` of een trigger al bestaat voordat je een nieuwe maakt, of ruim eerst alle bestaande triggers op. ::: ## De eerste keer autoriseren De eerste keer dat een installeerbare trigger draait, vraagt Google toestemming voor de scopes die het script gebruikt, bijvoorbeeld toegang tot Gmail of Drive. Die toestemming geef je eenmalig; daarna draait de trigger automatisch onder jouw account. Met deze bouwstenen, een tijdgestuurde of gebeurtenis-trigger, een nette opruim-functie en eenmalige autorisatie, zet je betrouwbare automatiseringen op zonder dat er nog iemand handmatig op start hoeft te klikken. :::faq ### Wat is het verschil tussen een eenvoudige en een installeerbare trigger? Een eenvoudige trigger is een functie met een vaste naam zoals `onOpen` of `onEdit` die automatisch draait, maar geen diensten mag gebruiken die autorisatie vragen. Een installeerbare trigger stel je bewust in, mag wel mail versturen of andere bestanden benaderen, en draait altijd onder het account van wie hem heeft aangemaakt. ### Hoe vaak mag een tijdgestuurde trigger minimaal draaien? Het kortste interval is elke minuut. Bij `everyMinutes()` zijn alleen de waarden 1, 5, 10, 15 en 30 toegestaan; andere waarden geven een foutmelding. ### Waarom draait mijn trigger niet precies op het ingestelde tijdstip? Tijdgestuurde triggers werken met een tijdvenster van een uur, niet met een exact tijdstip. Een trigger met `atHour(9)` start ergens tussen 9 en 10 uur. Voor acties die op de minuut nauwkeurig moeten, is een tijdgestuurde trigger niet de juiste keuze. ### Hoe voorkom ik dat dezelfde trigger zich opstapelt? Maak triggers niet aan bij elke uitvoering van je script. Controleer met `getProjectTriggers()` of de trigger al bestaat, of verwijder eerst alle bestaande triggers met `deleteTrigger()` voordat je een nieuwe aanmaakt. ### Waarom vraagt mijn script de eerste keer om toestemming? Een installeerbare trigger gebruikt scopes zoals toegang tot Gmail of Drive. Google vraagt eenmalig om die toestemming via een autorisatiescherm. Daarna draait de trigger zonder verdere tussenkomst onder jouw account. ### Welke acties kunnen een gebeurtenis-trigger laten afgaan? Veelgebruikte gebeurtenissen zijn een bewerking in een Spreadsheet (`onEdit`), het openen van een bestand (`onOpen`), een wijziging van de structuur en het indienen van een Google Formulier (`onFormSubmit`). :::