# Rapportages genereren voor ouderavonden met Apps Script [[TOC]] Voor een ouderavond wil je per leerling een net rapport: cijfers, voortgang en een persoonlijke toelichting. Voor een hele klas handmatig opstellen is uren werk en foutgevoelig. Met Apps Script genereer je die rapporten automatisch uit je data. In dit gevorderde artikel bouwen we een rapportgenerator die het zware werk voor je doet. ## Het concept: data plus sjabloon De aanpak combineert drie ingredienten. Een Sheet bevat de data: per leerling de cijfers, aanwezigheid en eventuele opmerkingen. Een Docs-sjabloon bevat de opmaak met placeholders, de plekken waar de data moet komen. En Apps Script is de motor die per leerling het sjabloon kopieert en de placeholders vervangt door de echte gegevens. Het resultaat is dat je een keer een mooi sjabloon maakt en een keer een script schrijft, en daarna met een druk op de knop voor elke leerling een gepersonaliseerd rapport genereert. Wat uren kostte, gebeurt in minuten. :::info title="De winst zit in herbruikbaarheid" Het sjabloon en het script maak je een keer. Daarna draai je ze elk rapportmoment opnieuw met verse data, jaar in jaar uit, zonder opnieuw te beginnen. ::: ## Het sjabloon met placeholders Begin met een Docs-sjabloon dat eruitziet zoals je het rapport wilt hebben. Op de plekken waar persoonlijke data komt, zet je placeholders: een herkenbare tekst tussen dubbele accolades, bijvoorbeeld `{{naam}}`, `{{vak1_cijfer}}` of `{{toelichting}}`. Het script herkent die patronen en vervangt ze door de waarde uit de juiste kolom. Zorg dat elke placeholder een eigen kolom in je Sheet heeft. De kolomnamen in de eerste rij koppel je in het script aan de placeholders, zodat de juiste waarde op de juiste plek belandt. :::tip title="Kies een uniek placeholder-patroon" Gebruik placeholders die nooit per ongeluk in gewone tekst voorkomen, zoals dubbele accolades eromheen (`{{cijfer}}`). Zo voorkom je dat het script een normaal woord vervangt. Een uniek patroon maakt de vervanging betrouwbaar. ::: ## Het script bouwen Het script vormt het hart. Het leest de data uit de Sheet rij voor rij, maakt voor elke leerling een kopie van het sjabloon met `makeCopy`, opent die kopie met `DocumentApp.openById` en vervangt elke placeholder met `replaceText`. Daarna sla je het document op of exporteer je het als PDF. :::howto title="Zo bouw je de rapportgenerator" 1. Maak een **Docs-sjabloon** met de gewenste opmaak en zet de placeholders neer. 2. Zorg dat je **Sheet** kolommen heeft die bij de placeholders horen. 3. Schrijf een Apps Script dat de data uitleest met `getDataRange().getValues()`. 4. Kopieer per rij het sjabloon met `templateFile.makeCopy(naam, doelmap)`. 5. Open de kopie met `DocumentApp.openById(...)` en vervang elke placeholder met `body.replaceText('{{naam}}', waarde)`. 6. Sluit het document met `doc.saveAndClose()` en exporteer of mail het. ::: Bouw het script stapsgewijs op. Test het eerst met een enkele leerling, controleer of het rapport klopt, en laat het pas daarna over de hele klas lopen. Een fout in een loop produceert anders in een keer dertig verkeerde rapporten. :::warn title="Test eerst op een paar testrijen" Een rapportgenerator verwerkt cijfers en persoonlijke opmerkingen over minderjarigen. Test het script altijd eerst op een of twee testrijen en controleer het resultaat zorgvuldig voordat je het op de echte klas loslaat. Een fout in de koppeling tussen data en sjabloon kan het cijfer van de ene leerling bij de ander zetten, met grote gevolgen. ::: ## De verwerkingsstroom in beeld De gegevens lopen in een vaste volgorde door het script. Zo ziet die stroom eruit: 1. Het script leest de **Sheet** rij voor rij uit. 2. Per leerling wordt het **sjabloon gekopieerd** naar een doelmap in Drive. 3. De **placeholders worden vervangen** met `replaceText`. 4. Het document wordt **opgeslagen** en eventueel als **PDF geexporteerd**. 5. De PDF wordt **gemaild** naar de mentor of in een Drive-map geordend. ## Exporteren en verspreiden Zodra de rapporten gegenereerd zijn, wil je ze verspreiden. Het script kan elk rapport als PDF exporteren met `doc.getAs(MimeType.PDF)`, zodat ouders een nette, niet-bewerkbare versie krijgen. Vervolgens kun je de PDF's in een Drive-map ordenen of automatisch versturen met `GmailApp.sendEmail`. | Verspreidingsoptie | Wat het oplevert | | --- | --- | | Opslaan in Drive | Alle rapporten geordend per klas op een plek | | Exporteren als PDF | Een nette, vaste versie die ouders niet kunnen bewerken | | Mailen naar mentor | Het script stuurt elk rapport automatisch naar de juiste persoon | ## Privacy en zorgvuldigheid Bij een rapportgenerator hoort grote zorgvuldigheid, want je verwerkt gevoelige leerlingdata in bulk. Controleer dat de koppeling tussen data en rapport klopt, beperk wie toegang heeft tot de gegenereerde rapporten, en bewaar ze niet langer dan nodig. Een geautomatiseerd proces vraagt om extra controle, juist omdat het zo snel veel produceert. Verdeel de rollen helder: - **Docent of mentor**: levert de data en controleert de gegenereerde rapporten voor verspreiding. - **Scripteigenaar**: bouwt en onderhoudt het script en het sjabloon zorgvuldig. - **Functionaris gegevensbescherming**: toetst of de verwerking aan de privacyregels (AVG) voldoet. ## Onderhouden en hergebruiken Een goed gebouwde generator gebruik je jaren. Documenteer hoe het script en het sjabloon samenwerken, welke kolommen bij welke placeholders horen, zodat je het volgend jaar zonder hoofdbrekens opnieuw inzet. Een kleine investering in documentatie bespaart je elk rapportmoment opnieuw veel tijd. :::faq ### Heb ik programmeerervaring nodig? Enige ervaring met Apps Script helpt, want dit is een gevorderde toepassing. Met de stappen en een testfase kom je een heel eind, ook zonder uitgebreide achtergrond. ### Hoe voorkom ik dat data bij de verkeerde leerling belandt? Test grondig op een paar rijen en controleer de uitkomst voordat je het script op de hele klas draait. Koppel placeholders en kolommen expliciet op naam, niet op volgorde. ### Kan ik de rapporten als PDF aanleveren? Ja, het script exporteert elk rapport als PDF met `doc.getAs(MimeType.PDF)` voor een nette, niet-bewerkbare versie. ### Hoe ga ik om met de privacy van de rapporten? Beperk de toegang, controleer de koppeling zorgvuldig en bewaar de rapporten niet langer dan nodig volgens de AVG. ### Waarom werkt mijn replaceText niet? Controleer of de placeholder in het document exact overeenkomt met de tekst in je script, inclusief de accolades. Een spatie of een afwijkend teken verhindert de vervanging. ::: Met een rapportgenerator in Apps Script verander je een uren durende klus in een proces van minuten, zonder in te leveren op kwaliteit.