# DriveApp service in Apps Script [[TOC]] ## DriveApp basis DriveApp geeft je toegang tot Google Drive vanuit Apps Script. Je kunt bestanden aanmaken, lezen, verplaatsen, kopieren en verwijderen. Ook het delen van bestanden en mappen en het instellen van machtigingen valt binnen de service. ```javascript const root = DriveApp.getRootFolder(); Logger.log(root.getName()); const bestand = DriveApp.getFileById('BESTAND_ID'); Logger.log(bestand.getName()); Logger.log(bestand.getMimeType()); Logger.log(bestand.getSize()); ``` :::tip title="Vraag alleen de scope die je nodig hebt" DriveApp vraagt standaard volledige Drive-toegang. Wil je je script beperken tot bestanden die het zelf aanmaakt, gebruik dan de scope `https://www.googleapis.com/auth/drive.file`. Zet die expliciet in je `appsscript.json` onder `oauthScopes` om onnodig brede rechten te voorkomen. ::: ## Bestanden aanmaken en opslaan ```javascript function maakBestanden() { const map = DriveApp.getFolderById('MAP_ID'); const tekstbestand = map.createFile('notities.txt', 'Inhoud hier', MimeType.PLAIN_TEXT); const blob = Utilities.newBlob('{"sleutel":"waarde"}', MimeType.JSON, 'data.json'); const jsonBestand = map.createFile(blob); const spreadsheet = SpreadsheetApp.create('Nieuw rapport'); const ssBestand = DriveApp.getFileById(spreadsheet.getId()); ssBestand.moveTo(map); } ``` ## Mappen beheren ```javascript function beheerMappen() { const root = DriveApp.getRootFolder(); const nieuwMap = root.createFolder('Projecten 2026'); const submap = nieuwMap.createFolder('Q3'); const submappen = nieuwMap.getFolders(); while (submappen.hasNext()) { const sm = submappen.next(); Logger.log(sm.getName()); } const bestanden = nieuwMap.getFiles(); while (bestanden.hasNext()) { Logger.log(bestanden.next().getName()); } } ``` :::warn title="Werk altijd met de iterator-controle" DriveApp gebruikt iterator-objecten voor bestanden en mappen. Controleer altijd met `hasNext()` voordat je `next()` aanroept, anders krijg je een runtime-fout zodra de iterator leeg is. ::: ## Zoeken in Drive ```javascript function zoekInDrive() { const zoekresultaten = DriveApp.searchFiles( 'mimeType = "application/pdf" and title contains "factuur" and trashed = false' ); while (zoekresultaten.hasNext()) { const bestand = zoekresultaten.next(); Logger.log(`${bestand.getName()} - ${bestand.getLastUpdated()}`); } const mapResultaten = DriveApp.searchFolders('title contains "Archief"'); while (mapResultaten.hasNext()) { Logger.log(mapResultaten.next().getName()); } } ``` De zoeksyntax van DriveApp volgt de Drive API v2 query-syntax, niet v3. Dat is een veelgemaakte fout: in v2 heten de velden `title` en `modifiedDate`, terwijl v3 `name` en `modifiedTime` gebruikt. Schrijf je `name contains` in een DriveApp-query, dan krijg je geen resultaten. Veelgebruikte velden zijn `mimeType`, `title`, `modifiedDate`, `owners`, `parents` en `trashed`. :::tip title="Escape quotes in je zoekstring" Bevat je zoekterm een apostrof of dubbele quote, escape die dan correct. Bijvoorbeeld: `'title contains "Q\'s rapport"'`. Een niet-geescapete quote breekt de hele query stilletjes. ::: ## Bestandsrechten instellen ```javascript function stelRechtenIn() { const bestand = DriveApp.getFileById('BESTAND_ID'); bestand.addViewer('lezer@voorbeeld.nl'); bestand.addEditor('bewerker@voorbeeld.nl'); bestand.setSharing( DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW ); bestand.removeViewer('oudelezer@voorbeeld.nl'); const delers = bestand.getEditors(); delers.forEach(d => Logger.log(d.getEmail())); } ``` :::warn title="ANYONE_WITH_LINK deelt breder dan je denkt" `DriveApp.Access.ANYONE_WITH_LINK` maakt het bestand toegankelijk voor iedereen met de link, ook buiten je organisatie. Gebruik voor interne bestanden liever `DriveApp.Access.DOMAIN_WITH_LINK` of deel gericht per e-mailadres. Controleer dit altijd voordat je gevoelige data deelt. ::: ## Bestanden kopieren en verplaatsen ```javascript function kopierenEnVerplaatsen() { const bestand = DriveApp.getFileById('BRON_ID'); const doelmap = DriveApp.getFolderById('DOEL_MAP_ID'); const kopie = bestand.makeCopy('Kopie - ' + bestand.getName(), doelmap); bestand.moveTo(doelmap); bestand.setTrashed(true); } ``` ## Bestanden exporteren als andere formaten ```javascript function exporteerAlsPdf() { const spreadsheet = SpreadsheetApp.openById('SPREADSHEET_ID'); const pdf = spreadsheet.getAs(MimeType.PDF); pdf.setName('rapport.pdf'); const map = DriveApp.getFolderById('MAP_ID'); const pdfBestand = map.createFile(pdf); Logger.log(pdfBestand.getUrl()); } function exporteerDocAlsWord() { const doc = DriveApp.getFileById('DOC_ID'); const blob = doc.getAs('application/vnd.openxmlformats-officedocument.wordprocessingml.document'); blob.setName('document.docx'); DriveApp.createFile(blob); } ``` ## Drive-activiteit monitoren ```javascript function monitorBestanden() { const map = DriveApp.getFolderById('MAP_ID'); const grens = new Date(); grens.setDate(grens.getDate() - 1); const bestanden = map.getFiles(); const recent = []; while (bestanden.hasNext()) { const b = bestanden.next(); if (b.getLastUpdated() > grens) { recent.push({naam: b.getName(), bijgewerkt: b.getLastUpdated()}); } } Logger.log(`Recent bijgewerkt: ${recent.length} bestanden`); } ``` :::howto title="Maandelijkse back-up van spreadsheets als PDF" 1. Zoek naar alle spreadsheets in een specifieke map met `DriveApp.searchFiles('mimeType = "application/vnd.google-apps.spreadsheet" and trashed = false')`. 2. Open elke spreadsheet met `SpreadsheetApp.openById()` en exporteer als PDF met `getAs(MimeType.PDF)`. 3. Maak een doelmap aan voor de maand met `rootMap.createFolder(maandnaam)`. 4. Sla elk PDF-bestand op in de nieuwe map met `doelmap.createFile(pdf)`. 5. Stuur een samenvatting per e-mail met `GmailApp.sendEmail()`. ::: :::faq ### Hoe krijg ik de URL van een bestand? Gebruik `bestand.getUrl()` voor de bewerkbare URL of `bestand.getDownloadUrl()` voor een directe downloadlink. Beide methoden zijn nog steeds beschikbaar in 2026. ### Kan ik bestanden uploaden vanuit een externe URL? Ja. Haal de data op met `UrlFetchApp.fetch(url).getBlob()` en sla die op met `DriveApp.createFile(blob)`. Houd er rekening mee dat de externe URL publiek bereikbaar moet zijn. ### Waarom geeft mijn searchFiles-query geen resultaten? Waarschijnlijk gebruik je v3-veldnamen. DriveApp werkt met de Drive API v2-syntax: gebruik `title` in plaats van `name` en `modifiedDate` in plaats van `modifiedTime`. ### Hoe verplaats ik een bestand van een gedeelde drive naar Mijn Drive? Gebruik `bestand.moveTo(doelmap)`. Dit werkt ook cross-drive zolang je voldoende machtigingen hebt op zowel de bron- als de doellocatie. ### Wat is het maximale bestandsformaat dat ik kan aanmaken? Voor niet-Google formaten geldt een limiet van 5 TB per bestand. Voor Blob-operaties in Apps Script geldt een praktische limiet van ongeveer 50 MB door geheugenrestricties van de runtime. ### Hoe voorkom ik een time-out bij veel bestanden? Apps Script heeft een maximale uitvoeringstijd per run (rond de 6 minuten op consumentenaccounts). Verwerk grote hoeveelheden bestanden in batches en gebruik een time-driven trigger met een voortgangsmarkering in `PropertiesService` om verder te gaan waar je gebleven was. ::: De DriveApp service is bijzonder krachtig in combinatie met andere services. Door bestanden te exporteren als Blob en door te geven aan GmailApp of terug te schrijven naar Drive, automatiseer je complete documentworkflows zonder externe tools.