1. Livres & vidéos
  2. Google Apps Script
  3. Google Forms avec FormApp
Extrait - Google Apps Script Créez vos outils pour automatiser Google Workspace
Extraits du livre
Google Apps Script Créez vos outils pour automatiser Google Workspace Revenir à la page d'achat du livre

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) :

images/16RI01.png

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, GridItemPageBreakItem, 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 :

images/16RI12.png

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

images/16RI13.png

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. 

images/16RI14.png

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.

images/16RI19.png

 Vous pouvez ensuite choisir l’option Select existing spreadsheet.

images/16RI20.png

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

images/16RI21.png

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.

images/16RI22.png
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"); ...