# CalendarApp voor agenda-automatisering [[TOC]] ## Overzicht van CalendarApp CalendarApp is de Apps Script-service voor Google Agenda. Je kunt er evenementen mee aanmaken, bijwerken, verwijderen en opvragen. Ook terugkerende evenementen, herinneringen en het beheren van meerdere agenda's vallen binnen de mogelijkheden. ```javascript const agenda = CalendarApp.getDefaultCalendar(); const agendaNaam = agenda.getName(); const agendaId = agenda.getId(); Logger.log(`${agendaNaam}: ${agendaId}`); ``` CalendarApp werkt op je eigen agenda en op agenda's waarop je voldoende rechten hebt. Voor toegang tot agenda's van andere gebruikers heb je domeingekoppelde delegatie of de Calendar Advanced Service nodig. ## Evenementen aanmaken Het vierde argument van `createEvent()` is een opties-object. Geef `sendInvites: true` mee als gasten direct een uitnodiging moeten ontvangen, want standaard gebeurt dat niet. ```javascript function maakEvenementAan() { const agenda = CalendarApp.getDefaultCalendar(); const start = new Date('2026-07-01T10:00:00'); const einde = new Date('2026-07-01T11:30:00'); const evenement = agenda.createEvent( 'Teamvergadering', start, einde, { description: 'Kwartaalevaluatie Q2 2026', location: 'Vergaderruimte A, Amsterdam', guests: 'collega1@bedrijf.nl,collega2@bedrijf.nl', sendInvites: true, } ); Logger.log(`Aangemaakt: ${evenement.getId()}`); } ``` :::tip title="Tijdzones expliciet beheren" CalendarApp gebruikt standaard de tijdzone van het script. Werk je met gebruikers in verschillende tijdzones, gebruik dan `Session.getScriptTimeZone()` samen met `Utilities.formatDate()` zodat datums voorspelbaar blijven. ::: ## Terugkerende evenementen Voor herhalende afspraken gebruik je `newRecurrence()` om een patroon te bouwen en `createEventSeries()` om de reeks aan te maken. Het voorbeeld hieronder maakt een wekelijkse afspraak op maandag en donderdag. ```javascript function terugkerendEvenement() { const agenda = CalendarApp.getDefaultCalendar(); const herhaling = CalendarApp.newRecurrence() .addWeeklyRule() .onlyOnWeekdays([CalendarApp.Weekday.MONDAY, CalendarApp.Weekday.THURSDAY]) .until(new Date('2026-12-31')); const start = new Date('2026-07-07T09:00:00'); const einde = new Date('2026-07-07T09:30:00'); agenda.createEventSeries('Wekelijkse standup', start, einde, herhaling); } ``` ## Evenementen opvragen en filteren `getEvents()` haalt alle evenementen op tussen een begin- en einddatum. Met de optie `search` filter je op een trefwoord in titel, beschrijving of locatie. ```javascript function zoekEvenementen() { const agenda = CalendarApp.getDefaultCalendar(); const vandaag = new Date(); const volgendeWeek = new Date(); volgendeWeek.setDate(vandaag.getDate() + 7); const evenementen = agenda.getEvents(vandaag, volgendeWeek); evenementen.forEach(ev => { Logger.log(`${ev.getTitle()} | ${ev.getStartTime()} | Gasten: ${ev.getGuestList().length}`); }); const gevonden = agenda.getEvents(vandaag, volgendeWeek, {search: 'vergadering'}); Logger.log(`Vergaderingen gevonden: ${gevonden.length}`); } ``` ## Evenementen bijwerken en verwijderen Haal een bestaand evenement op met `getEventById()` en pas het daarna aan. Controleer altijd of het evenement bestaat voordat je methodes erop aanroept, want `getEventById()` geeft `null` terug bij een onbekende of verwijderde id. ```javascript function wijzigEvenement() { const evenementId = 'abc123_20260701T090000Z'; const evenement = CalendarApp.getEventById(evenementId); if (!evenement) { Logger.log('Evenement niet gevonden'); return; } evenement.setTitle('Bijgewerkte vergadering'); evenement.setDescription('Nieuwe beschrijving'); evenement.setLocation('Online via Meet'); const nieuweStart = new Date('2026-07-01T11:00:00'); const nieuwEinde = new Date('2026-07-01T12:00:00'); evenement.setTime(nieuweStart, nieuwEinde); } function verwijderEvenement() { const evenement = CalendarApp.getEventById('EVENEMENT_ID'); if (evenement) { evenement.deleteEvent(); } } ``` ## Gasten en RSVP beheren Met `getGuestList()` krijg je per gast het e-mailadres en de RSVP-status (bijvoorbeeld ja, nee of misschien). ```javascript function beheerGasten() { const evenement = CalendarApp.getEventById('EVENEMENT_ID'); evenement.addGuest('nieuwegast@bedrijf.nl'); evenement.removeGuest('oudegast@bedrijf.nl'); const gasten = evenement.getGuestList(); gasten.forEach(gast => { const status = gast.getGuestStatus(); const email = gast.getEmail(); Logger.log(`${email}: ${status}`); }); } ``` ## Andere agenda's beheren Naast je standaardagenda kun je gedeelde of secundaire agenda's benaderen op naam of op id. ```javascript function andereAgendas() { const agendas = CalendarApp.getAllCalendars(); agendas.forEach(a => Logger.log(a.getName())); const teams = CalendarApp.getCalendarsByName('Teams Agenda'); const gedeeld = CalendarApp.getCalendarById('AGENDA_ID@group.calendar.google.com'); if (gedeeld) { const nu = new Date(); const morgen = new Date(); morgen.setDate(nu.getDate() + 1); const ev = gedeeld.getEvents(nu, morgen); Logger.log(`Evenementen vandaag: ${ev.length}`); } } ``` ## Herinneringen instellen Je kunt per evenement meerdere herinneringen toevoegen, zowel via e-mail als via een pop-up. De waarde is het aantal minuten voor aanvang. ```javascript function stelHerinneringen() { const agenda = CalendarApp.getDefaultCalendar(); const start = new Date('2026-07-15T14:00:00'); const einde = new Date('2026-07-15T15:00:00'); const evenement = agenda.createEvent('Deadline presentatie', start, einde); evenement.addEmailReminder(60); evenement.addEmailReminder(1440); evenement.addPopupReminder(15); evenement.removeAllReminders(); evenement.addPopupReminder(30); } ``` ## Google Meet-links toevoegen CalendarApp zelf heeft geen methode om een conferentie aan een evenement te koppelen. Wil je automatisch een Google Meet-link aanmaken, dan gebruik je de Calendar Advanced Service. Schakel die in via Services in de editor, en geef bij het aanmaken van het evenement een `conferenceData`-blok mee met `conferenceDataVersion: 1`. ```javascript function evenementMetMeet() { const agendaId = 'primary'; const event = { summary: 'Overleg met Meet', start: { dateTime: '2026-07-20T10:00:00', timeZone: 'Europe/Amsterdam' }, end: { dateTime: '2026-07-20T11:00:00', timeZone: 'Europe/Amsterdam' }, conferenceData: { createRequest: { requestId: Utilities.getUuid(), conferenceSolutionKey: { type: 'hangoutsMeet' }, }, }, }; const aangemaakt = Calendar.Events.insert(event, agendaId, { conferenceDataVersion: 1 }); Logger.log(aangemaakt.hangoutLink); } ``` :::warn title="Calendar Advanced Service eerst inschakelen" `Calendar.Events.insert` werkt alleen als je de Calendar Advanced Service hebt toegevoegd via Services in de Apps Script-editor. Zonder die service krijg je een foutmelding dat `Calendar` niet gedefinieerd is. ::: :::howto title="Vergaderplanning automatiseren vanuit een formulier" 1. Koppel een Google Formulier met velden Naam, E-mail, Gewenste datum en Onderwerp. 2. Maak een `onFormSubmit`-trigger die de formulierinzending verwerkt. 3. Parseer de datum uit het antwoord naar een JavaScript `Date`-object. 4. Maak een evenement aan met `CalendarApp.getDefaultCalendar().createEvent()`. 5. Voeg de inzender toe als gast met `evenement.addGuest(email)`. 6. Stuur een bevestiging met `GmailApp.sendEmail()` inclusief de evenement-link. ::: ## Agenda-automatisering met triggers combineren De kracht van CalendarApp zit in de combinatie met triggers. Gebruik `newRecurrence()` voor terugkerende patronen en koppel een tijdgestuurde trigger om agenda-data te synchroniseren met andere systemen, zoals een CRM of projectmanagementtool. Een populair patroon is het automatisch aanmaken van afspraken vanuit een formulier of spreadsheet, eventueel met een Google Meet-link via de Calendar Advanced Service zoals hierboven. Houd er rekening mee dat Apps Script quota's heeft voor het aantal aangemaakte evenementen per dag, dus verwerk grote batches gespreid of in een tijdgestuurde trigger. :::faq ### Kan ik evenementen in de agenda van een andere gebruiker aanmaken? Dat kan alleen als je domeingekoppelde delegatie hebt via de Admin SDK of als de agenda met je gedeeld is met bewerkrechten. Persoonlijke agenda's van collega's zijn standaard niet toegankelijk via CalendarApp. ### Hoe maak ik een evenement dat de hele dag duurt? Gebruik `createAllDayEvent(titel, datum)` voor een enkel evenement of `createAllDayEventSeries()` voor een terugkerende reeks die de hele dag beslaat. ### Waarom worden mijn uitnodigingen niet verstuurd? Standaard stuurt `createEvent()` geen uitnodigingen. Geef `sendInvites: true` mee in het opties-object om gasten direct te laten informeren. ### Hoe voeg ik automatisch een Google Meet-link toe? CalendarApp heeft daar geen ingebouwde methode voor. Gebruik de Calendar Advanced Service en geef een `conferenceData`-blok mee met `conferenceDataVersion: 1`, zoals in het voorbeeld in dit artikel. ### Hoe synchroniseer ik een spreadsheet met agenda-evenementen? Lees evenementen op met `getEvents()`, bewaar de evenement-id per rij in de spreadsheet en gebruik die id daarna voor updates via `getEventById()`. ### Loop ik tegen limieten aan bij veel evenementen? Ja, Apps Script kent dagelijkse quota's voor onder meer het aantal aangemaakte agenda-evenementen. Verwerk grote aantallen gespreid via een tijdgestuurde trigger en bouw foutafhandeling in. :::