Crea un temario para las reuniones

Nivel de programación: Principiante
Duración: 15 minutos
Tipo de proyecto: Automatización con un activador controlado por eventos

Objetivos

  • Comprender lo que hace la solución
  • Comprender lo que hacen los servicios de Apps Script en la solución
  • Configura la secuencia de comandos.
  • Ejecuta la secuencia de comandos.

Acerca de esta solución

Crea automáticamente documentos con el temario en Documentos de Google y adjúntalos a las reuniones del Calendario de Google.

Se agregó una captura de pantalla de la agenda al evento de Calendario

Cómo funciona

El guion crea una plantilla de documento para una agenda. Cuando actualizas tu calendario, la secuencia de comandos verifica si algún evento que te pertenece incluye “#agenda” en la descripción. Si la etiqueta está presente, la secuencia de comandos crea una copia de la plantilla, la agrega al evento de calendario y la comparte con los asistentes del evento.

Servicios de Apps Script

En esta solución, se usan los siguientes servicios:

  • Servicio de Drive: Comprueba si el documento de plantilla existe y, si no existe, crea una carpeta nueva para el documento de plantilla. Crea una copia del documento de plantilla para cada agenda nueva.
  • Servicio de documentos: Crea la plantilla de agenda.
  • Servicio de Calendario: Busca eventos con la etiqueta "#agenda" y actualiza la descripción del evento con un vínculo al documento de la agenda.
  • Servicio base: Usa la clase Session para obtener el correo electrónico del usuario. Esto ayuda a compilar el activador para el usuario actual.
  • Servicio de secuencias de comandos: Crea un activador que se activa cada vez que se produce un cambio en el calendario del usuario.

Requisitos previos

Para usar esta muestra, necesitas los siguientes requisitos previos:

  • Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran la aprobación del administrador)
  • Un navegador web con acceso a Internet

Configura la secuencia de comandos

  1. Haz clic en el siguiente botón para abrir el proyecto de muestra Crea una agenda para reuniones de Apps Script.
    Abre el proyecto.
  2. Haz clic en Overview .
  3. En la página de resumen, haz clic en Crear una copia El ícono para hacer una copia.
  4. En el proyecto copiado, selecciona setUp en el menú desplegable de funciones.
  5. Haz clic en Ejecutar.
  6. Cuando se te solicite, autoriza la secuencia de comandos. Si la pantalla de consentimiento de OAuth muestra la advertencia Esta app no está verificada, selecciona Configuración avanzada > Ir a {Nombre del proyecto} (no seguro).

Ejecuta la secuencia de comandos:

  1. Abre el Calendario de Google.
  2. Crea un evento nuevo o edita uno existente.
  3. En la descripción, agrega #agenda y guarda el evento.
  4. Busca en tu correo electrónico una notificación en la que se indique que se compartió un documento contigo, o bien actualiza el Calendario y vuelve a hacer clic en el evento para ver el vínculo al documento de la agenda.

Todos los asistentes recibirán la notificación por correo electrónico para ver la agenda. La secuencia de comandos otorga permiso a los asistentes para editarlo, pero puedes editarla para actualizar los permisos del documento de la agenda de los asistentes.

Revisa el código

Para revisar el código de Apps Script de esta solución, haz clic en Ver código fuente a continuación:

Consulta el código fuente

Code.gs

solutions/automations/agenda-maker/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/agenda-maker

/*
Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/**
 * Checks if the folder for Agenda docs exists, and creates it if it doesn't.
 *
 * @return {*} Drive folder ID for the app.
 */
function checkFolder() {
  const folders = DriveApp.getFoldersByName('Agenda Maker - App');
  // Finds the folder if it exists
  while (folders.hasNext()) {
    let folder = folders.next();
    if (
      folder.getDescription() ==
        'Apps Script App - Do not change this description' &&
      folder.getOwner().getEmail() == Session.getActiveUser().getEmail()
    ) {
      return folder.getId();
    }
  }
  // If the folder doesn't exist, creates one
  let folder = DriveApp.createFolder('Agenda Maker - App');
  folder.setDescription('Apps Script App - Do not change this description');
  return folder.getId();
}

/**
 * Finds the template agenda doc, or creates one if it doesn't exist.
 */
function getTemplateId(folderId) {
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFilesByName('Agenda TEMPLATE##');

  // If there is a file, returns the ID.
  while (files.hasNext()) {
    const file = files.next();
    return file.getId();
  }

  // Otherwise, creates the agenda template.
  // You can adjust the default template here
  const doc = DocumentApp.create('Agenda TEMPLATE##');
  const body = doc.getBody();

  body
      .appendParagraph('##Attendees##')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);

  body
      .appendParagraph('Overview')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph(' ');
  body.appendParagraph('- Topic 1: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);
  body.appendParagraph('- Topic 2: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);
  body.appendParagraph('- Topic 3: ').editAsText().setBold(true);
  body.appendParagraph(' ').editAsText().setBold(false);

  body
      .appendParagraph('Next Steps')
      .setHeading(DocumentApp.ParagraphHeading.HEADING1)
      .editAsText()
      .setBold(true);
  body.appendParagraph('- Takeaway 1: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');
  body.appendParagraph(' ');
  body.appendParagraph('- Takeaway 2: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');
  body.appendParagraph(' ');
  body.appendParagraph('- Takeaway 3: ').editAsText().setBold(true);
  body.appendParagraph('- Responsible: ').editAsText().setBold(false);
  body.appendParagraph('- Accountable: ');
  body.appendParagraph('- Consult: ');
  body.appendParagraph('- Inform: ');

  doc.saveAndClose();

  folder.addFile(DriveApp.getFileById(doc.getId()));

  return doc.getId();
}

/**
 * When there is a change to the calendar, searches for events that include "#agenda"
 * in the decrisption.
 *
 */
function onCalendarChange() {
  // Gets recent events with the #agenda tag
  const now = new Date();
  const events = CalendarApp.getEvents(
      now,
      new Date(now.getTime() + 2 * 60 * 60 * 1000000),
      {search: '#agenda'},
  );

  const folderId = checkFolder();
  const templateId = getTemplateId(folderId);

  const folder = DriveApp.getFolderById(folderId);

  // Loops through any events found
  for (i = 0; i < events.length; i++) {
    const event = events[i];

    // Confirms whether the event has the #agenda tag
    let description = event.getDescription();
    if (description.search('#agenda') == -1) continue;

    // Only works with events created by the owner of this calendar
    if (event.isOwnedByMe()) {
      // Creates a new document from the template for an agenda for this event
      const newDoc = DriveApp.getFileById(templateId).makeCopy();
      newDoc.setName('Agenda for ' + event.getTitle());

      const file = DriveApp.getFileById(newDoc.getId());
      folder.addFile(file);

      const doc = DocumentApp.openById(newDoc.getId());
      const body = doc.getBody();

      // Fills in the template with information about the attendees from the
      // calendar event
      const conf = body.findText('##Attendees##');
      if (conf) {
        const ref = conf.getStartOffset();

        for (let i in event.getGuestList()) {
          let guest = event.getGuestList()[i];

          body.insertParagraph(ref + 2, guest.getEmail());
        }
        body.replaceText('##Attendees##', 'Attendees');
      }

      // Replaces the tag with a link to the agenda document
      const agendaUrl = 'https://docs.google.com/document/d/' + newDoc.getId();
      description = description.replace(
          '#agenda',
          '<a href=' + agendaUrl + '>Agenda Doc</a>',
      );
      event.setDescription(description);

      // Invites attendees to the Google doc so they automatically receive access to the agenda
      newDoc.addEditor(newDoc.getOwner());

      for (let i in event.getGuestList()) {
        let guest = event.getGuestList()[i];

        newDoc.addEditor(guest.getEmail());
      }
    }
  }
  return;
}

/**
 * Creates an event-driven trigger that fires whenever there's a change to the calendar.
 */
function setUp() {
  let email = Session.getActiveUser().getEmail();
  ScriptApp.newTrigger("onCalendarChange").forUserCalendar(email).onEventUpdated().create();
}

Modificaciones

Puedes editar la muestra todas las veces que quieras según tus necesidades. A continuación, se muestran algunos cambios opcionales que puedes realizar.

Actualizar los permisos del documento de agenda de los asistentes

El guion les otorga permiso a los asistentes para editarlo. Si deseas limitar los permisos de solo lectura, reemplaza el método addEditor por el método addViewer en la siguiente parte del código:

     for (let i in event.getGuestList()) {
       let guest = event.getGuestList()[i];

       newDoc.addEditor(guest.getEmail());

Edita la plantilla del documento con el temario

Para actualizar la plantilla del documento con el temario, sigue estos pasos:

  1. Después de crear tu primera agenda en un evento de calendario, abre Google Drive.
  2. Abre la carpeta Agenda Maker - App.
  3. Abre el documento Temario TEMPLATE## y realiza los cambios correspondientes.

Colaboradores

Jeremy Glassenberg, asesor de administración de productos y estrategia de plataforma, creó esta muestra. Busca a Jeremy en Twitter (@jdishenberg).

Google mantiene esta muestra con la ayuda de Expertos de Google Developers.

Próximos pasos