Créer une inscription aux sessions d'une conférence

Niveau de codage: Débutant
Durée: 5 minutes
Type de projet: automatisation avec un menu personnalisé et 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 un système d'enregistrement d'événements de bout en bout. Si vous avez un événement à venir, comme une conférence, vous pouvez configurer un nouvel agenda pour les sessions de conférence, créer un formulaire d'inscription et envoyer automatiquement des itinéraires personnalisés par e-mail aux participants.

Informations provenant de Sheets transférées vers Forms et Agenda

Fonctionnement

Cette solution utilise un menu personnalisé dans Google Sheets pour implémenter un système automatisé d'enregistrement d'événements. Le script crée un agenda avec les événements de conférence listés dans la feuille de calcul Sheets. Le script crée ensuite un formulaire contenant la liste des événements auxquels les participants peuvent s'inscrire. Une fois que les participants ont rempli le formulaire, le script les ajoute aux événements d'agenda et leur envoie des itinéraires par e-mail.

Services Apps Script

Cette solution utilise les services suivants:

  • Service de feuille de calcul : fournit les informations d'événement aux autres services.
  • Service Agenda : crée un agenda pour l'événement, y ajoute des événements et ajoute des participants aux événements auxquels ils s'inscrivent.
  • Properties service (Service des propriétés) : stocke l'ID de l'agenda créé par le service Calendar. Lorsqu'un utilisateur clique sur Configurer une conférence dans le menu personnalisé Conférence, le service des propriétés vérifie si le système d'enregistrement d'événements a déjà été configuré. Pour cela, il vérifie si la propriété de l'ID de l'agenda est présente. Cela permet d'éviter la création de formulaires et d'agendas en double.
  • Le service Forms crée un formulaire à partir des informations de la feuille de calcul, qui permet aux participants de s'inscrire à des sessions.
  • Service de scripts : crée un déclencheur qui s'active lorsqu'un participant remplit le formulaire.
  • Service Document : récupère les informations sur les événements auxquels un participant s'inscrit et ajoute une liste des événements à un nouveau document. Le script autorise le participant à modifier le document.
  • Mail service (Service de courrier) : envoie par e-mail le document du voyage au participant.

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 suivant pour créer une copie de l'exemple de feuille de calcul Create a sign-up for sessions at a conférence (Créer une inscription aux sessions lors d'une conférence). Le projet Apps Script pour cette solution est joint à la feuille de calcul.
    Créer une copie
  2. Cliquez sur Conférence > Configurer une conférence. Vous devrez peut-être actualiser la page pour que ce menu personnalisé s'affiche.
  3. 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é).

  4. Cliquez sur Conférence > à nouveau sur Configurer une conférence.

Exécuter le script

  1. Cliquez sur Tools > Manage Form (Gérer le formulaire) > Go to live form (Accéder au formulaire en ligne).
  2. Remplissez et envoyez le formulaire.
  3. Accédez à calendar.google.com.
  4. Sur la gauche, assurez-vous que la case Agenda de conférence est cochée.
  5. Accédez aux dates des événements auxquels vous vous êtes inscrit et confirmez que vous avez été ajouté en tant que participant.

(Facultatif) Réinitialiser la solution

Si vous souhaitez réessayer cette solution ou la personnaliser afin d'utiliser vos propres informations d'événement, vous devez réinitialiser certains éléments configurés lors de la première exécution du script. Pour afficher les étapes permettant de réinitialiser la solution, cliquez sur Réinitialiser la solution ci-dessous:

Réinitialiser la solution

Étape 1: Réinitialisez les propriétés du script stocké

Si vous essayez d'exécuter le script plusieurs fois, le message suivant s'affiche : Votre conférence est déjà configurée. Consultez votre formulaire d'inscription dans Google Drive. En effet, une fois l'agenda de conférence créé, son ID est stocké en tant que propriété de script. Lorsque le script s'exécute, il vérifie si la propriété de l'ID de l'agenda existe déjà et s'arrête si c'est le cas.

Pour supprimer la propriété d'ID d'agenda existante, procédez comme suit:

  1. Dans la feuille de calcul, cliquez sur Extensions > Apps Script.
  2. Dans l'éditeur Apps Script, sélectionnez resetProperties dans la liste déroulante des fonctions, puis cliquez sur Exécuter.

Étape 2: Supprimez le calendrier de conférence

Chaque fois que le script s'exécute, il crée un agenda. Si vous ne souhaitez pas conserver l'agenda d'origine, procédez comme suit:

  1. Accédez à calendar.google.com.
  2. À côté de "Agenda de conférence", cliquez sur "Options de l'agenda de conférence" > Paramètres et partage.
  3. Faites défiler la page des paramètres jusqu'en bas, puis cliquez sur Supprimer.

Étape 3: Supprimez le déclencheur "Envoi de formulaire"

Le script crée un déclencheur pour les envois de formulaire chaque fois que vous l'exécutez. Pour éviter que plusieurs déclencheurs génèrent des e-mails en double, supprimez le déclencheur d'origine. Procédez comme suit :

  1. Dans la feuille de calcul, cliquez sur Extensions > Apps Script.
  2. Dans le projet Apps Script, sur la gauche, cliquez sur Déclencheurs .
  3. À côté du déclencheur, cliquez sur Plus > Supprimer le déclencheur.

Chaque fois que vous exécutez le script, celui-ci crée un formulaire. Procédez comme suit pour dissocier le formulaire de votre feuille de calcul et le supprimer:

  1. Dans la feuille de calcul, effectuez un clic droit sur la feuille Réponses au formulaire, puis cliquez sur Dissocier le formulaire > OK.
  2. Effectuez un nouveau clic droit sur la feuille Réponses du formulaire, puis cliquez sur Supprimer > OK.
  3. Accédez à forms.google.com.
  4. Effectuez un clic droit sur Formulaire de conférence, puis cliquez sur Supprimer > Placer dans la corbeille.

Une fois la solution réinitialisée, vous pouvez ajouter vos propres données ou continuer à utiliser les exemples de données, puis exécuter à nouveau le script.

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/event-session-signup/Code.js
// To learn how to use this script, refer to the documentation:
// https://developers.google.com/apps-script/samples/automations/event-session-signup

/*
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.
*/

/**
 * Inserts a custom menu when the spreadsheet opens.
 */
function onOpen() {
  SpreadsheetApp.getUi().createMenu('Conference')
      .addItem('Set up conference', 'setUpConference_')
      .addToUi();
}

/**
 * Uses the conference data in the spreadsheet to create
 * Google Calendar events, a Google Form, and a trigger that allows the script
 * to react to form responses.
 */
function setUpConference_() {
  let scriptProperties = PropertiesService.getScriptProperties();
  if (scriptProperties.getProperty('calId')) {
    Browser.msgBox('Your conference is already set up. Look in Google Drive for your'
                   + ' sign-up form!');
                   return;
  }
  let ss = SpreadsheetApp.getActive();
  let sheet = ss.getSheetByName('Conference Setup');
  let range = sheet.getDataRange();
  let values = range.getValues();
  setUpCalendar_(values, range);
  setUpForm_(ss, values);
  ScriptApp.newTrigger('onFormSubmit').forSpreadsheet(ss).onFormSubmit()
      .create();
}

/**
 * Creates a Google Calendar with events for each conference session in the
 * spreadsheet, then writes the event IDs to the spreadsheet for future use.
 * @param {Array<string[]>} values Cell values for the spreadsheet range.
 * @param {Range} range A spreadsheet range that contains conference data.
 */
function setUpCalendar_(values, range) {
  let cal = CalendarApp.createCalendar('Conference Calendar');
  // Start at 1 to skip the header row.
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let title = session[0];
    let start = joinDateAndTime_(session[1], session[2]);
    let end = joinDateAndTime_(session[1], session[3]);
    let options = {location: session[4], sendInvites: true};
    let event = cal.createEvent(title, start, end, options)
        .setGuestsCanSeeGuests(false);
    session[5] = event.getId();
  }
  range.setValues(values);

  // Stores the ID for the Calendar, which is needed to retrieve events by ID.
  let scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.setProperty('calId', cal.getId());
}

/**
 * Creates a single Date object from separate date and time cells.
 *
 * @param {Date} date A Date object from which to extract the date.
 * @param {Date} time A Date object from which to extract the time.
 * @return {Date} A Date object representing the combined date and time.
 */
function joinDateAndTime_(date, time) {
  date = new Date(date);
  date.setHours(time.getHours());
  date.setMinutes(time.getMinutes());
  return date;
}

/**
 * Creates a Google Form that allows respondents to select which conference
 * sessions they would like to attend, grouped by date and start time in the
 * caller's time zone.
 *
 * @param {Spreadsheet} ss The spreadsheet that contains the conference data.
 * @param {Array<String[]>} values Cell values for the spreadsheet range.
 */
function setUpForm_(ss, values) {
  // Group the sessions by date and time so that they can be passed to the form.
  let schedule = {};
  // Start at 1 to skip the header row.
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let day = session[1].toLocaleDateString();
    let time = session[2].toLocaleTimeString();
    if (!schedule[day]) {
      schedule[day] = {};
    }
    if (!schedule[day][time]) {
      schedule[day][time] = [];
    }
    schedule[day][time].push(session[0]);
  }

  // Creates the form and adds a multiple-choice question for each timeslot.
  let form = FormApp.create('Conference Form');
  form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
  form.addTextItem().setTitle('Name').setRequired(true);
  form.addTextItem().setTitle('Email').setRequired(true);
  Object.keys(schedule).forEach(function(day) {
    let header = form.addSectionHeaderItem().setTitle('Sessions for ' + day);
    Object.keys(schedule[day]).forEach(function(time) {
      let item = form.addMultipleChoiceItem().setTitle(time + ' ' + day)
          .setChoiceValues(schedule[day][time]);
    });
  });
}

/**
 * Sends out calendar invitations and a
 * personalized Google Docs itinerary after a user responds to the form.
 *
 * @param {Object} e The event parameter for form submission to a spreadsheet;
 *     see https://developers.google.com/apps-script/understanding_events
 */
function onFormSubmit(e) {
  let user = {name: e.namedValues['Name'][0], email: e.namedValues['Email'][0]};

  // Grab the session data again so that we can match it to the user's choices.
  let response = [];
  let values = SpreadsheetApp.getActive().getSheetByName('Conference Setup')
      .getDataRange().getValues();
  for (let i = 1; i < values.length; i++) {
    let session = values[i];
    let title = session[0];
    let day = session[1].toLocaleDateString();
    let time = session[2].toLocaleTimeString();
    let timeslot = time + ' ' + day;

    // For every selection in the response, find the matching timeslot and title
    // in the spreadsheet and add the session data to the response array.
    if (e.namedValues[timeslot] && e.namedValues[timeslot] == title) {
      response.push(session);
    }
  }
  sendInvites_(user, response);
  sendDoc_(user, response);
}

/**
 * Add the user as a guest for every session he or she selected.
 * @param {object} user An object that contains the user's name and email.
 * @param {Array<String[]>} response An array of data for the user's session choices.
 */
function sendInvites_(user, response) {
  let id = ScriptProperties.getProperty('calId');
  let cal = CalendarApp.getCalendarById(id);
  for (let i = 0; i < response.length; i++) {
    cal.getEventSeriesById(response[i][5]).addGuest(user.email);
  }
}

/**
 * Creates and shares a personalized Google Doc that shows the user's itinerary.
 * @param {object} user An object that contains the user's name and email.
 * @param {Array<string[]>} response An array of data for the user's session choices.
 */
function sendDoc_(user, response) {
  let doc = DocumentApp.create('Conference Itinerary for ' + user.name)
      .addEditor(user.email);
  let body = doc.getBody();
  let table = [['Session', 'Date', 'Time', 'Location']];
  for (let i = 0; i < response.length; i++) {
    table.push([response[i][0], response[i][1].toLocaleDateString(),
      response[i][2].toLocaleTimeString(), response[i][4]]);
  }
  body.insertParagraph(0, doc.getName())
      .setHeading(DocumentApp.ParagraphHeading.HEADING1);
  table = body.appendTable(table);
  table.getRow(0).editAsText().setBold(true);
  doc.saveAndClose();

  // Emails a link to the Doc as well as a PDF copy.
  MailApp.sendEmail({
    to: user.email,
    subject: doc.getName(),
    body: 'Thanks for registering! Here\'s your itinerary: ' + doc.getUrl(),
    attachments: doc.getAs(MimeType.PDF),
  });
}

/**
 * Removes the calId script property so that the 'setUpConference_()' can be run again.
 */
function resetProperties(){
  let scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.deleteAllProperties();
}

Contributeurs

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

Étapes suivantes