Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

Formulierreacties verwerken met Apps Script

Reageer met een onFormSubmit-trigger direct op elke inzending van een Google Form: stuur een bevestigingsmail, plan een afspraak of schrijf de antwoorden weg naar een spreadsheet.

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.

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

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:

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:

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.

lightbulb

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:

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.

warning

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 agenda-afspraken aanmaken, of bouw er een complete goedkeuringsflow mee, zie een goedkeuringsflow bouwen.

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.