Activadores de los complementos de Editores

Los activadores de Apps Script hacen que se ejecute una función de secuencia de comandos específica (la función de activación) cada vez que ocurre un evento específico. Solo ciertos eventos pueden hacer que se activen los activadores, y cada aplicación de Google Workspace admite un conjunto diferente de eventos.

Cuando se activa un activador, se crea un objeto de evento. Esta estructura JSON contiene detalles sobre el evento que ocurrió. La información en la estructura del objeto de evento se organiza de manera diferente según el tipo de activador.

Una vez que se crea el objeto del evento, Apps Script lo pasa como parámetro a la función del activador. La función activadora es una función de devolución de llamada que debes implementar por tu cuenta a fin de realizar las acciones apropiadas para responder al evento. Por ejemplo, en un complemento de editor, se usa un activador a fin de crear elementos de menú del complemento cuando se abre un documento. En este caso, implementas en la función del activador onOpen(e) para crear los elementos de menú que necesita el complemento, posiblemente con los datos en el objeto de evento.

En esta página, se proporcionan lineamientos sobre el uso de activadores en proyectos de complementos del editor.

Tipos de activadores del complemento del editor

Puedes usar la mayoría de los tipos de activadores genéricos disponibles para los proyectos de Apps Script en los complementos de Editor, incluidos los activadores simples y la mayoría de los activadores instalables. El conjunto exacto de tipos de activadores disponibles depende de la aplicación que se extiende.

En la siguiente tabla, se muestran los tipos de activadores instalables y simples que pueden usar los complementos de Editor, y se proporcionan vínculos a los objetos de evento correspondientes:

Evento Objeto de evento Activadores simples Activadores instalables
Abrir
Se abrirá un archivo de editor.
Objeto de evento onOpen de Documentos
Objeto de evento onOpen de Formularios
Objeto de evento onOpen de Hojas de cálculo
Objeto de evento onOpen de Presentaciones
Documentos
Formularios*
Hojas de cálculo
Presentaciones

function onOpen(e)

Documentos
Formularios
Hojas de cálculo
Instalar
El complemento está instalado.
Objeto de evento onInstall Documentos
Formularios
Hojas de cálculo
Presentaciones

function onInstall(e)

Editar
Se cambió el contenido de la celda de la hoja de cálculo.
Objeto de evento onEdit de Hojas de cálculo Hojas de cálculo

function onEdit(e)

Hojas de cálculo
Cambiar
Se edita el contenido de una hoja o se le da formato.
Objeto de evento Sheets onChange Hojas de cálculo
Envío de formulario
Se envía un formulario de Google.
Objeto de evento de envío de formulario de formularios
Objeto de evento de envío de formulario de Hojas de cálculo
Formularios
Hojas de cálculo
Basado en tiempo (reloj)
El activador se activa en un momento o intervalo especificado.
Objeto de evento basado en el tiempo Documentos
Formularios
Hojas de cálculo
Presentaciones

* El evento abierto de Formularios de Google no se produce cuando un usuario abre un formulario para responder, sino cuando un editor abre el formulario para modificarlo.

Activadores simples en los complementos

Los activadores simples usan un conjunto de nombres de funciones reservados, no pueden usar servicios que requieran autorización y se habilitan automáticamente para su uso. En algunos casos, un activador instalable puede controlar un evento de activación simple.

Para agregar un activador simple a un complemento, solo debes implementar una función con uno de los siguientes nombres reservados:

  • onOpen(e) se ejecuta cuando un usuario abre un documento, una hoja de cálculo o una presentación. onOpen(e) también se puede ejecutar cuando se abre un formulario en el editor (pero no cuando se responde al formulario). Solo se ejecuta si el usuario tiene permiso para editar el archivo en cuestión y se usa con mayor frecuencia para crear elementos de menú.
  • onInstall(e) se ejecuta cuando un usuario instala un complemento. Por lo general, onInstall(e) solo se usa para llamar a onOpen(e); esto garantiza que los menús de complementos aparezcan inmediatamente después de la instalación sin necesidad de que el usuario actualice la página.
  • onEdit(e) se ejecuta cuando un usuario cambia el valor de una celda en una hoja de cálculo. Este activador no se activa en respuesta a los movimientos, el formato o los demás cambios de las celdas que no alteren los valores de las celdas.

Restricciones

Los activadores simples de los complementos están sujetos a las mismas restricciones que rigen los activadores simples en otros tipos de proyectos de Apps Script. Ten en cuenta estas restricciones cuando diseñes complementos:

  • Los activadores simples no se ejecutan si un archivo se abre en modo de solo lectura (ver o comentario). Este comportamiento evita que se propaguen los menús de complementos.
  • En ciertas circunstancias, los complementos de Editor ejecutan sus activadores simples onOpen(e) y onEdit(e) en un modo sin autorización. Este modo presenta algunas complicaciones adicionales, como se describe en el modelo de autorización de complementos.
  • Los activadores simples no pueden usar servicios ni realizar otras acciones que requieran autorización, excepto lo que se describe en el modelo de autorización de complementos.
  • Los activadores simples no se pueden ejecutar por más de 30 segundos. Asegúrate de minimizar la cantidad de procesamiento realizado en una función de activación simple.
  • Los activadores simples están sujetos a los límites de cuota de activadores de Apps Script.

Activadores instalables en complementos

Los complementos pueden crear y modificar de manera programática activadores instalables con el servicio Script de Apps Script. Los activadores instalables de complementos no se pueden crear de forma manual. A diferencia de los activadores simples, los activadores instalables pueden usar servicios que requieren autorización.

Los activadores instalables de los complementos no envían correos electrónicos de error al usuario cuando se encuentran con errores, ya que, en la mayoría de los casos, el usuario no puede solucionar el problema. Por este motivo, siempre que sea posible, debes diseñar tu complemento para manejar los errores de forma elegante en nombre del usuario.

Los complementos pueden usar los siguientes activadores instalables:

  • Los activadores instalables Open se ejecutan cuando un usuario abre un documento o una hoja de cálculo, o cuando se abre un formulario en el editor (pero no cuando se responde al formulario).
  • Los activadores instalables Edit se ejecutan cuando un usuario cambia el valor de una celda en una hoja de cálculo. Este activador no se activa en respuesta al formato ni a otros cambios que no alteren los valores de las celdas.
  • Los activadores instalables de Cambio se ejecutan cuando un usuario realiza cualquier cambio en una hoja de cálculo, lo que incluye las ediciones de formato y las modificaciones en la hoja de cálculo en sí (por ejemplo, agregar una fila).
  • Los activadores instalables de formulario de envío se ejecutan cuando se envía una respuesta de un formulario de Google.

  • Los activadores basados en el tiempo (también llamados activadores de reloj) se activan a una hora específica o de forma repetida en un intervalo de tiempo regular.

Autoriza activadores instalables

Por lo general, si un desarrollador actualiza un complemento para usar servicios nuevos que requieren autorización adicional, se les solicita a los usuarios que vuelvan a autorizar el complemento la próxima vez que lo usen.

Sin embargo, los complementos que usan activadores encuentran desafíos de autorización especiales. Imagina un complemento que usa un activador para supervisar los envíos de formularios: un creador de formularios podría autorizar el complemento la primera vez que lo usa y, luego, dejar que se ejecute durante meses o años sin volver a abrir el formulario. Si el desarrollador del complemento actualizara el complemento para usar servicios nuevos que requieren autorización adicional, el creador del formulario nunca vería el diálogo de reautorización porque nunca volvió a abrir el formulario y el complemento dejaría de funcionar.

A diferencia de los activadores de los proyectos normales de Apps Script, los activadores de los complementos continúan activándose incluso si necesitan volver a autorizarse. Sin embargo, la secuencia de comandos falla si alcanza una línea de código que requiere autorización que la secuencia de comandos no tiene. A fin de evitar esta situación, los desarrolladores pueden usar el método ScriptApp.getAuthorizationInfo() para restringir el acceso a partes de código que cambiaron entre las versiones publicadas del complemento.

A continuación, se muestra un ejemplo de la estructura recomendada para usar en las funciones del activador a fin de evitar errores de autorización. La función del activador de ejemplo responde a un evento de envío de formulario dentro de un complemento de Hojas de cálculo de Google y, si se requiere una nueva autorización, envía al usuario del complemento un correo electrónico de alerta con una plantilla de HTML.

Code.gs

activadores/form/Code.gs
/**
 * Responds to a form when submitted.
 * @param {event} e The Form submit event.
 */
function respondToFormSubmit(e) {
  const addonTitle = 'My Add-on Title';
  const props = PropertiesService.getDocumentProperties();
  const authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);

  // Check if the actions of the trigger requires authorization that has not
  // been granted yet; if so, warn the user via email. This check is required
  // when using triggers with add-ons to maintain functional triggers.
  if (authInfo.getAuthorizationStatus() ===
    ScriptApp.AuthorizationStatus.REQUIRED) {
    // Re-authorization is required. In this case, the user needs to be alerted
    // that they need to re-authorize; the normal trigger action is not
    // conducted, since it requires authorization first. Send at most one
    // "Authorization Required" email per day to avoid spamming users.
    const lastAuthEmailDate = props.getProperty('lastAuthEmailDate');
    const today = new Date().toDateString();
    if (lastAuthEmailDate !== today) {
      if (MailApp.getRemainingDailyQuota() > 0) {
        const html = HtmlService.createTemplateFromFile('AuthorizationEmail');
        html.url = authInfo.getAuthorizationUrl();
        html.addonTitle = addonTitle;
        const message = html.evaluate();
        MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
            'Authorization Required',
            message.getContent(), {
              name: addonTitle,
              htmlBody: message.getContent()
            }
        );
      }
      props.setProperty('lastAuthEmailDate', today);
    }
  } else {
    // Authorization has been granted, so continue to respond to the trigger.
    // Main trigger logic here.
  }
}

correo_de_autorización.html

activadores/form/AuthorizationEmail.html
<p>The Google Sheets add-on <i><?= addonTitle ?></i> is set to run automatically
    whenever a form is submitted. The add-on was recently updated and it needs you
    to re-authorize it to run on your behalf.</p>

<p>The add-on's automatic functions are temporarily disabled until you
    re-authorize it. To do so, open Google Sheets and run the add-on from the
    Add-ons menu. Alternatively, you can click this link to authorize it:</p>

<p><a href="<?= url ?>">Re-authorize the add-on.</a></p>

<p>This notification email will be sent to you at most once per day until the
    add-on is re-authorized.</p>

Restricciones

Los activadores instalables de los complementos están sujetos a las mismas restricciones que rigen los activadores instalables en otros tipos de proyectos de Apps Script.

Además de estas restricciones, se aplican varias restricciones a los activadores instalables en complementos, específicamente:

  • Cada complemento solo puede tener un activador de cada tipo, por usuario y por documento. Por ejemplo, en una hoja de cálculo determinada, un usuario determinado solo puede tener un activador de edición, aunque el usuario también podría tener un activador de envío de formulario o uno basado en el tiempo en la misma hoja de cálculo. Un usuario diferente con acceso a la misma hoja de cálculo podría tener su propio conjunto independiente de activadores.
  • Los complementos solo pueden crear activadores para el archivo en el que se usa. Es decir, un complemento que se usa en el Documento de Google A no puede crear un activador para supervisar cuándo se abre el Documento de Google B.
  • Los activadores basados en el tiempo no pueden ejecutarse con más frecuencia que una vez por hora.
  • Los complementos no envían automáticamente un correo electrónico al usuario cuando el código que ejecuta un activador instalable arroja una excepción. Depende del desarrollador verificar y manejar los casos de falla con facilidad.
  • Los activadores de complementos dejan de activarse en cualquiera de las siguientes situaciones:
    • Si el usuario desinstala el complemento,
    • Si el complemento está inhabilitado en un documento (si se vuelve a habilitar, el activador vuelve a estar en funcionamiento) o
    • Si el desarrollador anula la publicación del complemento o envía una versión dañada a la tienda de complementos.
  • Las funciones del activador de complementos se ejecutan hasta llegar a un código que usa un servicio no autorizado y, en ese momento, se detienen. Esto es así solo si se publica el complemento; el mismo activador en un proyecto normal de Apps Script o un complemento no publicado no se ejecuta en absoluto si alguna parte de la secuencia de comandos necesita autorización.
  • Los activadores instalables están sujetos a los límites de cuota de activadores de Apps Script.