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

FormApp service in Apps Script

Maak en beheer Google Formulieren programmatisch met FormApp: vragen toevoegen, antwoorden verwerken en workflows automatiseren.

FormApp overzicht

FormApp geeft je volledige controle over Google Formulieren vanuit Apps Script. Je kunt formulieren aanmaken, vragen toevoegen en bewerken, antwoorden ophalen en verwerken, en triggers koppelen voor verwerking in real time.

const form = FormApp.getActiveForm();
const form2 = FormApp.openById('FORMULIER_ID');
const form3 = FormApp.openByUrl('https://docs.google.com/forms/d/FORMULIER_ID/');

getActiveForm() werkt alleen in een script dat aan een formulier gekoppeld is (container-bound). Voor standalone scripts gebruik je openById() of openByUrl().

Formulieren aanmaken en vragen toevoegen

function maakFormulier() {
  const form = FormApp.create('Klantbeoordeling Q3 2026');
  form.setDescription('Vul dit formulier in om ons te helpen verbeteren.');
  form.setCollectEmail(true);
  form.setLimitOneResponsePerUser(true);

  form.addTextItem()
    .setTitle('Wat is uw naam?')
    .setRequired(true);

  form.addMultipleChoiceItem()
    .setTitle('Hoe tevreden bent u?')
    .setChoiceValues(['Zeer tevreden', 'Tevreden', 'Neutraal', 'Ontevreden'])
    .setRequired(true);

  form.addScaleItem()
    .setTitle('Hoe waarschijnlijk beveelt u ons aan? (0 tot 10)')
    .setBounds(0, 10)
    .setLabels('Zeer onwaarschijnlijk', 'Zeer waarschijnlijk');

  form.addParagraphTextItem()
    .setTitle('Heeft u nog opmerkingen?');

  Logger.log(form.getPublishedUrl());
}
lightbulb

Itemtypes onthouden

De belangrijkste item-toevoegers zijn addTextItem() (kort tekstveld), addParagraphTextItem() (lang tekstveld), addMultipleChoiceItem() (radiokeuze), addCheckboxItem() (meerkeuze), addListItem() (dropdown), addScaleItem() (schaal) en addFileUploadItem() (bestandsupload).

Antwoorden verwerken

function verwerkAntwoorden() {
  const form = FormApp.openById('FORMULIER_ID');
  const antwoorden = form.getResponses();

  Logger.log(`Totaal antwoorden: ${antwoorden.length}`);

  antwoorden.forEach(antwoord => {
    const tijdstip = antwoord.getTimestamp();
    const email = antwoord.getRespondentEmail();

    const itemAntwoorden = antwoord.getItemResponses();
    itemAntwoorden.forEach(ia => {
      const vraag = ia.getItem().getTitle();
      const waarde = ia.getResponse();
      Logger.log(`${vraag}: ${waarde}`);
    });
  });
}
info

E-mailadres alleen bij verzameling

getRespondentEmail() retourneert alleen een waarde als setCollectEmail(true) is ingesteld op het formulier. Anders krijg je een lege string terug.

Nieuwe antwoorden triggeren

function stelTriggerIn() {
  const form = FormApp.openById('FORMULIER_ID');

  ScriptApp.newTrigger('verwerkNieuwAntwoord')
    .forForm(form)
    .onFormSubmit()
    .create();
}

function verwerkNieuwAntwoord(e) {
  const antwoord = e.response;
  const email = antwoord.getRespondentEmail();
  const itemAntwoorden = antwoord.getItemResponses();

  const samenvatting = itemAntwoorden
    .map(ia => `${ia.getItem().getTitle()}: ${ia.getResponse()}`)
    .join('
');

  GmailApp.sendEmail(
    'beheerder@bedrijf.nl',
    'Nieuw formulierantwoord',
    `Van: ${email}

${samenvatting}`
  );
}
warning

Trigger-quota in de gaten houden

Een onFormSubmit-trigger telt mee voor je dagelijkse Apps Script-quota voor triggers en e-mail. Bij grote volumes loop je tegen limieten aan. Verwerk dan in batch via getResponses() op een time-based trigger in plaats van per inzending.

Formulierstructuur aanpassen

function pasFormulierAan() {
  const form = FormApp.openById('FORMULIER_ID');
  const items = form.getItems();

  items.forEach(item => {
    Logger.log(`${item.getIndex()}: ${item.getTitle()} (${item.getType()})`);
  });

  const dropdownVraag = form.addListItem();
  dropdownVraag.setTitle('Selecteer uw regio');
  dropdownVraag.setChoiceValues(['Noord', 'Oost', 'Zuid', 'West']);

  form.moveItem(dropdownVraag.getIndex(), 2);

  items[0].setTitle('Bijgewerkte vraag');
}

Antwoorden naar Sheets exporteren

function exporteerNaarSheets() {
  const form = FormApp.openById('FORMULIER_ID');
  const destSheet = SpreadsheetApp.create('Formulierantwoorden Export');
  form.setDestination(FormApp.DestinationType.SPREADSHEET, destSheet.getId());

  Logger.log(destSheet.getUrl());
}

function leesUitGekoppeldeSheet() {
  const form = FormApp.openById('FORMULIER_ID');
  const sheetId = form.getDestinationId();
  const sheet = SpreadsheetApp.openById(sheetId).getSheets()[0];
  const data = sheet.getDataRange().getValues();
  Logger.log(`Rijen in sheet: ${data.length}`);
}

Veelgebruikte FormApp-methoden

Methode Doel
FormApp.create(titel) Nieuw formulier aanmaken
FormApp.openById(id) Bestaand formulier openen
form.addMultipleChoiceItem() Radiokeuze toevoegen
form.getResponses() Alle inzendingen ophalen
form.setDestination(...) Antwoorden koppelen aan een spreadsheet
form.deleteAllResponses() Alle antwoorden wissen (onomkeerbaar)
form.setAcceptingResponses(false) Formulier sluiten voor inzendingen

Registratieformulier met bevestigingsmail

  1. Maak een formulier met FormApp.create() en voeg naam-, e-mail- en keuze-vragen toe.
  2. Stel e-mailcollectie in met form.setCollectEmail(true).
  3. Maak een onFormSubmit-trigger met ScriptApp.newTrigger().
  4. In de handler haal je het e-mailadres op met e.response.getRespondentEmail().
  5. Genereer een bevestigingstekst op basis van getItemResponses().
  6. Stuur de bevestiging met GmailApp.sendEmail().
Hoe verwijder ik alle antwoorden uit een formulier?

Gebruik form.deleteAllResponses(). Let op: dit is onomkeerbaar en wist alle bestaande inzendingen.

Kan ik formuliervragen voorwaardelijk tonen?

Ja, via addPageBreakItem() en paginaroutering met setGoToPage() op multiple-choice items. Zo stuur je respondenten naar verschillende pagina's op basis van hun keuze.

Hoe begrens ik de inzendingsdatum van een formulier?

FormApp heeft geen ingebouwde deadline. Gebruik een time-based trigger die form.setAcceptingResponses(false) uitvoert op de gewenste datum en tijd.

Kan ik bestandsuploads verwerken vanuit een formulier?

Ja, voeg een addFileUploadItem() toe. Geüploade bestanden worden opgeslagen in Drive en zijn bereikbaar via het antwoord als Drive-bestand of url.

Werkt FormApp ook in een standalone script?

Ja. getActiveForm() werkt alleen container-bound, maar openById() en openByUrl() werken vanuit elk script zolang je toegang hebt tot het formulier.

Hoe weet ik welk itemtype een vraag heeft?

Roep item.getType() aan. Dat geeft een FormApp.ItemType terug, bijvoorbeeld MULTIPLE_CHOICE of TEXT, zodat je per type de juiste verwerking kiest.

FormApp is een krachtige service voor het bouwen van geautomatiseerde datastromen. Door formulieren te koppelen aan spreadsheets, agenda-afspraken of documentgeneratie bouw je complete selfservice-workflows zonder externe tools.