En este artículo vemos como crear un menú personalizado en Google Sheets para poder llamar a nuestros códigos y macros de manera rápida.
Pueden ver este tutorial en video
Hay varias formas de ejecutar funciones personalizadas, macros o códigos de Google Apps Script (GAS). Entre ellos están:
- Un botón
- Desde el menú de macros (si son macros grabadas)
- Automáticamente:
- Al abrir un archivo
- Al editar algo del archivo
- A alguna hora del día
- Cuando se envíe un formulario
- Crear menús personalizados
Que es un menú personalizado
Un menú personalizado es básicamente una macro que se ejecuta al abrir un archivo específico y que nos da la posibilidad de ejecutar nuestras macros (de ese archivo) desde un menú nuevo que solo nos aparecerá en ese archivo.

Ventajas
- Es muy fácil ejecutarlo
- Se posiciona convenientemente
- Puedo ser muy descriptivo acerca de lo que hace
- Es muy fácil de ubicar
- Puedo categorizarlo en menús y submenús
- Puedo tener varios menús para ubicar diversas macros
Desventajas
- Mas de uno o dos menus ya no se van a ver
- No se puede ejecutar en un celular
Como crear un menú personalizado
Hay un par de maneras de crear un menú personalizado, todas a través de Google Apps Script.
Son esencialmente 4 pasos:
- Crear el menú
- Crear los ítems
- Agregar el menú as nuestra interfase
- Asegurarse que se ejecute al abrir el archivo
Crear el menú
Para crear el menú debemos acceder al método getUi() de nuestra hoja de cálculo.
Fíjense que esto es independiente de cualquier hoja individual. Es una propiedad de nuestro archivo
Una vez invoquemos el método getUi, llamamos el método createMenu, el cual recibe el título que queremos que aparezca en nuestro menú.
Una vez lo invoquemos lo vamos a guardar en una variable para diferenciar ese menú específico. A continuación un ejemplo:
var menu = SpreadsheetApp.getUi().createMenu("Mis funciones");
Crear los items
Después debemos agregar los ítems que van a aparecer o desplegar una vez dé clic sobre el menú. Esto lo hacemos con el comando addItem
addItem recibe dos argumentos: el título que vamos a mostrar en el ítem, y la función que vamos a ejecutar. Los dos van en comillas, y la función va sin paréntesis.
Obviamente la función ya debe estar creada.
Sigamos con nuestro ejemplo:
menu.addItem("Hacer algo", "miPrimeraFuncion");
Si tengo varias funciones que quiero ejecutar desde mi menú simplemente repito esta línea las veces que quiera, cambiando el nombre y la función.
Tengan en cuenta que el orden en que los creemos en nuestro código, será el código en el que aparecerán en nuestro menú.
Agregar el menú a la interfase
Ya tenemos creado el menú, pero no “le hemos dicho” a Sheets que lo incluya en nuestra interfase.
Esto se hace muy fácil con el método addtoUi dentro del mismo menú:
menu.addToUi();
Asegurarse que se ejecute al abrir
Para que nuestro menú se cree cada vez que yo abra mi archivo tengo que llamarlo desde un evento onOpen.
Tengo dos opciones entonces:
- Escribir todo el código dentro de una función onOpen
- Escribir el código en una función y después llamar esa función dentro de un onOpen
Yo prefiero la segunda. Es más robusta, ya que me permite llamar más menús y otras funciones potenciales en mi onOpen
¡Y listo! Ya con esto ya tenemos nuestro primer menú.
A continuación todo el código
//Ejecutar cada vez que se abra el archivo
function onOpen(){
crearMenu();
}
//crear nuestro menú
function crearMenu() {
//Creamos el menú
var menu = SpreadsheetApp.getUi().createMenu("Mis funciones");
//Añadimos los items con sus funciones
menu.addItem("Mi Primera función", "numeroUno");
menu.addItem("Mi segunda función", "numeroDos");
//Agregamos el menu
menu.addToUi();
}
function numeroUno(){
//Comandos
}
function numeroDos(){
//Comandos
}
Otras opciones
Con el código de arriba ya pueden crear sus primeros menús.
Sin embargo hay más cosas que podemos hacer dentro de nuestro menú
Submenús

Un submenú es un menú que aparece cuando me ubico sobre uno de los ítems de mi menú
Es básicamente un menú que de alguna manera agrego en mi menú principal
Para crear un submenu, seguimos los iguientes pasos
- Creamos un nuevo menú
- Creamos los ítems de este nuevo menú
- Agregamos este menú al menú principal
var menu2 = SpreadsheetApp.getUi().createMenu("Mi submenú");
menu2.addItem("Mi función específica", "nuevaFunción");
menu.addSubMenu(menu2);
Separadores
Cuando tengo varios ítems dentro de mi menú personalizado puedo querer usar un separador para tener diferentes categorías.
El separador se agrega con el método addSeparator desde nuestro menú y lo posicionamos después del ítem que queramos
menu.addSeparator();
Decorando nuestros menús
No hay mucho que podamos cambiar de nuestros menús en cuanto a formato (colores, fuentes, etc)
Lo que si podemos hacer para personalizar nuestros menús es usar emoticones o símbolos.
Simplemente desde nuestro mismo código podemos pegar el emoticón que queremos usar al lado del texto.
menu.addItem("Enviar 😊", "numeroUno");
menu.addItem("Programar ⌛", "numeroDos");
Conclusión
Como pueden ver, no es tan difícil agregar menús personalizados a nuestros archivos de Sheets. Es una manera muy fácil de tener todas nuestras macros y funciones personalizadas organizadas dentro de un solo repositorio, muy conveniente y fácil de usar.
También pudieron observar que no hay tantas opciones, lo que facilita su implementación
Cuéntenme en los comentarios si les ha sido útil usar menús personalizados.
Me sale este erro, pero cuando ejecuto el mismo codigo en una hoja nueva si me funciona. A que se debe este error?
9:45:33 Error
Exception: Cannot call SpreadsheetApp.getUi() from this context.
onOpen @ PQR_Codes.gs:3
Hola Andres
Tienes variables globales?
Saludos!
Puedo quitar opciones del menú (Datos-Formato-etc.) original de Google Sheets (Hojas de calculo) ??
Hasta donde yo se, no
Saludos!
Como puedo eliminar un menú que cree y ya no lo quiero. Desde ya muchas gracias.
Buenas tardes.
Se podría hacer que este menú fuera visible para todos los miembros de una Google Workspace?
Hola!
Tendríamos que hacer un complemento.
Espero pronto hacer un video o artículo de eso
Saludos!
Saludos una pregunta, cuanto es el maximo de menus y de submenus que puedes crear????
Hola Manuel
Muy buena pregunta
No se si haya un límite
Me imagino que tambien tiene que ver con hasta que punto ya no es intuitivo tener más menús.
Tampoco se cuantos “niveles” de submenus se puedan hacer.
Me avisas si llegas al máximo
Saludos!
Hola! muy bueno, pero no me corre al abrir la planilla. Sí corre cuando le doy ejecutar una vez abierto. En ningún momento le digo en qué sheet quiero que se cree el menú. Eso no es necesario con el onOpen?
A mí me ocurrió lo mismo. Simplemente puse la función dentro de un activador que se ejecuta al abrir el archivo y funcionó perfectamente.
Esto normalmente pasa cuando llaman a servicios adicionales como FormApp, DriveApp o similares.
Una posible causa es que estos servicios se llaman por fuera de las funciones.
Como bien dice Norberto, los activadores instalables, si pueden llamar servicios por eso le funciona
Lo malo de esos activadores es que si haces una copia, no te trae el activador
Saludos!
Pudiste solucionar?
Hubo alguna respuesta del autor?
Hola!
No es necesario definir una hoja
A veces puede haber algún error cuando tienes variables globales
Saludos!