Het on-call vraagstuk in de zorg
Zorginstellingen hebben medewerkers nodig die buiten kantooruren bereikbaar zijn. Het bijhouden van een actueel on-call schema is een administratieve uitdaging: medewerkers ruilen diensten, melden zich ziek en vakantieplanning verandert. Een spreadsheet die volledig handmatig wordt bijgehouden leidt al snel tot fouten en verwarring.
Een robuuste oplossing combineert Google Sheets als bron van waarheid met Google Agenda als distributiekanaal. Het schema staat in Sheets en via Apps Script worden de diensten automatisch als afspraken in de juiste agenda gepubliceerd.
Waarom Sheets als bron en Agenda als kanaal
Sheets biedt een vertrouwde interface voor planners, conditional formatting voor conflictdetectie en eenvoudige export. Agenda is het uiteindelijke distributiekanaal naar medewerkers, ook op mobiel.
Sheets-structuur voor het rooster
Maak een Google Sheet aan met een tabblad Rooster en de volgende kolommen:
| Kolom | Inhoud | Voorbeeld |
|---|---|---|
| A | Datum | 2026-06-15 |
| B | Dienst | Dag, Avond, Nacht, Weekend |
| C | Medewerker | naam of e-mailadres |
| D | Rol | Dienstdoend arts, Back-up |
| E | Status | Gepland, Bevestigd, Geruild |
| F | Afspraak-ID | gevuld door Apps Script |
Gebruik datavalidatie op kolom B en C om typefouten te voorkomen. Maak een apart tabblad Medewerkers met alle namen en e-mailadressen als bronlijst voor die validatie.
Stel daarnaast conditional formatting in zodat conflicten direct opvallen:
- Rood als een dienst niet ingevuld is.
- Oranje als een medewerker meer dan 5 diensten in 14 dagen heeft.
- Groen als de dienst bevestigd is.
Apps Script: Sheets naar Agenda synchroniseren
- Open het rooster-Sheet en ga naar Extensies > Apps Script.
- Maak een functie
syncRoosterNaarAgenda()die het tabblad Rooster leest. - Haal per rij de datum, het diensttype en de medewerker op.
- Selecteer de kalender met
CalendarApp.getCalendarsByName('On-call Rooster')[0]. - Maak per rij een afspraak met
calendar.createEvent(titel, startTijd, eindTijd). - Bewaar het afspraak-ID in kolom F, zodat je bij de volgende run de bestaande afspraak bijwerkt in plaats van een duplicaat te maken.
- Stel onder Triggers een tijdgestuurde trigger in (bijvoorbeeld dagelijks om 06:00) zodat de sync automatisch loopt.
Voorkom dubbele afspraken
Controleer altijd eerst of kolom F al een afspraak-ID bevat. Bestaat de afspraak nog, gebruik dan calendar.getEventById(id) en pas die aan. Zo blijft de agenda schoon, ook na honderden runs.
Ruilverzoeken verwerken
Maak een tweede tabblad Ruilen aan. Medewerkers dienen via een Google Form een ruilvraag in: ze vullen hun naam, de dienst die ze willen ruilen en de gewenste ruilpartner in. Het formulier vult het tabblad Ruilen automatisch.
Een Apps Script-trigger controleert dagelijks of beide partijen akkoord zijn (kolom Geaccepteerd staat voor beide op Ja) en past dan automatisch het tabblad Rooster aan. De Agenda-sync verspreidt de wijziging vervolgens naar alle agenda's.
Notificaties instellen
Gebruik Apps Script om e-mailnotificaties te versturen op de juiste momenten:
- Aan de medewerker die de komende week on-call is, 7 dagen van tevoren.
- Aan de afdeling als een dienst 48 uur van tevoren nog niet is ingevuld.
- Een bevestiging aan beide partijen bij een goedgekeurde ruil.
Voor eenvoudige berichten volstaat MailApp.sendEmail(). Wil je meer opmaak of bijlagen, gebruik dan GmailApp.
Toegangsrechten voor het rooster
Het rooster bevat namen van medewerkers en diensten, maar geen patiëntinformatie. Toegangsrechten zijn toch belangrijk:
- Planners: bewerktoegang tot het Sheet.
- Medewerkers: leestoegang tot het Sheet en de Agenda.
- Management: leestoegang voor rapportage en bezettingsoverzicht.
- Externe medewerkers of uitzendkrachten: geen toegang tot het interne rooster, alleen hun eigen afspraken.
Maak een Google Groep per rol en deel het Sheet en de Agenda met die groepen. Zo beheer je rechten op één plek in plaats van per persoon.
Deel niet breder dan nodig
Zet het rooster nooit op "Iedereen met de link". Namen en diensten zijn persoonsgegevens; beperk toegang tot mensen met een dienstbetrekking en een legitieme reden om het rooster te zien.
Rapportage op basis van het rooster
Sheets biedt eenvoudige mogelijkheden voor bezettingsrapportage. Gebruik COUNTIF of draaitabellen om vragen te beantwoorden zoals:
- Hoeveel diensten heeft elke medewerker dit kwartaal gedraaid?
- Welke diensten worden het vaakst geruild?
- Is er een patroon in uitval op bepaalde tijden?
Exporteer maandelijkse samenvattingen via Bestand > Downloaden > PDF en deel die met het management.
Mag ik medewerkersnamen in een gedeelde Google Sheet opslaan?
Ja, namen van medewerkers zijn gewone persoonsgegevens waarvoor de arbeidsovereenkomst als grondslag dient. Beperk de toegang tot het rooster wel tot medewerkers met een dienstbetrekking en deel niet breder dan nodig.
Hoe verwerk ik ziektemeldingen snel in het rooster?
Maak een eenvoudig Google Form voor ziektemeldingen. Een Apps Script stuurt direct een melding naar de planner, die de vervanging regelt en het rooster aanpast. De Agenda-sync verspreidt de wijziging daarna automatisch.
Werkt de Sheets-Agenda-koppeling ook op mobiel?
Ja, de Google Agenda-app toont de gesynchroniseerde diensten op telefoon en tablet. Medewerkers kunnen per afspraak meldingen instellen.
Hoe ga ik om met diensten die over middernacht heen lopen?
Zet de eindtijd van de afspraak op de volgende dag. Apps Script verwerkt dit correct zolang je losse Date-objecten gebruikt voor de start- en eindtijd.
Wat gebeurt er als de dagelijkse trigger een keer faalt?
Apps Script logt de fout en de afspraken van die dag worden niet bijgewerkt. Laat de sync idempotent werken via het afspraak-ID in kolom F, zodat de volgende geslaagde run alles vanzelf weer rechttrekt.
Hoeveel afspraken kan ik per dag aanmaken?
Apps Script kent quota per account. Voor een normaal afdelingsrooster is dat ruim voldoende, maar zeer grote organisaties kunnen tegen dagelijkse limieten aanlopen. Verdeel het werk dan over meerdere runs of beperk de sync tot een venster van bijvoorbeeld de komende 30 dagen.