Créez un ordre du jour pour vos réunions

Niveau de codage: Débutant
Durée: 15 minutes
Type de projet: automatisation avec un déclencheur basé sur un événement

Objectifs

  • Comprendre à quoi sert la solution.
  • Découvrez le rôle des services Apps Script au sein de la solution.
  • Configurez le script.
  • Exécutez le script.

À propos de cette solution

Créez automatiquement des plannings dans Google Docs et joignez-les à vos réunions Google Agenda.

Capture d'écran de l'ordre du jour ajouté à l'événement d'agenda

Fonctionnement

Le script crée un modèle de document pour un ordre du jour. Lorsque vous mettez à jour votre agenda, le script vérifie si des événements que vous possédez incluent "#agenda" dans la description. Si la balise est présente, le script crée une copie du modèle, l'ajoute à l'événement d'agenda et le partage avec les participants à l'événement.

Services Apps Script

Cette solution utilise les services suivants:

  • Service Drive : vérifie si le modèle de document existe et, si ce n'est pas le cas, crée un dossier pour le modèle de document. Crée une copie du modèle de document pour chaque nouvel ordre du jour.
  • Service Document : crée le modèle d'ordre du jour.
  • Service Agenda : recherche les événements associés à la balise "#agenda" et met à jour la description de l'événement avec un lien vers le document correspondant.
  • Service de base : utilise la classe Session pour obtenir l'adresse e-mail de l'utilisateur. Cela permet de créer le déclencheur pour l'utilisateur actuel.
  • Service de scripts : crée un déclencheur qui s'active chaque fois que l'agenda de l'utilisateur est modifié.

Conditions préalables

Pour utiliser cet exemple, vous devez remplir les conditions préalables suivantes:

  • Un compte Google (les comptes Google Workspace peuvent nécessiter l'approbation de l'administrateur)
  • Un navigateur Web avec accès à Internet.

Configurer le script

  1. Cliquez sur le bouton ci-dessous pour ouvrir l'exemple de projet Apps Script Créer un ordre du jour pour une réunion.
    Ouvrir le projet
  2. Cliquez sur Vue d'ensemble .
  3. Sur la page "Vue d'ensemble", cliquez sur Créer une copie Icône permettant de créer une copie.
  4. Dans le projet que vous avez copié, sélectionnez setUp dans le menu déroulant de la fonction.
  5. Cliquez sur Exécuter.
  6. Lorsque vous y êtes invité, autorisez le script. Si l'écran de consentement OAuth affiche l'avertissement Cette application n'est pas validée, sélectionnez Avancé > Accéder à {Project Name} (non sécurisé).

Exécuter le script

  1. Ouvrez Google Agenda.
  2. Créez un événement ou modifiez un événement existant.
  3. Dans la description, ajoutez #agenda et enregistrez l'événement.
  4. Recherchez dans votre boîte de réception si vous avez reçu une notification par e-mail indiquant qu'un document a été partagé avec vous ou actualisez Agenda, puis cliquez à nouveau sur l'événement pour afficher le lien vers le document de l'ordre du jour.

Tous les participants reçoivent une notification par e-mail les invitant à consulter l'ordre du jour. Le script autorise les participants à apporter des modifications, mais vous pouvez le modifier pour mettre à jour les autorisations du document d'ordre du jour pour les participants.

Examiner le code

Pour examiner le code Apps Script de cette solution, cliquez sur Afficher le code source ci-dessous:

Afficher le code source

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

Modifications

Vous pouvez modifier l'échantillon autant que vous le souhaitez pour l'adapter à vos besoins. Vous trouverez ci-dessous quelques modifications facultatives.

Mettre à jour les autorisations des participants concernant le document de l'ordre du jour

Le script autorise les participants à apporter des modifications. Si vous souhaitez limiter les autorisations en lecture seule, remplacez la méthode addEditor par la méthode addViewer dans la partie suivante du code:

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

       newDoc.addEditor(guest.getEmail());

Modifier le modèle de document d'ordre du jour

Pour mettre à jour le modèle de document d'ordre du jour, procédez comme suit:

  1. Après avoir créé votre premier planning dans un événement d'agenda, ouvrez Google Drive.
  2. Ouvrez le dossier intitulé Agenda Maker – App.
  3. Ouvrez le document Agenda TEMPLATE## et apportez les modifications souhaitées.

Contributeurs

Cet exemple a été créé par Jeremy Glassenberg, consultant en gestion de produits et en stratégie de plate-forme. Retrouvez Jeremy sur Twitter : @jglassenberg.

Cet exemple est géré par Google avec l'aide d'Experts Google Developers.

Étapes suivantes