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 issues de Sheets en cours de transfert vers Forms et Agenda](https://developers-dot-devsite-v2-prod.appspot.com/static/apps-script/samples/images/event-signup.jpeg?authuser=2&hl=fr)
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
- 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
- Cliquez sur Conférence > Configurer
conférence. Vous devrez peut-être actualiser la page pour que ce menu personnalisé
s'affichent.
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é).
Cliquez sur Conférence > Configurer
une conférence téléphonique.
Exécuter le script
- Cliquez sur Outils > Gérer le formulaire.
> Accéder au formulaire en ligne.
- Remplissez et envoyez le formulaire.
- Accédez à la page calendar.google.com.
- À gauche, assurez-vous que la case Agenda de la conférence est cochée.
- 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 message 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:
- Dans la feuille de calcul, cliquez sur Extensions.
> Apps Script.
- 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:
- Accédez à la page calendar.google.com.
- À côté de "Agenda des conférences", 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 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 :
- Dans la feuille de calcul, cliquez sur Extensions.
> Apps Script.
- Dans le projet Apps Script, sur la gauche, cliquez sur Déclencheurs.
![](https://fonts.gstatic.com/s/i/short-term/release/googlesymbols/alarm/default/24px.svg)
- À 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:
- 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.
- Effectuez un nouveau clic droit sur la feuille Réponses au formulaire, puis cliquez sur Supprimer.
> OK.
- Accédez à forms.google.com.
- 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 pourrez 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
// 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