Crear un menú personalizado en Google Sheets

Menu Personalizado en Google Sheets
— by

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:

  1. Crear el menú
  2. Crear los ítems
  3. Agregar el menú as nuestra interfase
  4. 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.

Suscríbete para acceder al curso «Descubriendo el poder de Google Sheets» y empezar tu camino a la maestría de Sheets, Forms y Apps Script

Boletín

Nuestras últimas noticias en tu correo electrónico

Respuestas

  1. Avatar de Andres Santa
    Andres Santa

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Andres

      Tienes variables globales?

      Saludos!

  2. Avatar de NICOLAS
    NICOLAS

    Puedo quitar opciones del menú (Datos-Formato-etc.) original de Google Sheets (Hojas de calculo) ??

    1. Avatar de jsguzmanb
      jsguzmanb

      Hasta donde yo se, no
      Saludos!

  3. Avatar de Adolfo
    Adolfo

    Como puedo eliminar un menú que cree y ya no lo quiero. Desde ya muchas gracias.

  4. Avatar de idi
    idi

    Buenas tardes.

    Se podría hacer que este menú fuera visible para todos los miembros de una Google Workspace?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Tendríamos que hacer un complemento.

      Espero pronto hacer un video o artículo de eso

      Saludos!

  5. Avatar de Manuel
    Manuel

    Saludos una pregunta, cuanto es el maximo de menus y de submenus que puedes crear????

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  6. Avatar de Luz
    Luz

    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?

    1. Avatar de Norberto Adamoli
      Norberto Adamoli

      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.

      1. Avatar de jsguzmanb
        jsguzmanb

        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!

    2. Avatar de Juan Carlos
      Juan Carlos

      Pudiste solucionar?
      Hubo alguna respuesta del autor?

      1. Avatar de jsguzmanb
        jsguzmanb

        Hola!

        No es necesario definir una hoja

        A veces puede haber algún error cuando tienes variables globales

        Saludos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Pin It on Pinterest

Share This