Cómo hacer un menú dentro de una hoja de cálculo con Google Apps Script

Hay ocasiones en que necesitamos crear funcionalidades nuevas para nuestras hojas de cálculo y nos interesa que los usuarios de esa hoja puedan usar esa funcionalidad.

La manera  más sencilla es mediante menús contextuales tal como si fueran funciones que nos ofrece el mismo Google

Hay varias maneras de hacer esto pero os enseñaré la más actual ya que hay el riesgo que las otras maneras queden obsoletas en breve. Tranquilos que no es complicado.

Como siempre, con un ejemplo lo veréis más claro

function onOpen()
{
  var ui = SpreadsheetApp.getUi();
  var rrhh = ui.createMenu('Recursos Humanos')
                  .addItem('Contratar', 'Contract')
                  .addItem('Despedir', 'Fire');

  ui.createMenu('Menu Adicional')
      .addItem('Contabilidad', 'Contability')
      .addSeparator()
      .addSubMenu(rrhh)
      .addToUi();
}

function Contability() {
  SpreadsheetApp.getUi().alert('Vamos a contabilizar cosas!!!');
}

function Contract() {
  SpreadsheetApp.getUi().alert('Se contrata un nuevo trabajado!');
}

function Fire() {
  SpreadsheetApp.getUi().alert('Hay uno que ya no trabaja aqui!');
}

Lo veis? Sencillo.

Si ejecutáis el onOpen veréis como aparece en vuestro spreadsheet un menú que estéticamente es idéntico a cualquier otro que venga de serie con las hojas de cálculo de Drive.


Los menús son una manera muy sencilla de enriquecer las funcionalidades de una hoja de cálculo de Google, espero que lo aprovechéis.

NOTA: Si queréis poner un botón en el spreadsheet ( no el menú superior) tal vez te interese este artículo sobre como asignar un script a un botón

23 comentarios:

  1. HOLA ...muy bueno el ejemplo... quisiera saber como hacer que al darle click a un menu me abra un libro de la hoja de calculo... muchas gracias

    ResponderEliminar
    Respuestas
    1. Te tengo que decir que no se si puede hacer. Puedes poner un link en un hoja de calculo ( en una celda ) = HYPERLINK(enlace,texto); pero desde GAS me parece que no lo podrás hacer.

      Nos vemos

      Eliminar
  2. MUCHAS GRACIAS... OSEA QUE NO SE PUEDE TRABAJAR EN DISEÑAR UN MENU PERSONALIZADO QUE AL DARLE CLICK A LAS OPCIONES TE ABRA UNA HOJA DEL LIBRO

    ResponderEliminar
  3. A priori te diria que no, pero si encuentras la manera, por favor, hazmelo llegar.

    ResponderEliminar
  4. Me puedes comentar como hacer automática la autorización del scrip o function , para las personas q tienen ya compartido el documeto, gracias

    ResponderEliminar
    Respuestas
    1. Diria que es imposible. Cada usuario debe autorizar con sus permisos. La manera que no te pida permisos es o bien que lo que hagas no pida permisos ( practicamente imposible ) o bien que el script lo implementes como ejecutado por ti, de forma que solo tu dandole permisos ya seria suficiente, pero esta opción no siempre es la correcta.

      Siento no poder darte una solución mejor.

      Eliminar
  5. Hola Pako, ¿es posible programar el botón para que ejecute varios scripts con un sólo clic?

    ResponderEliminar
    Respuestas
    1. Podrias anidar todas las funciones dentro de otra, por ejemplo

      FuncionPrincipal () {
      Funcion1 ();
      Fucion2 ();
      }

      Eliminar
  6. como se le pudiera hacer para que en cada opción abra una hoja diferente?

    ResponderEliminar
    Respuestas
    1. hola,

      La forma más fácil es que cada opción llamara a una función diferente y dentro de cada función que tuvieras algo de este estilo:
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName("nombre-de-hoja-que-quieres-activar").setActiveSelection("A1");

      Con eso irás directamente a la página que tu quieras.

      Ya me contarás como te va

      Nos vemos

      Eliminar



    2. Lo que me funciono fue este scrip que me encontre en el foro, de todas formas muchas gracias por tu apoyo.

      function irHoja2() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Hoja 2');
      ss.setActiveSheet(sheet);
      }

      Eliminar
    3. totalmente válido

      Gracias por compartirlo

      Nos vemos

      Eliminar
  7. Hola muy buena tarde.

    Me gustaría saber cómo hago para poner una imágen en los menús que creo.

    Cómo los que están por ejemplo en el menú Archivo/Mover a... o el de enviar a la papelera.

    De antemano muchas gracias

    ResponderEliminar
    Respuestas
    1. Hasta donde yo se no es posible hacerlo, pero bueno, si alguien es capaz de conseguirlo que diga algo, yo estaria encantado de saberlo.

      Nos vemos

      Eliminar
  8. Hola buenos días
    Tengo el inconveniente que el archivo que he creado debe funcionar para dispositivos móviles, y en estos no sale el menú como lo vemos en la aplicación de escritorio, así que no se puede ejecutar la sentancia de comandos (He creado una opción en el menú). Quisiera saber si hay forma de poner un ícono en el menú donde se encuentran las opciones para elegir fuente o tamaño de la misma.

    O si tienen otra opción o idea sería excelente. También he probado poniendo una imagen y asignarle a esta la secuencia pero de nuevo solo funciona desde la aplicación de escritorio, no desde el dispositivo móvil.

    De antemano muchas gracias.

    ResponderEliminar
    Respuestas
    1. Es raro.

      Entiendo que hablas de la aplicacion movil. Prueba a actualizarla, aunque realmente me lo creo que te de problemas, no eres el primero .

      Una posible solucion seria acceder a la hoja a través del navegador del movil. Con eso si que deberia funcionarte tanto los menus de la barra superior como scripts linkados a imagenes.

      Lo que comentas de poner scripts en la zona de opciones, desconozco si pudiera existir alguna posibilidad, pero me parece raro. Sinceramente nunca lo he visto.

      Pruebalo con el browser , te irá mejor.

      Eliminar
    2. Ha pasado ya bastante, pero espero que le sirva a otras personas, puedes mirarte este link: https://googleappscriptsweb.blogspot.com/2020/08/como-ejecutar-un-google-script-desde-un-boton.html

      Eliminar
  9. hola por favor deseo responder a un formulario y cree en gloogle sheets un script para que responda automaticamente una vez lleno el formulario el tema es que deseo poner un link dentro del cuerpo del script lo hago en html pero no me sale para dar el clic y se diriga a la pagina respectiva

    ResponderEliminar
    Respuestas
    1. Te refieres a enviar un correo cuando alguien llena un formulario?

      Si se puede hacer. A ver si puedo ponerme este fin de semana y hago un tutorial sobre esto

      Nos vemos

      Eliminar
  10. Hola!
    De antemano, muchas gracias por la información, me ha resultado muy util.
    Por otra parte, quisiera consultarte si existe algun codigo con el cual pueda ofrecer al usuario la opción de descargar la hoja de calculo pero solo en formato PDF

    De nuevo muchas gracias y saludos!

    ResponderEliminar
    Respuestas
    1. Si, existe, de hecho lo que mejor podrias hacer es mirarte este tutorial: https://googleappscriptsweb.blogspot.com/2020/08/como-crear-un-pdf-de-una-seleccion-con-google-scripts.html . En vez de llamar a la url que generas podrias darle al usuario la url de descarga del PDF. No es complicado. Miratelo y si tienes problemas hazmelo saber

      Nos vemos

      Eliminar
  11. Hola Qué tal? Estoy buscando la forma de elaborar el código para crear una ventana de búsqueda para localizar hojas de cálculo de todo el book que tengo abierto en el sheets. Yo tenía un código que utilice en una macro en excel en VBA, pero me cuesta trasladarlo a Google Script y quisiera saber si me podrían recomendar la forma en que pueda reemplazar el código o si es posible hacer esto con una macro en Sheets o cuales comandos debería utilizar, ya que para poder declarar las variables como Boolean y String, no encuentro el modo. Graciaaaas

    Este es mi código de VBA:

    Sub buscarHoja()
    Dim existe As Boolean
    Dim NombreHoja As String
    Dim cont As Integer
    NombreHoja = InputBox("ingresar el nombre de la hoja") existe = False
    For cont = 1 To Worksheets.Count If Worksheets(cont).Name Like "*" & NombreHoja & "*" Then
    existe = True
    Exit For
    End If

    Next

    If existe = False Then
    MsgBox " no ne encontro existencia de la hoja!"
    Else
    Sheets(Worksheets(cont).Name).Select
    End If

    End Sub

    ResponderEliminar
    Respuestas
    1. Buenas, poderse , se puede hacer pero dado que tiene pinta de ser un proyecto empresarial te emplazaria a que me contactaras a un nivel más profesional :) : https://www.tutorialesgoogleappscripts.com/p/como-contratar-mis-servicios-de.html No creo que salga caro, de hecho tiene pinta d ser un proyecto bastante asequible. Estamos en contacto y lo hablamos

      Eliminar

Tal vez te interese