Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

Een aangepast menu toevoegen aan Sheets of Docs met Apps Script

Leer een aangepast menu toevoegen aan Google Sheets of Docs met Apps Script via de onOpen-functie en de Ui-service, met menu-items, submenus en dialoogvensters voor je collega's.

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.

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.

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

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

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:

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:

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();
}
lightbulb

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:

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.

warning

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:

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.

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.
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 automatisch PDF-documenten genereren, of die een rapport mailt, zie e-mails versturen via Gmail.