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

Objectifs

  • Comprendre ce que fait la solution.
  • Vous connaissez le fonctionnement des services Apps Script dans le solution.
  • Configurez le script.
  • Exécutez le script.

À propos de cette solution

Créez un système d'inscription aux événements de bout en bout. Si vous organisez un événement à venir (lors d'une conférence, par exemple), vous pouvez définir un nouvel agenda créer un formulaire d'inscription et envoyer automatiquement un e-mail personnalisé aux participants d'itinéraires.

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

Fonctionnement

Cette solution utilise un menu personnalisé dans Google Sheets pour implémenter une d'inscription à des événements. Le script crée un agenda avec la conférence répertoriés dans la feuille de calcul Sheets. Ensuite, le script crée un formulaire avec la liste des événements auxquels les participants peuvent s'inscrire. Après les participants remplir le formulaire, le script ajoute les participants aux événements de l'agenda et leur envoie des itinéraires par e-mail.

Services Apps Script

Cette solution utilise les services suivants:

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

Prérequis

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

  • Un compte Google (les comptes Google Workspace peuvent nécessitent l'approbation d'un administrateur).
  • Un navigateur Web ayant accès à Internet

Configurer le script

  1. Cliquez sur le bouton suivant pour faire une copie du guide Create a sign-up to sessions lors d'une conférence exemple de feuille de calcul. Apps Script projet pour cette solution est joint à la feuille de calcul.
    Créer une copie
  2. Cliquez sur Conférence > Configurer conférence. Vous devrez peut-être actualiser la page pour que ce menu personnalisé s'affichent.
  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, cliquez sur Avancé > pour continuer. Accédez à {Project Name} (non sécurisé).

  4. Cliquez sur Conférence > Configurer une conférence téléphonique.

Exécuter le script

  1. Cliquez sur Outils > Gérer le formulaire. > Accéder au formulaire en ligne.
  2. Remplissez et envoyez le formulaire.
  3. Accédez à la page calendar.google.com.
  4. À gauche, assurez-vous que la case Agenda de la 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 pour l'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 la procédure de réinitialisation de la solution, cliquez sur Réinitialisez 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 système vous demande : Votre la conférence est déjà configurée. Accédez à Google Drive pour trouver votre formulaire d'inscription. En effet, une fois l'agenda de conférence créé, l'identifiant de l'agenda est stockée en tant que propriété de script. Lorsque le script s'exécute, il vérifie si le la propriété d'ID d'agenda existe déjà et, le cas échéant, cesse de s'exécuter.

Pour supprimer la propriété existante associée à l'ID de l'agenda, 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 le champ liste déroulante des fonctions, puis cliquez sur Exécuter.

Étape 2: Supprimez l'agenda de la conférence

Un agenda est créé à chaque exécution du script. Si vous ne souhaitez pas conserver l'agenda qui a été créé, procédez comme suit:

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

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

Le script crée un déclencheur pour l'envoi de formulaires chaque fois que vous l'exécutez. À évitez d'avoir plusieurs déclencheurs qui génèrent des adresses e-mail en double, supprimez l'original ou un déclencheur spécifique. 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, il crée un formulaire. Suivez ces étapes pour dissociez le formulaire de votre feuille de calcul et supprimez-le:

  1. Dans la feuille de calcul, faites un clic droit sur la feuille Réponses au formulaire, 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 Conference Form (Formulaire de la conférence), puis cliquez sur Remove (Supprimer). > Placer dans la corbeille.

Une fois la solution réinitialisée, vous pouvez ajouter vos propres données ou passer à 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 Consultez 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 échantillon est géré par Google avec l'aide d'Experts Google Developers.

Étapes suivantes