Déclencheur simple ou installable : la vraie différence
| Simple | Installable | |
|---|---|---|
| Mise en place | Nommer la fonction onEdit, onOpen… | Menu Déclencheurs ou code ScriptApp |
| Services nécessitant une autorisation (Gmail, Drive, autre classeur, UrlFetchApp) | Non | Oui |
| S’exécute avec le compte de | La personne qui modifie | La personne qui a créé le déclencheur |
| Durée maximale | 30 secondes | 6 minutes, comme toute exécution |
| Programmation horaire | Non | Oui (minutes, heures, jours, semaines) |
Le piège classique : un onEdit qui appelle MailApp.sendEmail fonctionne quand on l’exécute
à la main depuis l’éditeur, puis échoue en silence quand on modifie la feuille. La raison : en déclencheur simple,
l’envoi d’e-mail est interdit. Il faut alors renommer la fonction (par exemple surModification) et lui
associer un déclencheur installable « Lors de la modification ».
onEdit : réagir à une modification
La fonction reçoit un objet événement, souvent nommé e, qui décrit la modification :
e.range: la plage modifiée ;e.value: la nouvelle valeur (seulement si une seule cellule a été modifiée) ;e.oldValue: l’ancienne valeur, dans le même cas ;e.source: le classeur.
Exemple : horodater automatiquement une ligne quand on passe son statut (colonne D) à « Terminé » :
function onEdit(e) {
const feuille = e.range.getSheet();
if (feuille.getName() !== 'Suivi') return; // seulement cet onglet
if (e.range.getColumn() !== 4 || e.range.getRow() < 2) return; // colonne D, hors en-tête
const cellDate = feuille.getRange(e.range.getRow(), 5); // colonne E
if (e.value === 'Terminé' && !cellDate.getValue()) {
cellDate.setValue(new Date());
}
}
Les premières lignes servent de filtre : onEdit se déclenche à chaque modification de
n’importe quelle cellule du classeur, il faut donc sortir au plus vite quand l’événement ne nous concerne pas.
Trois comportements à connaître :
-
Un collage sur plusieurs cellules déclenche un seul appel :
e.valueest alors indéfini, il faut parcourire.range.getValues(). -
Les modifications faites par un script ou par une API ne déclenchent pas
onEdit: seules les modifications d’un utilisateur comptent. -
On ne peut pas tester
onEditavec le bouton Exécuter :eest alors indéfini et la première ligne plante. Testez en modifiant réellement la feuille, puis consultez Exécutions dans l’éditeur.
onOpen : ajouter un menu à l’ouverture
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Outils')
.addItem('Générer le rapport', 'genererRapport')
.addToUi();
}
C’est l’usage le plus courant de onOpen : donner aux utilisateurs un bouton pour lancer une fonction,
sans qu’ils aient à ouvrir l’éditeur.
Créer un déclencheur installable depuis l’éditeur
- Dans l’éditeur Apps Script, cliquez sur l’icône réveil Déclencheurs dans la barre de gauche.
- Cliquez sur Ajouter un déclencheur.
- Choisissez la fonction à exécuter, puis la source de l’événement : Depuis une feuille de calcul (ouverture, modification, changement, envoi de formulaire) ou Déclenché par horaire.
- Pour un horaire, choisissez le type (minutes, heures, jour, semaine, mois) et l’intervalle.
- Enregistrez et acceptez l’autorisation demandée.
Créer un déclencheur temporisé par le code
// Tous les jours entre 7 h et 8 h (fuseau du projet)
function installerRapportQuotidien() {
supprimerDeclencheurs('envoyerRapport');
ScriptApp.newTrigger('envoyerRapport')
.timeBased()
.everyDays(1)
.atHour(7)
.create();
}
// Toutes les heures
function installerSynchro() {
supprimerDeclencheurs('synchroniser');
ScriptApp.newTrigger('synchroniser').timeBased().everyHours(1).create();
}
// Chaque lundi vers 9 h
function installerHebdo() {
supprimerDeclencheurs('bilanHebdo');
ScriptApp.newTrigger('bilanHebdo')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(9)
.create();
}
function supprimerDeclencheurs(nomFonction) {
ScriptApp.getProjectTriggers()
.filter(t => t.getHandlerFunction() === nomFonction)
.forEach(t => ScriptApp.deleteTrigger(t));
}
La fonction supprimerDeclencheurs évite le doublon le plus fréquent : chaque exécution de
installer… crée un nouveau déclencheur, et le rapport finit par partir trois fois. Avec
atHour(7), Google lance le script dans l’heure qui suit, pas à 7 h 00 pile.
everyMinutes() n’accepte que 1, 5, 10, 15 ou 30.
Vérifiez aussi le fuseau horaire du projet (Paramètres du projet) : s’il n’est pas réglé sur Europe/Paris, votre « 7 h » n’est pas le vôtre.
Déclencheur installable « Lors de la modification »
Le même principe, quand l’action a besoin d’autorisations (prévenir quelqu’un par e-mail, par exemple) :
function installerSurModification() {
supprimerDeclencheurs('surModification');
ScriptApp.newTrigger('surModification')
.forSpreadsheet(SpreadsheetApp.getActive())
.onEdit()
.create();
}
function surModification(e) {
if (e.range.getSheet().getName() !== 'Demandes' || e.range.getColumn() !== 3) return;
if (e.value === 'Urgent') {
MailApp.sendEmail('responsable@exemple.fr', 'Demande urgente',
'Ligne ' + e.range.getRow() + ' passée en Urgent.');
}
}
Le script s’exécute alors avec le compte de la personne qui l’a installé : l’e-mail part de son adresse et compte dans son quota d’envoi, quel que soit l’utilisateur qui a modifié la cellule.
Les limites à garder en tête
| Limite (page des quotas Google) | gmail.com | Google Workspace |
|---|---|---|
| Durée d’une exécution | 6 min | 6 min |
| Durée cumulée des déclencheurs par jour | 90 min | 6 h |
| Nombre de déclencheurs par utilisateur et par script | 20 | 20 |
Un script lancé toutes les minutes qui dure dix secondes consomme vite le budget quotidien d’un compte gratuit. Préférez l’intervalle le plus long qui reste acceptable pour le métier, et activez la notification d’échec proposée dans le formulaire du déclencheur : c’est le seul moyen de savoir qu’un script programmé a cessé de tourner.
Questions fréquentes
Mon onEdit ne se déclenche pas
Vérifiez l’orthographe exacte (onEdit, avec un E majuscule), que le script est bien lié au classeur
(Extensions → Apps Script) et que la modification est faite à la main, pas par une formule ou un autre
script. Une cellule qui change parce que sa formule est recalculée ne compte pas comme une modification.
Quelle différence entre « modification » et « changement » ?
Le déclencheur installable « Lors d’un changement » (onChange) réagit aussi aux changements de
structure : ajout ou suppression de lignes, de colonnes ou d’onglets. « Lors de la modification » ne réagit qu’aux
valeurs saisies.
Le déclencheur a disparu après le départ d’un collègue
Un déclencheur installable appartient à la personne qui l’a créé. Si son compte est supprimé ou perd l’accès au fichier, le déclencheur s’arrête. Pour un outil d’équipe, faites-le créer par un compte pérenne.
Les déclencheurs sont au cœur de la formation Google Apps Script, avec les menus personnalisés et l’envoi d’e-mails. Si vous préférez déléguer, voir l’automatisation Google Sheets sur mesure. À lire ensuite : envoyer des e-mails depuis Google Sheets et ranger vos réglages dans les propriétés du script.