# Een aangepast menu toevoegen aan Sheets of Docs met Apps Script Een aangepast menu toevoegen aan Google Sheets of Docs met Apps Script maakt je automatisering toegankelijk voor collega's die geen code willen aanraken. In plaats van de editor te openen, klikken zij gewoon op een knop in een eigen menu. In dit artikel leer je menu's, submenus en dialoogvensters bouwen met de Ui-service. [[TOC]] ## De onOpen-functie Het geheim van een eigen menu is de speciale functienaam `onOpen()`. Apps Script roept die automatisch aan zodra de gebruiker het bestand opent. Daarin bouw je het menu op. ```javascript function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('Rapportages') .addItem('Genereer maandrapport', 'genereerRapport') .addItem('Stuur naar team', 'stuurNaarTeam') .addToUi(); } ``` Na het opslaan en herladen van de spreadsheet verschijnt rechts van Help een nieuw menu Rapportages. :::info title="Alleen in een gekoppeld script" Custom menus werken alleen in een script dat aan een specifiek bestand vastzit (een gekoppeld of bound script, dus geopend via Extensies en Apps Script vanuit de spreadsheet zelf). Een losstaand script in Google Drive kan geen menu in een document tonen. ::: :::info title="Ui per applicatie" De Ui-service haal je op per applicatie: `SpreadsheetApp.getUi()` voor Sheets, `DocumentApp.getUi()` voor Docs, `SlidesApp.getUi()` voor Slides en `FormApp.getUi()` voor Forms. De methodes zijn vrijwel identiek. Zie developers.google.com/apps-script/guides/menus. ::: ## Menu-items koppelen aan functies Elk `addItem()` heeft twee argumenten: het zichtbare label en de naam van de functie die moet draaien. Die functie moet in hetzelfde project bestaan: ```javascript function genereerRapport() { SpreadsheetApp.getUi().alert('Het maandrapport wordt gegenereerd.'); } function stuurNaarTeam() { SpreadsheetApp.getUi().alert('Rapport verstuurd naar het team.'); } ``` `ui.alert()` toont een eenvoudig pop-upvenster, handig om de gebruiker feedback te geven. ## Submenus en scheidingslijnen Voor meer structuur maak je submenus en visuele scheiding: ```javascript function onOpen() { const ui = SpreadsheetApp.getUi(); const submenu = ui.createMenu('Geavanceerd') .addItem('Data opschonen', 'schoonData') .addItem('Archiveer oude rijen', 'archiveer'); ui.createMenu('Tools') .addItem('Snelactie', 'snelActie') .addSeparator() .addSubMenu(submenu) .addToUi(); } ``` :::tip title="Groepeer gevaarlijke acties" Groepeer zelden gebruikte of gevaarlijke acties (zoals data verwijderen) in een submenu Geavanceerd. Zo houd je het hoofdmenu overzichtelijk en voorkom je dat iemand per ongeluk op een destructieve actie klikt. ::: ## Invoer vragen aan de gebruiker Soms heeft je functie input nodig. Met `ui.prompt()` vraag je tekst, met `ui.alert()` toon je een ja/nee-bevestiging: ```javascript function vraagNaam() { const ui = SpreadsheetApp.getUi(); const antwoord = ui.prompt('Voer de klantnaam in:'); if (antwoord.getSelectedButton() === ui.Button.OK) { const naam = antwoord.getResponseText(); ui.alert('Je voerde in: ' + naam); } } ``` Controleer altijd of de gebruiker op OK klikte en niet op Annuleren, anders verwerk je een lege of ongewenste waarde. :::warn title="onOpen draait met beperkte rechten" Een aangepast menu bouw je in `onOpen()`, maar die simpele trigger draait met beperkte rechten en mag geen diensten aanspreken die autorisatie vereisen, zoals Gmail of een externe API. Bouw in `onOpen()` alleen het menu op; de zwaardere functies erachter vragen pas toestemming op het moment dat de gebruiker erop klikt. ::: ## Een rijker dialoogvenster met HtmlService Wil je een echt formulier met meerdere velden in plaats van losse prompts, gebruik dan `ui.showModalDialog()` met een HTML-bestand: ```javascript function toonFormulier() { const html = HtmlService.createHtmlOutputFromFile('Formulier') .setWidth(400) .setHeight(300); SpreadsheetApp.getUi().showModalDialog(html, 'Klantgegevens'); } ``` Maak in het project een HTML-bestand met de naam Formulier en plaats daar je invoervelden en een knop in. Met `google.script.run` roep je vanuit het venster weer een serverfunctie aan. :::howto title="Een werkend menu opzetten" 1. Open je bestand en ga naar Extensies en dan Apps Script, zodat je een gekoppeld script maakt. 2. Schrijf een functie `onOpen()` die de Ui-service ophaalt met `getUi()`. 3. Maak een menu met `createMenu()` en geef het een duidelijke naam. 4. Voeg per actie een `addItem()` toe met label en functienaam. 5. Sluit af met `addToUi()` zodat het menu verschijnt. 6. Sla op en herlaad het bestand; test elk menu-item. ::: :::faq ### Waarom verschijnt mijn menu niet? Het menu wordt pas bij het openen van het bestand opgebouwd. Herlaad de spreadsheet of het document na het opslaan van je script. Controleer ook of je script gekoppeld is aan het bestand en niet een losstaand script in Drive is. ### Kan ik in onOpen een mail sturen? Nee. De simpele `onOpen`-trigger heeft beperkte rechten. Zet de mailfunctie achter een menu-item, dat draait wel met volledige rechten nadat de gebruiker erop klikt en eenmalig toestemming geeft. ### Hoe maak ik een dialoogvenster met een formulier? Met `ui.showModalDialog()` en een HTML-bestand via `HtmlService` bouw je een rijker venster met eigen invoervelden. Met `google.script.run` stuur je de ingevulde gegevens terug naar je script. ### Werkt dit ook in Google Docs? Ja. Gebruik `DocumentApp.getUi()` in plaats van `SpreadsheetApp.getUi()`; de rest is identiek. Hetzelfde geldt voor Slides met `SlidesApp.getUi()` en Forms met `FormApp.getUi()`. ### Waarom verschijnt mijn menu twee keer? Menu's met dezelfde naam vervangen elkaar, maar als je per ongeluk twee verschillende namen of twee `addToUi()`-aanroepen gebruikt, krijg je dubbele menu's. Bouw alles in een enkele `onOpen()` op. ### Kan de invuller van een Google Form mijn menu zien? Nee. In Forms verschijnt een aangepast menu alleen voor bewerkers in de editor, niet voor de mensen die het formulier invullen. ::: ## Volgende stap Een aangepast menu maakt van je script een echte interne tool. Voeg er een knop aan toe die een PDF genereert, zie [[apps-script-pdf-genereren|automatisch PDF-documenten genereren]], of die een rapport mailt, zie [[apps-script-email-sturen|e-mails versturen via Gmail]].