Google Forms acceptera sans broncher jane@gmial.com, une adresse jetable issue
d'un domaine éphémère, ou l'adresse d'une entreprise qui a mis la clé sous la
porte il y a deux ans. Le réglage intégré « adresse e-mail valide » vérifie
seulement que le texte ressemble à une adresse — il ne demande jamais s'il y a
une vraie boîte aux lettres derrière. Pour vérifier réellement les e-mails issus
de Google Forms, il vous faut une deuxième étape : un contrôle concret face au
système de messagerie, soit au moment où une réponse arrive, soit par lot ensuite.
Ce guide présente les deux approches, en utilisant Google Apps Script comme liant.
La réponse en bref#
Deux voies, selon que vous avez besoin du verdict en direct ou que vous pouvez nettoyer par lots :
- Temps réel — ajoutez un déclencheur
onFormSubmitdans Apps Script qui lit l'adresse soumise, appelle l'API Qualisend avecUrlFetchApp, et réinscrit le verdict dans la Google Sheet liée. Chaque nouvelle réponse est scorée à mesure qu'elle arrive. - En masse — les réponses vivent déjà dans une feuille de calcul, alors téléchargez-les au format CSV et lancez une seule vérification en masse. Idéal pour un formulaire qui collecte depuis un certain temps, ou quand vous ne voulez pas toucher au code.
Les deux reposent sur le même verdict — deliverable, risky, undeliverable
ou unknown, plus des sous-indicateurs pour les adresses jetables, génériques
et gratuites. Ce qui change, c'est le moment.
Voie 1 : vérifier les e-mails de Google Forms en temps réel avec Apps Script#
Google Forms ne peut pas appeler d'API externe par lui-même, mais la feuille de calcul où affluent ses réponses le peut — via Apps Script. Le plan est simple : se déclencher à chaque soumission, récupérer l'e-mail, interroger Qualisend à son sujet, et estampiller la réponse à côté de la ligne.
Mettez le script en place. Ouvrez la Google Sheet qui recueille vos réponses
(dans l'éditeur de formulaire, Réponses → Associer à Sheets si ce n'est pas
déjà fait). Depuis la feuille, allez dans Extensions → Apps Script. Avant
toute chose, stockez votre clé pour qu'elle ne se trouve jamais dans le code :
dans l'éditeur de scripts, ouvrez Paramètres du projet → Propriétés du script
et ajoutez QUALISEND_API_KEY avec votre valeur. Le script la lit à l'exécution
avec PropertiesService.
Puis collez un gestionnaire comme celui-ci. Il appelle
POST https://app.qualisend.com/api/v1/verify, et la référence de
l'API détaille la requête et la réponse complètes :
// Bound to the responses spreadsheet.
// Runs on each new Form submission (see trigger setup below).
const QUALISEND_URL = 'https://app.qualisend.com/api/v1/verify';
const EMAIL_QUESTION = 'Email address'; // your exact question title
const STATUS_COL = 8; // first of 3 empty columns: verdict, score, pending job id
function onFormSubmit(e) {
const email = (e.namedValues[EMAIL_QUESTION] || [])[0];
if (!email) return;
const apiKey = PropertiesService.getScriptProperties().getProperty('QUALISEND_API_KEY');
const res = UrlFetchApp.fetch(QUALISEND_URL, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + apiKey },
payload: JSON.stringify({ email }),
muteHttpExceptions: true, // handle errors ourselves instead of throwing
});
// Fail open: if the check errors, keep the response — never lose a real lead.
if (res.getResponseCode() !== 200) return;
const { job_id, result } = JSON.parse(res.getContentText());
const row = e.range.getRow();
const sheet = e.range.getSheet();
sheet.getRange(row, STATUS_COL).setValue(result.status); // deliverable | risky | undeliverable | unknown
sheet.getRange(row, STATUS_COL + 1).setValue(result.score); // 0-100
// SMTP probe still running: keep the job id so finishPending() can fetch the final verdict.
if (result.smtp === 'pending') sheet.getRange(row, STATUS_COL + 2).setValue(job_id);
}
L'objet e que vous remet une soumission de formulaire est la partie utile :
e.namedValues associe chaque intitulé de question à sa réponse, et e.range
est la ligne qui vient d'être écrite — ainsi e.range.getRow() vous indique
exactement quelle ligne estampiller. Faites correspondre EMAIL_QUESTION à
l'intitulé de votre question au caractère près, et pointez STATUS_COL vers la
première de trois colonnes vides (verdict, score et l'identifiant d'une tâche en
attente).
Ajoutez le déclencheur. Un déclencheur simple (une simple fonction
onFormSubmit nue) ne peut pas appeler UrlFetchApp, car atteindre un service
externe requiert une autorisation dont les déclencheurs simples ne disposent pas.
Il vous faut plutôt un déclencheur installable. Dans l'éditeur de scripts,
ouvrez Déclencheurs (l'icône d'horloge) → Ajouter un déclencheur, et
choisissez :
- Fonction :
onFormSubmit - Source de l'événement : Depuis la feuille de calcul
- Type d'événement : Lors de l'envoi du formulaire
Enregistrez, approuvez une fois l'invite d'autorisation, et vous voilà en ligne. Soumettez une réponse de test et observez le statut et le score apparaître dans les colonnes que vous avez choisies.
Un mot sur le moment du contrôle. Qualisend renvoie immédiatement les
contrôles locaux rapides (syntaxe, domaine, adresse jetable, adresse générique,
faute de frappe), la sonde SMTP plus poussée de la boîte aux lettres se terminant
peu après. Tant que cette sonde tourne, la réponse indique result.smtp à
"pending" et le statut estampillé est le verdict provisoire (cached ou
skipped signifient qu'il est déjà définitif). La réponse confirmée par SMTP
arrive sur la tâche, que vous lisez avec
GET https://app.qualisend.com/api/v1/jobs/{job_id}. Le gestionnaire ci-dessus
enregistre l'identifiant de la tâche précisément pour cela, et une seconde
fonction du même script inscrit le verdict définitif dès que la tâche est
terminée :
// Same script. Run by a time-driven trigger: once a pending job completes,
// replace the instant verdict with the SMTP-confirmed one.
function finishPending() {
const sheet = SpreadsheetApp.getActive().getSheetByName('Form Responses 1'); // your responses tab
const apiKey = PropertiesService.getScriptProperties().getProperty('QUALISEND_API_KEY');
const lastRow = sheet.getLastRow();
if (lastRow < 2) return;
const jobIds = sheet.getRange(2, STATUS_COL + 2, lastRow - 1, 1).getValues();
jobIds.forEach(([jobId], i) => {
if (!jobId) return;
const res = UrlFetchApp.fetch(
'https://app.qualisend.com/api/v1/jobs/' + jobId + '?include=results',
{ headers: { Authorization: 'Bearer ' + apiKey }, muteHttpExceptions: true }
);
if (res.getResponseCode() !== 200) return; // try again on the next run
const job = JSON.parse(res.getContentText());
if (job.status === 'pending' || job.status === 'processing') return; // still probing
const row = i + 2;
const verdict = (job.results || [])[0];
if (verdict) {
sheet.getRange(row, STATUS_COL).setValue(verdict.status);
sheet.getRange(row, STATUS_COL + 1).setValue(verdict.score);
}
sheet.getRange(row, STATUS_COL + 2).clearContent(); // settled: stop checking this row
});
}
Lancez-la avec un second déclencheur installable : fonction finishPending,
déclenchement horaire, toutes les 5 minutes. Elle n'appelle l'API que pour les
lignes qui contiennent encore un identifiant de tâche. N'appelez pas /verify une
seconde fois pour rafraîchir une ligne : cela lance une deuxième vérification et
coûte un crédit de plus. Comment fonctionne la vérification
des e-mails explique en détail pourquoi
l'étape SMTP est la plus lente.
Voie 2 : vérifier en masse la feuille des réponses#
Si votre formulaire collecte depuis des mois, ou si vous préférez ne pas maintenir de script, faites l'impasse totale sur le déclencheur. Vos réponses sont déjà une feuille de calcul — vérifiez-les en une seule passe.
- Ouvrez la Google Sheet liée (ou l'onglet Réponses du formulaire → Associer à Sheets).
- Fichier → Télécharger → Valeurs séparées par des virgules (.csv).
- Importez ce CSV dans la vérification en masse de Qualisend, associez la colonne d'e-mail, et lancez la tâche.
- Téléchargez les résultats et faites-les correspondre à vos lignes par e-mail, ou recollez la colonne de statut dans la feuille.
Le mode en masse exécute tout le pipeline, y compris la sonde SMTP, sur chaque ligne — il attrape donc les boîtes aux lettres mortes qu'un contrôle de syntaxe ne repérerait jamais. C'est la même routine que vous utiliseriez pour n'importe quelle liste exportée ; notre guide sur comment nettoyer une liste d'e-mails traite du dédoublonnage, de la gestion des adresses génériques, et de ce qu'il faut faire du lot risky. Pour un contrôle rapide et ponctuel sur une seule adresse, le vérificateur d'adresse unique gratuit ne réclame aucun CSV.
Agir sur les verdicts#
Un verdict n'est utile que s'il change ce que vous faites ensuite. Peu importe la façon dont vous l'avez recueilli, traitez les quatre statuts ainsi :
| Verdict | Que faire de la réponse |
|---|---|
deliverable | Gardez-la. Une vraie boîte aux lettres a accepté la sonde — vous pouvez lui écrire sans risque. |
undeliverable | Supprimez-la. Lui écrire signifie un rebond dur, et les rebonds sont ce qui nuit à votre réputation d'expéditeur. |
risky | Segmentez-la. Souvent un domaine catch-all — envoyez avec prudence et surveillez l'engagement avant de lui faire confiance. |
unknown | Réessayez plus tard. Le serveur de messagerie n'a pas donné de réponse claire ; n'écartez pas pour autant un prospect peut-être réel. |
Les sous-indicateurs affinent le tableau. Un indicateur disposable sur une
participation à un jeu-concours est en général une adresse jetable dont vous
pouvez vous débarrasser ; un indicateur role (info@, support@) peut compter selon la
finalité du formulaire. Adresses génériques, jetables et
gratuites explique quand chacune vaut la
peine d'être filtrée. Dans le script en temps réel, vous pouvez agir dessus
immédiatement — par exemple, en inscrivant une note « à revoir » dans une colonne
lorsque result.sub_flags.disposable vaut vrai.
Quelle voie choisir ?#
Optez pour le déclencheur Apps Script en temps réel lorsque les réponses sont des prospects que vous relancez rapidement — demandes de démo, listes d'attente, contenu réservé — et que vous voulez le verdict posé à côté de chaque ligne dès qu'elle arrive. Cela coûte un crédit par soumission et un peu de maintenance de script.
Optez pour le mode en masse lorsque vous avez un arriéré à nettoyer, quand
vous préférez éviter le code, ou quand un formulaire très actif ferait exploser le
quota UrlFetchApp grand public. Rien ne vous empêche de faire les deux : lancez
le déclencheur sur les nouvelles réponses et une passe en masse mensuelle pour
revérifier les adresses susceptibles d'être devenues obsolètes.
Dans les deux cas, le même principe que dans notre guide de vérification à l'inscription s'applique — vérifiez avant qu'une adresse n'atteigne votre outil d'envoi, pour qu'une faute de frappe devienne un prospect corrigé plutôt qu'un rebond que vous payez plus tard. Si vos formulaires sont répartis sur plusieurs outils, le schéma se généralise : une étape Zapier no-code ou un webhook Typeform fait le même travail pour ces plateformes.
Foire aux questions
01Google Forms peut-il vérifier des adresses e-mail par lui-même ?
Non. Google Forms propose une option « Validation des réponses » qui vérifie qu'une réponse ressemble à un e-mail - la bonne forme, un @, un domaine - mais elle ne contacte jamais le serveur de messagerie, si bien qu'elle ne peut pas distinguer une vraie boîte aux lettres d'une faute de frappe ou d'un domaine jetable. Ce contrôle de forme n'est qu'un premier filtre - il laisse passer jane@gmial.com sans broncher. Une vérification réelle exige l'API ou l'étape en masse décrite plus haut.
02Faut-il écrire du code pour vérifier les réponses de Google Forms ?
Uniquement pour la voie en temps réel. Le déclencheur Apps Script demande de coller un court script et de configurer un déclencheur, mais le code est réduit et réutilisable. Si vous préférez l'éviter entièrement, la voie en masse se fait au tout venant : téléchargez les réponses au format CSV, importez-les pour une vérification en masse, et réintégrez les résultats. Sans script, sans déclencheur.
03La vérification va-t-elle ralentir la personne qui remplit mon formulaire ?
Non. Avec le déclencheur Apps Script, le contrôle s'exécute après la soumission - le répondant a déjà vu l'écran de confirmation pendant que votre feuille est estampillée discrètement en arrière-plan. Rien ne bloque le formulaire. Si vous voulez que la vérification conditionne la soumission elle-même, cela relève d'un formulaire personnalisé doté d'un point de terminaison serverless, pas de Google Forms natif.
Prêt à faire le ménage dans vos réponses Google Forms ? Le forfait
gratuit inclut 100 crédits pour tester l'une ou l'autre voie, le
vérificateur d'adresse unique gratuit ne réclame aucune
configuration, et la référence de l'API présente le point de
terminaison /verify avec des exemples prêts à copier-coller en sept langues.




04Comment garder ma clé d'API Qualisend hors du script ?
Stockez-la dans les Propriétés du script, pas dans le code. Dans l'éditeur Apps Script, ouvrez Paramètres du projet → Propriétés du script, ajoutez
QUALISEND_API_KEY, et lisez-la à l'exécution avecPropertiesService.getScriptProperties().getProperty(...), comme le fait l'extrait ci-dessus. Utilisez une clé à portée limitée depuis votre tableau de bord Qualisend pour qu'elle ne dispose que des permissions de vérification, et changez-la si elle venait à être exposée.