Google Forms avec FormApp
Introduction
Passons maintenant au service FormApp. Google Forms est l’outil incontournable pour créer et partager des formulaires (inscriptions, enquêtes, quiz). Apps Script permet de passer à la vitesse supérieure : on génère des formulaires par code, on modifie leurs questions et validations, on publie/partage en un clic et on relie les réponses à Sheets. Un simple formulaire devient alors la pièce maîtresse d’un processus automatisé.
Prendre en main FormApp
FormApp est la porte d’entrée de l’API Google Forms. Elle permet d’ouvrir un formulaire existant ou d’en créer un nouveau, puis d’accéder à tous ses réglages. Le trio à retenir est simple : FormApp > Form > Item. On crée/ouvre avec FormApp, on configure le Form, et on ajoute des Items (questions et éléments de mise en page).
1. Les classes et méthodes principales
La classe FormApp fournit les méthodes de base : create(), openById(), openByUrl(), ainsi que les builders de validation.
Elle expose aussi l’UI de l’éditeur via getUi() pour ajouter des menus (dans l’éditeur, pas côté répondant) :

FormApp nous met à disposition les classes nécessaires à l’automatisation au sein de Google Forms.
-
Form : l’objet Form incarne le formulaire lui-même : titre, description, publication, destination des réponses et orchestration des items.
-
Items : les Items (TextItem, MultipleChoiceItem, ListItem, GridItem, PageBreakItem, etc.) se règlent directement sur l’item créé via setTitle(), setRequired(), setHelpText(), setChoices() ou setValidation(), selon le type.
-
FormResponse : à chaque envoi, un FormResponse est produit : il contient l’horodatage, l’adresse e-mail lorsque la collecte est activée, ainsi que la liste des ItemResponse associées.
-
ItemResponse : chaque ItemResponse donne accès à la question concernée et à la valeur saisie pour cette réponse précise.
Voyons quelques exemples simples d’utilisation de ces classes.
Pour créer un formulaire publié :
// Create and publish immediately
const quickForm = FormApp.create('Product Feedback', true);
Logger.log(quickForm.getPublishedUrl());
Tant qu’un formulaire n’est pas publié, il ne peut pas recevoir de réponses et reste à l’état de « brouillon ».
Pour récupérer un formulaire existant, trois options sont possibles :
// Open by ID
const formById = FormApp.openById('1AbCDefGhIJklMNopQRstuVWxyz1234567890');
// Open by URL ...Options dynamiques depuis Sheets
1. Peupler les choix depuis Sheets
Pour consolider les notions abordées jusqu’à présent, nous allons mettre en place un cas pratique très courant : alimenter un menu déroulant dans Forms à partir de données présentes dans Sheets.
Ce type de processus est particulièrement utile lorsqu’une liste d’options évolue régulièrement. Par exemple, j’ai déjà réalisé un projet Apps Script dans Sheets qui récupérait automatiquement, depuis GitLab, une série d’exercices techniques afin de les proposer comme options dans Forms. Les recruteurs pouvaient ainsi sélectionner directement les tests à faire passer.
Prenons un exemple avec une liste de sessions dans un spreadsheet :

Un formulaire contenant un champ à choix multiple permettant de sélectionner une session :

Pour faciliter la lecture des données, je vais créer mon projet Apps Script directement dans le spreadsheet. Nous allons aussi ajouter une fonction pour retrouver l’ID d’une question à partir de son titre, afin de faciliter la suite de l’exercice :
function retrieveItemId(form, questionTitle) {
const items = form.getItems();
for (let i of items) {
if (i.getTitle().trim() === questionTitle.trim()) {
return i.getId().toString();
}
}
return null;
}
Ainsi, il est facile de récupérer l’ID de la question sur laquelle on souhaite travailler.

Nous allons maintenant récupérer les données de la feuille et ajouter une option dans le menu déroulant pour chaque séance.
function addSessionOptionsInForms() {
// Get form and relevant item
const form = FormApp.openById("1sOyXKOdEM2WmxEGgNg9l9o0qn3-rA_mUdrSpnSt0GI4");
const questionId = retrieveItemId(form, "Please choose a session");
const item = form.getItemById(questionId).asMultipleChoiceItem(); ...Automatiser la suite : options autoréductrices et Calendar
1. Supprimer une option déjà choisie
Jusqu’ici, notre formulaire proposait tous les créneaux définis dans la feuille Sessions, sans se soucier de savoir si certains avaient déjà été choisis. Cela peut poser problème : deux personnes risquent de réserver le même créneau.
Pour éviter cela, nous allons mettre en place un mécanisme simple :
-
Lorsqu’un répondant choisit un créneau, on le retire automatiquement de la feuille.
-
Ensuite, on reconstruit les menus déroulants dans le formulaire afin que ce créneau ne soit plus proposé.
Afin de faciliter la gestion des déclencheurs, nous allons d’abord lier le formulaire au spreadsheet contenant les données des menus déroulants.
Pour cela, il suffit d’aller dans la section Responses depuis Forms, puis de cliquer sur Link to Sheets.

Vous pouvez ensuite choisir l’option Select existing spreadsheet.

Une fois le spreadsheet lié au formulaire, une nouvelle feuille est ajoutée. Celle-ci est remplie automatiquement par le formulaire à chaque soumission.

Retournons au projet Apps Script, dans lequel nous allons ajouter une fonction onFormSubmit. À chaque soumission du formulaire, la session choisie ainsi que le créneau seront récupérés, puis la feuille Sessions sera mise à jour pour enlever ce créneau.
À noter que dans notre cas, le déclencheur est installé depuis un projet lié à Sheets. L’objet d’événement n’a donc pas la même structure que celui provenant directement d’un formulaire.
Ici, nous allons utiliser e.namedValues, qui retourne un objet où chaque question est utilisée comme clé et la réponse correspondante comme valeur.

function onFormSubmit(e) {
const responses = e.namedValues;
const session = responses["Please choose a session"][0];
const slot = responses[`Choose a slot for ${session}`][0];
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getSheetByName("Sessions"); ...