Creare un'agenda per le riunioni

Livello di codifica: principiante
Durata: 15 minuti
Tipo di progetto: automazione con un attivatore basato su eventi

Obiettivi

  • Scopri cosa fa la soluzione.
  • Scopri cosa fanno i servizi di Apps Script all'interno della soluzione.
  • Configura lo script.
  • Esegui lo script.

Informazioni su questa soluzione

Crea automaticamente documenti dell'ordine del giorno in Documenti Google e allegali alle riunioni di Google Calendar.

Screenshot dell'agenda aggiunta all'evento di Calendar

Come funziona

Lo script crea un modello di documento per un'agenda. Quando aggiorni il tuo calendario, lo script controlla se gli eventi di tua proprietà includono "#agenda" nella descrizione. Se il tag è presente, lo script crea una copia del modello, lo aggiunge all'evento nel calendario e lo condivide con i partecipanti all'evento.

Servizi Apps Script

Questa soluzione utilizza i seguenti servizi:

  • Servizio Drive: controlla se il documento del modello esiste e, in caso contrario, crea una nuova cartella per il documento del modello. Crea una copia del documento modello per ogni nuova agenda.
  • Servizio di documentazione: crea il modello di ordine del giorno.
  • Servizio di calendario: controlla gli eventi con il tag "#agenda" e aggiorna la descrizione dell'evento con un link al documento dell'agenda.
  • Servizio di base: utilizza la classe Session per recuperare l'email dell'utente. In questo modo, puoi creare l'attivatore per l'utente corrente.
  • Servizio di script: crea un attivatore che si attiva ogni volta che viene apportata una modifica al calendario dell'utente.

Prerequisiti

Per utilizzare questo esempio, sono necessari i seguenti prerequisiti:

  • Un Account Google (gli account Google Workspace potrebbero richiedere l'approvazione dell'amministratore).
  • Un browser web con accesso a internet.

Configurare lo script

  1. Fai clic sul pulsante di seguito per aprire il progetto Apps Script di esempio Creare un'agenda per le riunioni.
    Apri il progetto
  2. Fai clic su Panoramica .
  3. Nella pagina di panoramica, fai clic su Crea una copia L'icona per creare una copia.
  4. Nel progetto copiato, seleziona setUp nel menu a discesa delle funzioni.
  5. Fai clic su Esegui.
  6. Quando richiesto, autorizza lo script. Se nella schermata per il consenso OAuth viene visualizzato l'avviso Questa app non è verificata, continua selezionando Avanzate > Vai a {Project Name} (non sicuro).

Esegui lo script

  1. Apri Google Calendar.
  2. Crea un nuovo evento o modificane uno esistente.
  3. Nella descrizione, aggiungi #agenda e salva l'evento.
  4. Controlla se hai ricevuto una notifica via email che ti informa che un documento è stato condiviso con te oppure aggiorna il calendario e fai di nuovo clic sull'evento per visualizzare il link al documento dell'agenda.

Tutti i partecipanti ricevono la notifica via email per visualizzare l'agenda. Lo script concede ai partecipanti l'autorizzazione di modifica, ma puoi modificarlo per aggiornare le autorizzazioni del documento dell'agenda per i partecipanti.

Esamina il codice

Per esaminare il codice di Apps Script per questa soluzione, fai clic su Visualizza codice sorgente di seguito:

Visualizza codice sorgente

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

Modifiche

Puoi modificare il Sample in base alle tue esigenze. Di seguito sono riportate alcune modifiche facoltative che puoi apportare.

Aggiornare le autorizzazioni dei documenti dell'agenda per i partecipanti

Lo script concede ai partecipanti l'autorizzazione di modifica. Se vuoi limitare le autorizzazioni solo alla visualizzazione, sostituisci il metodo addEditor con il metodo addViewer nella parte seguente del codice:

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

       newDoc.addEditor(guest.getEmail());

Modificare il modello di documento dell'ordine del giorno

Per aggiornare il modello di documento dell'ordine del giorno:

  1. Dopo aver creato il primo programma in un evento nel calendario, apri Google Drive.
  2. Apri la cartella Agenda Maker - App.
  3. Apri il documento Agenda TEMPLATE## e apporta le modifiche.

Collaboratori

Questo esempio è stato creato da Jeremy Glassenberg, consulente per la strategia di gestione dei prodotti e delle piattaforme. Puoi trovare Jeremy su Twitter all'indirizzo @jglassenberg.

Questo Sample è gestito da Google con l'aiuto degli esperti Google Developer.

Passaggi successivi