# Formulierreacties verwerken met Apps Script Formulierreacties verwerken met Apps Script maakt van een statisch Google Form een actieve automatisering. Zodra iemand het formulier invult, draait jouw code: je stuurt een bevestiging, plant een afspraak of verwerkt de data verder. In dit artikel leer je de onFormSubmit-trigger gebruiken, het event-object uitlezen en de reacties betrouwbaar verwerken. [[TOC]] ## Hoe formulierverwerking werkt Een Google Form heeft een gekoppeld Apps Script. Wanneer iemand het formulier inzendt, kan een installeerbare onFormSubmit-trigger een functie starten. Die functie ontvangt een event-object `e` met daarin alle antwoorden. Je hoeft dus niets te pollen, want Google roept je code aan op het moment van inzending. :::info title="Twee soorten formulier-triggers" Een onFormSubmit-trigger op het formulier zelf geeft een ander event-object dan een trigger op de gekoppelde spreadsheet. De formulier-variant levert `e.response` met een FormResponse-object, de spreadsheet-variant levert `e.values` als array. Zie developers.google.com/apps-script/guides/triggers/events. ::: ## De trigger instellen Je stelt de onFormSubmit-trigger in op het formulier-gebonden script: ```javascript function maakFormTrigger() { const form = FormApp.getActiveForm(); ScriptApp.newTrigger('verwerkInzending') .forForm(form) .onFormSubmit() .create(); } ``` Draai deze functie een keer handmatig om de trigger te registreren. Je vindt je triggers daarna terug onder het klok-icoon in de Apps Script-editor. ## Het event-object uitlezen In de verwerkingsfunctie haal je de antwoorden uit het event-object. Een FormResponse bevat een lijst ItemResponses, elk met een vraag en het gegeven antwoord: ```javascript function verwerkInzending(e) { const response = e.response; const items = response.getItemResponses(); const antwoorden = {}; items.forEach(function(item) { const vraag = item.getItem().getTitle(); const antwoord = item.getResponse(); antwoorden[vraag] = antwoord; }); Logger.log(JSON.stringify(antwoorden)); const email = response.getRespondentEmail(); if (email) { MailApp.sendEmail(email, 'Bedankt voor je inzending', 'We hebben je antwoorden ontvangen en nemen contact op.'); } } ``` `getRespondentEmail()` werkt alleen als het formulier e-mailadressen verzamelt. Zet die optie aan in de formulierinstellingen. :::tip title="Spreek antwoorden aan op vraagtitel" Bouw een woordenboek (object) van vraag naar antwoord zoals hierboven. Dan hoef je niet op de volgorde van de items te vertrouwen, wat breekt zodra iemand een vraag verplaatst in het formulier. Aanspreken op de vraagtitel is veel robuuster. ::: ## Reacties wegschrijven naar een spreadsheet Vaak wil je inzendingen verzamelen in een eigen blad, bijvoorbeeld om er later op te filteren: ```javascript function logNaarSheet(e) { const blad = SpreadsheetApp.openById('jouw-sheet-id').getSheetByName('Inzendingen'); const response = e.response; const items = response.getItemResponses(); const rij = [new Date()]; items.forEach(function(item) { rij.push(item.getResponse()); }); blad.appendRow(rij); } ``` `appendRow()` voegt netjes een nieuwe regel toe onder de bestaande data. :::warn title="Verwerk inzendingen idempotent" Een trigger kan in zeldzame gevallen opnieuw afgaan. Als je per inzending een afspraak plant of een externe actie uitvoert, sla dan een uniek kenmerk op (zoals de responsId via `response.getId()`) en sla al verwerkte inzendingen over om dubbele acties te voorkomen. ::: ## De flow in vier stappen Onder water doorloopt elke inzending dezelfde vier stappen. Zo ziet de keten eruit: | Stap | Wat er gebeurt | | --- | --- | | Inzending | Iemand vult het Google Form in en verstuurt het | | Trigger | De onFormSubmit-trigger start je functie met het event-object | | Uitlezen | Je haalt de antwoorden uit `getItemResponses()` | | Actie | Mail, afspraak, sheet-rij of API-call op basis van de data | ## Een complete flow bouwen Formulierverwerking is de basis voor veel automatiseringen. Combineer het met agenda voor een reserveringssysteem, zie [[apps-script-kalender-event|agenda-afspraken aanmaken]], of bouw er een complete goedkeuringsflow mee, zie [[apps-script-approval-flow|een goedkeuringsflow bouwen]]. :::faq ### Waarom krijgt mijn functie geen event-object? Een eenvoudige onFormSubmit-functie zonder geinstalleerde trigger krijgt geen volledig event. Stel een installeerbare trigger in via ScriptApp of het klok-icoon, dan vult Google het object. ### Hoe lees ik het e-mailadres van de inzender? Met `response.getRespondentEmail()`, maar alleen als het formulier e-mailadressen verzamelt. Zet die optie aan in de formulierinstellingen. ### Kan ik per antwoord een afspraak plannen? Ja. Lees de gewenste datum uit de antwoorden en gebruik `CalendarApp.createEvent()`. Zie ook agenda-afspraken aanmaken. ### Wat als het formulier op een spreadsheet is gekoppeld? Dan kun je de trigger ook op de spreadsheet zetten. Het event-object heeft dan `e.values` als array in plaats van `e.response`. ### Waarom worden antwoorden uit selectievakjes anders teruggegeven? Bij een vraag met meerdere keuzes geeft `getResponse()` een array van gekozen waarden in plaats van een enkele string. Houd daar rekening mee als je de waarde direct naar een cel schrijft. ### Hoeveel keer mag mijn trigger per dag draaien? Apps Script kent quota op triggers en op services zoals MailApp. Voor zware verwerking is het verstandig om externe API-calls te bundelen of door te schuiven, zodat je binnen de dagelijkse limieten blijft. :::