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.
- Découvrez le rôle des 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 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 aux participants des itinéraires personnalisés par e-mail.

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 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. 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 Feuille de calcul : fournit les informations d'événement aux autres services.
- Le service Agenda crée un agenda pour l'événement, y ajoute des événements et ajoute les 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 Agenda. Lorsqu'un utilisateur clique sur Configurer une conférence dans le menu Conférence personnalisé, le service des propriétés vérifie si le système d'inscription aux événements a déjà été configuré en vérifiant 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.
- 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 script : 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 la liste des événements à un nouveau document. Le script autorise le participant à modifier le document.
- Mail service (Service de messagerie) : envoie le document du séjour par e-mail 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
- Cliquez sur le bouton suivant pour créer une copie de l'exemple de feuille de calcul Créer une inscription à des sessions lors d'une conférence. Le projet Apps Script de cette solution est joint à la feuille de calcul.
Créer une copie
- Cliquez sur Conférence > Configurer une conférence. Vous devrez peut-être actualiser la page pour que ce menu personnalisé s'affiche.
Lorsque vous y êtes invité, autorisez le script.
Si l'écran de consentement OAuth affiche l'avertissement Cette application n'est pas validée, continuez en sélectionnant Paramètres avancés >
Accéder à {Project Name} (unsafe).
Cliquez à nouveau sur Conférence > Configurer une conférence.
Exécuter le script
- Cliquez sur Outils > Gérer le formulaire
> Accéder au formulaire en ligne.
- Remplissez et envoyez le formulaire.
- Accédez à calendar.google.com.
- À gauche, vérifiez que la case Agenda de la conférence est cochée.
- 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 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. Recherchez votre formulaire d'inscription dans Google Drive.
En effet, une fois l'agenda de 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é de l'ID d'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:
- Dans la feuille de calcul, cliquez sur Extensions
> Apps Script.
- 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 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 qui a été créé, procédez comme suit:
- Accédez à calendar.google.com.
- À côté de "Agenda de conférence", cliquez sur "Options de l'agenda de conférence"
>
Paramètres et partage.
- Faites défiler la page jusqu'en bas des paramètres, puis cliquez sur Supprimer.
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 :
- Dans la feuille de calcul, cliquez sur Extensions
> Apps Script.
- Dans le projet Apps Script, à gauche, cliquez sur Déclencheurs
.
- À 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. Procédez comme suit pour dissocier le formulaire de votre feuille de calcul et le supprimer:
- Dans la feuille de calcul, faites un clic droit sur la feuille Réponses au formulaire, puis cliquez sur Dissocier le formulaire > OK.
- Effectuez un nouveau clic droit sur la feuille Réponses du formulaire, puis cliquez sur Supprimer
> OK.
- Accédez à forms.google.com.
- 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
// 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