Custom menus for Editor add-ons

  • Published Editor Add-ons can create custom menu items under the Extensions menu using Ui.createAddonMenu() and Menu.addItem(), typically within the add-on's onOpen(e) method.

  • While unpublished add-ons can create top-level menus, it's recommended to use Ui.createAddonMenu() for published add-ons to ensure consistent user experience.

  • Add-ons must create an initial menu before user authorization and adjust menu items dynamically based on the authorization mode (ScriptApp.AuthMode) to avoid errors.

  • The provided example demonstrates building a dynamic add-on menu that adapts to different authorization modes, using ScriptApp.AuthMode.NONE to control actions requiring authorization.

Published Editor add-ons can create custom menu items under their editor's Extensions menu. You can insert an add-on menu by using the Ui.createAddonMenu() method and add items to it using the Menu.addItem() method. Menus are usually created in the add-on's onOpen(e) method.

You can create dynamic menus that change based on user interactions or add-on state. However, add-ons must create an initial menu before the add-on is authorized by the user. Because of this, you must check the add-on's authorization mode prior to constructing menus in onOpen(e). Do not attempt to take any action that requires authorization (such as checking the script Properties) while the add-on is in ScriptApp.AuthMode.NONE. See the authorization lifecycle for more details on the authorization modes and lifecycle.

The following example shows how to build a dynamic add-on menu for different authorization modes:

functiononOpen(e){
varmenu=SpreadsheetApp.getUi().createAddonMenu();//OrDocumentApporSlidesApporFormApp.
if(e && e.authMode==ScriptApp.AuthMode.NONE){
//Addanormalmenuitem(worksinallauthorizationmodes).
menu.addItem('Start workflow','startWorkflow');
}else{
//Addamenuitembasedonproperties(doesn't work in AuthMode.NONE).
varproperties=PropertiesService.getDocumentProperties();
varworkflowStarted=properties.getProperty('workflowStarted');
if(workflowStarted){
menu.addItem('Check workflow status','checkWorkflow');
}else{
menu.addItem('Start workflow','startWorkflow');
}
//Recordanalytics.
UrlFetchApp.fetch('http://www.example.com/analytics?event=open');
}
menu.addToUi();
}

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025年10月13日 UTC.