Criar uma pauta para reuniões

Nível de programação: iniciante
Duração: 15 minutos
Tipo de projeto: automação com um acionador baseado em eventos

Objetivos

  • Entenda o que a solução faz.
  • Entenda o que os serviços do Apps Script fazem na solução.
  • Configure o script.
  • Execute o script.

Sobre esta solução

Crie automaticamente documentos de compromissos no Documentos Google e anexe-os às suas reuniões do Google Agenda.

Captura de tela dos compromissos adicionados ao evento do Google Agenda

Como funciona

O script cria um modelo de documento para uma pauta. Quando você atualiza a agenda, o script verifica se algum evento seu inclui "#agenda" na descrição. Se a tag estiver presente, o script faz uma cópia do modelo, adiciona essa tag ao evento da agenda e a compartilha com os participantes do evento.

Serviços do Apps Script

Essa solução usa os seguintes serviços:

  • Serviço do Drive: verifica se o documento de modelo existe. Caso não exista, cria uma nova pasta para ele. Cria uma cópia do documento modelo para cada nova pauta.
  • Serviço de documentos: cria o modelo de pauta.
  • Serviço de agenda: verifica os eventos com a tag "#agenda" e atualiza a descrição do evento com um link para o documento da pauta.
  • Serviço base: usa a classe Session para receber o e-mail do usuário. Isso ajuda a criar o gatilho para o usuário atual.
  • Serviço de script: cria um acionador que é disparado sempre que há uma alteração na agenda do usuário.

Pré-requisitos

Para usar esta amostra, você precisa dos seguintes pré-requisitos:

  • Uma Conta do Google (as contas do Google Workspace podem exigir a aprovação do administrador).
  • Um navegador da Web com acesso à Internet.

Configurar o script

  1. Clique no botão abaixo para abrir o projeto de exemplo Criar uma pauta para reuniões do Apps Script.
    Abrir o projeto
  2. Clique em Visão geral .
  3. Na página de visão geral, clique em Fazer uma cópia Ícone para fazer uma cópia.
  4. No projeto copiado, selecione setUp na lista suspensa de funções.
  5. Clique em Run.
  6. Quando solicitado, autorize o script. Se a tela de permissão OAuth exibir o aviso Este app não foi verificado, continue selecionando Avançado > Ir para {Nome do projeto} (não seguro).

Executar o script

  1. Abra o Google Agenda.
  2. Crie um novo evento ou edite um já existente.
  3. Na descrição, adicione #agenda e salve o evento.
  4. Verifique se você recebeu uma notificação por e-mail informando que um documento foi compartilhado com você ou atualize o Agenda e clique no evento novamente para ver o link para o documento.

Todos os participantes recebem uma notificação por e-mail para acessar a pauta. O script concede aos participantes permissão para editar, mas é possível editá-lo para atualizar as permissões do documento da pauta para os participantes.

Revisar o código

Para revisar o código do Apps Script para esta solução, clique em Ver código-fonte abaixo:

Acessar código-fonte

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();
}

Modificações

Você pode editar a amostra o quanto desejar para atender às suas necessidades. Veja abaixo algumas alterações opcionais que você pode fazer.

Atualizar permissões do documento de compromissos para os participantes

O script concede aos participantes permissão para editar. Se você quiser limitar as permissões somente para visualização, substitua o método addEditor pelo método addViewer na parte a seguir do código:

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

       newDoc.addEditor(guest.getEmail());

Editar o modelo de documento da pauta

Para atualizar o modelo de documento de pauta, siga estas etapas:

  1. Depois de criar seus primeiros compromissos em um evento da agenda, abra o Google Drive.
  2. Abra a pasta Agenda Maker - App.
  3. Abra o documento Modelo de programação## e faça as edições.

Colaboradores

Esta amostra foi criada por Jeremy Glassenberg, consultor de estratégia de plataforma e gerenciamento de produtos. Encontre o Jeremy no Twitter @j Glassenberg (em inglês).

Esta amostra é mantida pelo Google com a ajuda de especialistas do Google Developers.

Próximas etapas