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 les événements

Objectifs

  • Comprendre ce que la solution fait
  • Comprendre ce que font les services Apps Script dans 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 organisez un événement, comme une conférence, vous pouvez configurer un agenda pour les sessions de conférence, créer un formulaire d'inscription et envoyer automatiquement aux participants des plannings personnalisés par e-mail.

Informations 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 d'enregistrement d'événements automatisé. Le script crée un agenda avec les événements de la conférence listés dans la feuille de calcul Sheets. Ensuite, le script crée 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 les itinéraires par e-mail.

Services Apps Script

Cette solution utilise les services suivants:

  • Service de feuille de calcul : fournit les informations sur l'événement aux autres services.
  • Service d'agenda : crée un agenda pour l'événement, ajoute des événements à l'agenda et ajoute les participants aux événements auxquels ils s'inscrivent.
  • Service de propriétés : stocke l'ID de l'agenda créé par le service Agenda. Lorsqu'un utilisateur clique sur Configurer la conférence dans le menu personnalisé Conférence, le service Properties vérifie si le système d'enregistrement des événements a déjà été configuré en vérifiant si la propriété d'ID de calendrier est présente. Cela permet d'éviter de créer des formulaires et des agendas en double.
  • Service Forms : crée un formulaire à partir des informations de la feuille de calcul permettant aux participants de s'inscrire aux sessions.
  • Service de script : crée un déclencheur qui se déclenche lorsqu'un participant remplit le formulaire.
  • Service de 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.
  • Service de messagerie : envoie le document d'itinéraire par e-mail au participant.

Prérequis

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

  • Un compte Google (l'approbation de l'administrateur peut être nécessaire pour les comptes Google Workspace).
  • 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 Créer une inscription aux sessions d'une conférence. Le projet Apps Script de cette solution est joint à la feuille de calcul.
    Créer une copie
  2. Cliquez sur Conférence > Configurer la 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 d'autorisation OAuth affiche l'avertissement Cette application n'est pas validée, sélectionnez Avancé > Accéder à {Nom du projet} (non sécurisé).

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

Exécuter le script

  1. Cliquez sur Outils > Gérer le formulaire > Accéder au formulaire en direct.
  2. Remplissez et envoyez le formulaire.
  3. Accédez à calendar.google.com.
  4. À gauche, assurez-vous que la case à côté de Agenda de la conférence est cochée.
  5. Accédez aux dates des événements auxquels vous vous êtes inscrit et vérifiez que vous avez été ajouté en tant que participant.

(Facultatif) Réinitialiser la solution

Si vous souhaitez réessayer cette solution ou la personnaliser pour utiliser vos propres informations sur les événements, vous devez réinitialiser certains éléments configurés lors de l'exécution initiale du script. Pour connaître la procédure de réinitialisation de la solution, cliquez sur Réinitialiser la solution ci-dessous:

Réinitialiser la solution

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

Si vous essayez d'exécuter le script plusieurs fois, le message suivant s'affiche : Votre conférence est déjà configurée. Recherchez votre formulaire d'inscription dans Google Drive. En effet, une fois l'agenda de la conférence créé, l'ID de l'agenda est stocké en tant que propriété de script. Lorsque le script s'exécute, il vérifie si la propriété d'ID d'agenda existe déjà et s'arrête de s'exécuter 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 l'agenda de la 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 créé, procédez comme suit:

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

Étape 3: Supprimez le déclencheur d'envoi du formulaire

Le script crée un déclencheur pour les envois de formulaires 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, un nouveau formulaire est créé. Pour dissocier le formulaire de votre feuille de calcul et le supprimer, procédez comme suit:

  1. Dans la feuille de calcul, effectuez un clic droit sur la feuille Réponses aux formulaires, puis cliquez sur Supprimer le lien vers le formulaire > OK.
  2. Effectuez un nouveau clic droit sur la feuille Réponses au 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 > Déplacer vers la corbeille.

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

Examiner le code

Pour consulter 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 des experts Google pour les développeurs.

Étapes suivantes