EmailVerify LogoEmailVerify

Google Forms

Email checker for Google Forms with Apps Script automation.

Intégrez EmailVerify avec Google Forms pour vérifier automatiquement les adresses e-mail lors de la soumission des réponses.

Méthodes d'intégration

MéthodeIdéal pourComplexité
Apps ScriptVérification automatiséeFaible
Module complémentaire SheetsVérification manuelleFaible
ZapierWorkflow sans codeFaible

Méthode 1 : Google Apps Script

Créez un workflow de vérification automatisé en utilisant Google Apps Script.

Étape 1 : Créer un projet Apps Script

  1. Ouvrez votre Google Form
  2. Cliquez sur le menu Éditeur de script
  3. Cela ouvre l'éditeur Apps Script

Étape 2 : Ajouter le code de vérification

Remplacez le code par défaut par :

// Configuration
const CONFIG = {
  API_KEY: 'VOTRE_CLE_API_EMAILVERIFY',
  EMAIL_FIELD_INDEX: 1, // Ajuster selon votre formulaire (indexé à 0)
  BLOCK_DISPOSABLE: true,
  NOTIFY_ON_INVALID: true,
  NOTIFICATION_EMAIL: 'admin@votreentreprise.com',
};

/**
 * Fonction déclencheur - s'exécute lors de la soumission du formulaire
 */
function onFormSubmit(e) {
  const response = e.response;
  const email = getEmailFromResponse(response);

  if (!email) {
    Logger.log('Aucun e-mail trouvé dans la réponse');
    return;
  }

  // Vérifier l'e-mail
  const result = verifyEmail(email);

  // Stocker le résultat
  storeVerificationResult(response, result);

  // Gérer les e-mails invalides
  if (!result.isValid) {
    handleInvalidEmail(response, email, result);
  }
}

/**
 * Extraire l'e-mail de la réponse du formulaire
 */
function getEmailFromResponse(response) {
  const itemResponses = response.getItemResponses();

  // Essayer de trouver le champ e-mail par type
  for (const itemResponse of itemResponses) {
    const item = itemResponse.getItem();
    const itemType = item.getType();

    // Vérifier s'il s'agit d'un élément de texte avec validation e-mail
    if (itemType === FormApp.ItemType.TEXT) {
      const textItem = item.asTextItem();
      const validation = textItem.getValidation();

      // Si la validation exige le format e-mail
      if (validation) {
        return itemResponse.getResponse();
      }
    }
  }

  // Solution de secours : utiliser l'index configuré
  if (CONFIG.EMAIL_FIELD_INDEX < itemResponses.length) {
    return itemResponses[CONFIG.EMAIL_FIELD_INDEX].getResponse();
  }

  return null;
}

/**
 * Appeler l'API EmailVerify pour vérifier l'e-mail
 */
function verifyEmail(email) {
  const url = 'https://api.emailverify.ai/v1/verify';

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + CONFIG.API_KEY,
    },
    payload: JSON.stringify({ email: email }),
    muteHttpExceptions: true,
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());

    const isValid = data.status === 'valid' &&
      !(CONFIG.BLOCK_DISPOSABLE && data.result?.disposable);

    return {
      email: email,
      status: data.status,
      score: data.score,
      isDisposable: data.result?.disposable || false,
      isRole: data.result?.role || false,
      isValid: isValid,
      raw: data,
    };
  } catch (error) {
    Logger.log('Erreur de vérification : ' + error.message);
    return {
      email: email,
      status: 'error',
      isValid: true, // Autoriser en cas d'erreur
      error: error.message,
    };
  }
}

/**
 * Stocker le résultat de vérification dans la feuille de calcul liée
 */
function storeVerificationResult(response, result) {
  const form = FormApp.getActiveForm();
  const destinationId = form.getDestinationId();

  if (!destinationId) {
    Logger.log('Aucune feuille de calcul liée trouvée');
    return;
  }

  const spreadsheet = SpreadsheetApp.openById(destinationId);
  const sheet = spreadsheet.getSheets()[0];

  // Trouver la ligne de réponse
  const responseRow = findResponseRow(sheet, response);

  if (responseRow === -1) {
    Logger.log('Impossible de trouver la ligne de réponse');
    return;
  }

  // Ajouter des colonnes de vérification si elles n'existent pas
  ensureVerificationColumns(sheet);

  // Obtenir les indices de colonnes
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  const statusCol = headers.indexOf('Statut E-mail') + 1;
  const scoreCol = headers.indexOf('Score E-mail') + 1;
  const disposableCol = headers.indexOf('Est Jetable') + 1;

  // Mettre à jour la ligne
  if (statusCol > 0) {
    sheet.getRange(responseRow, statusCol).setValue(result.status);
  }
  if (scoreCol > 0 && result.score !== undefined) {
    sheet.getRange(responseRow, scoreCol).setValue(result.score);
  }
  if (disposableCol > 0) {
    sheet.getRange(responseRow, disposableCol).setValue(result.isDisposable ? 'Oui' : 'Non');
  }

  // Appliquer la mise en forme conditionnelle
  if (result.status === 'invalid' || result.isDisposable) {
    sheet.getRange(responseRow, 1, 1, sheet.getLastColumn())
      .setBackground('#ffcccb');
  }
}

/**
 * Trouver le numéro de ligne pour une réponse
 */
function findResponseRow(sheet, response) {
  const timestamp = response.getTimestamp();
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    const rowTimestamp = data[i][0];
    if (rowTimestamp instanceof Date &&
        Math.abs(rowTimestamp.getTime() - timestamp.getTime()) < 5000) {
      return i + 1; // indexé à 1
    }
  }

  return -1;
}

/**
 * Ajouter des colonnes de vérification à la feuille de calcul
 */
function ensureVerificationColumns(sheet) {
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  const columnsToAdd = ['Statut E-mail', 'Score E-mail', 'Est Jetable'];

  for (const column of columnsToAdd) {
    if (!headers.includes(column)) {
      const newCol = sheet.getLastColumn() + 1;
      sheet.getRange(1, newCol).setValue(column);
    }
  }
}

/**
 * Gérer les soumissions d'e-mails invalides
 */
function handleInvalidEmail(response, email, result) {
  if (!CONFIG.NOTIFY_ON_INVALID) {
    return;
  }

  const form = FormApp.getActiveForm();
  const formTitle = form.getTitle();

  const subject = `[${formTitle}] Soumission d'e-mail invalide`;
  const body = `
Un e-mail invalide a été soumis à votre formulaire.

Formulaire : ${formTitle}
E-mail : ${email}
Statut : ${result.status}
${result.isDisposable ? 'Note : E-mail jetable détecté' : ''}
Score : ${result.score || 'N/D'}

Horodatage : ${response.getTimestamp()}
  `.trim();

  MailApp.sendEmail({
    to: CONFIG.NOTIFICATION_EMAIL,
    subject: subject,
    body: body,
  });
}

/**
 * Configurer le déclencheur de soumission de formulaire
 * Exécutez cette fonction une fois pour installer le déclencheur
 */
function installTrigger() {
  const form = FormApp.getActiveForm();

  // Supprimer les déclencheurs existants
  const triggers = ScriptApp.getUserTriggers(form);
  for (const trigger of triggers) {
    if (trigger.getHandlerFunction() === 'onFormSubmit') {
      ScriptApp.deleteTrigger(trigger);
    }
  }

  // Installer un nouveau déclencheur
  ScriptApp.newTrigger('onFormSubmit')
    .forForm(form)
    .onFormSubmit()
    .create();

  Logger.log('Déclencheur installé avec succès');
}

/**
 * Tester la vérification (exécution manuelle)
 */
function testVerification() {
  const result = verifyEmail('test@example.com');
  Logger.log(JSON.stringify(result, null, 2));
}

Étape 3 : Installer le déclencheur

  1. Dans l'éditeur Apps Script, sélectionnez installTrigger dans la liste déroulante des fonctions
  2. Cliquez sur Exécuter
  3. Accordez les autorisations requises lorsqu'on vous le demande

Étape 4 : Tester l'intégration

  1. Soumettez une réponse de test à votre formulaire
  2. Vérifiez la feuille de calcul liée pour les résultats de vérification
  3. Consultez les journaux Apps Script : Exécutions dans la barre latérale gauche

Méthode 2 : Module complémentaire Spreadsheet

Vérifiez les e-mails directement dans Google Sheets avec une barre latérale personnalisée.

Créer le code du module complémentaire

// Code.gs
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('EmailVerify')
    .addItem('Vérifier les e-mails sélectionnés', 'verifySelected')
    .addItem('Vérifier tous les e-mails', 'verifyAll')
    .addItem('Paramètres', 'showSettings')
    .addToUi();
}

function verifySelected() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getActiveRange();
  const values = range.getValues();

  const results = [];

  for (let i = 0; i < values.length; i++) {
    const email = values[i][0];

    if (!email || !isValidEmailFormat(email)) {
      results.push(['Format invalide']);
      continue;
    }

    const result = verifyEmail(email);
    results.push([result.status + (result.isDisposable ? ' (jetable)' : '')]);
  }

  // Écrire les résultats dans la colonne suivante
  const startCol = range.getColumn() + range.getNumColumns();
  sheet.getRange(range.getRow(), startCol, results.length, 1).setValues(results);
}

function verifyAll() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const ui = SpreadsheetApp.getUi();

  // Demander la colonne des e-mails
  const response = ui.prompt(
    'Vérifier tous les e-mails',
    'Entrez la lettre de la colonne contenant les e-mails (ex. B) :',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() !== ui.Button.OK) {
    return;
  }

  const column = response.getResponseText().toUpperCase();
  const colIndex = column.charCodeAt(0) - 64; // A=1, B=2, etc.

  const lastRow = sheet.getLastRow();
  const emailRange = sheet.getRange(2, colIndex, lastRow - 1, 1);
  const emails = emailRange.getValues().flat().filter(e => e);

  ui.alert(`Démarrage de la vérification de ${emails.length} e-mails...`);

  // Vérifier par lots
  const batchSize = 50;
  let processed = 0;

  for (let i = 0; i < emails.length; i += batchSize) {
    const batch = emails.slice(i, i + batchSize);

    for (let j = 0; j < batch.length; j++) {
      const email = batch[j];
      const rowIndex = i + j + 2; // +2 pour l'en-tête et l'index 0

      if (!isValidEmailFormat(email)) {
        sheet.getRange(rowIndex, colIndex + 1).setValue('Format invalide');
        continue;
      }

      const result = verifyEmail(email);

      // Écrire le statut
      sheet.getRange(rowIndex, colIndex + 1).setValue(result.status);

      // Écrire le score
      if (result.score !== undefined) {
        sheet.getRange(rowIndex, colIndex + 2).setValue(result.score);
      }

      // Mettre en surbrillance les invalides
      if (result.status === 'invalid' || result.isDisposable) {
        sheet.getRange(rowIndex, 1, 1, sheet.getLastColumn()).setBackground('#ffcccb');
      }
    }

    processed += batch.length;
    SpreadsheetApp.flush();

    // Éviter les limites de débit
    if (i + batchSize < emails.length) {
      Utilities.sleep(1000);
    }
  }

  ui.alert(`Vérification terminée ! ${processed} e-mails traités.`);
}

function isValidEmailFormat(email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

function showSettings() {
  const html = HtmlService.createHtmlOutputFromFile('Settings')
    .setWidth(400)
    .setHeight(300);
  SpreadsheetApp.getUi().showModalDialog(html, 'Paramètres EmailVerify');
}

function saveSettings(apiKey) {
  PropertiesService.getUserProperties().setProperty('EMAILVERIFY_API_KEY', apiKey);
  return { success: true };
}

function getApiKey() {
  return PropertiesService.getUserProperties().getProperty('EMAILVERIFY_API_KEY') || '';
}

HTML des paramètres

<!-- Settings.html -->
<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      font-family: Arial, sans-serif;
      padding: 20px;
    }
    .form-group {
      margin-bottom: 15px;
    }
    label {
      display: block;
      margin-bottom: 5px;
      font-weight: bold;
    }
    input[type="text"] {
      width: 100%;
      padding: 8px;
      border: 1px solid #ddd;
      border-radius: 4px;
      box-sizing: border-box;
    }
    button {
      background-color: #4285f4;
      color: white;
      padding: 10px 20px;
      border: none;
      border-radius: 4px;
      cursor: pointer;
    }
    button:hover {
      background-color: #357abd;
    }
    .success {
      color: #28a745;
      margin-top: 10px;
    }
  </style>
</head>
<body>
  <div class="form-group">
    <label for="apiKey">Clé API EmailVerify</label>
    <input type="text" id="apiKey" placeholder="bv_live_xxx" />
  </div>

  <button onclick="saveSettings()">Enregistrer les paramètres</button>

  <div id="message" class="success" style="display: none;"></div>

  <script>
    // Charger les paramètres existants
    google.script.run.withSuccessHandler(function(apiKey) {
      document.getElementById('apiKey').value = apiKey;
    }).getApiKey();

    function saveSettings() {
      const apiKey = document.getElementById('apiKey').value;

      google.script.run.withSuccessHandler(function(result) {
        if (result.success) {
          document.getElementById('message').textContent = 'Paramètres enregistrés !';
          document.getElementById('message').style.display = 'block';
          setTimeout(function() {
            google.script.host.close();
          }, 1500);
        }
      }).saveSettings(apiKey);
    }
  </script>
</body>
</html>

Méthode 3 : Intégration Zapier

Connectez Google Forms à EmailVerify en utilisant Zapier.

Configuration du Zap

  1. Déclencheur : Google Forms → Nouvelle réponse dans la feuille de calcul
  2. Action 1 : Webhooks by Zapier → POST vers EmailVerify
  3. Action 2 : Google Sheets → Mettre à jour la ligne de la feuille de calcul

Configuration du Webhook

URL : https://api.emailverify.ai/v1/verify
Méthode : POST
En-têtes :
  Authorization: Bearer VOTRE_CLE_API
  Content-Type: application/json
Données :
{
  "email": "{{valeur_champ_email}}"
}

Mise à jour de la ligne

Mappez le résultat de vérification dans votre feuille de calcul :

  • Colonne : Statut de l'e-mail → {{status}}
  • Colonne : Score de l'e-mail → {{score}}
  • Colonne : Est jetable → {{result__disposable}}

Script de vérification en masse

Pour vérifier de grands ensembles de données existants :

/**
 * Vérifier en masse les e-mails d'une colonne
 * Traite par lots avec suivi de progression
 */
function bulkVerifyEmails() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const ui = SpreadsheetApp.getUi();

  // Configuration
  const EMAIL_COL = 2;      // Colonne B (indexé à 1)
  const STATUS_COL = 3;     // Colonne C pour le statut
  const SCORE_COL = 4;      // Colonne D pour le score
  const START_ROW = 2;      // Ignorer l'en-tête
  const BATCH_SIZE = 100;

  const lastRow = sheet.getLastRow();
  const totalEmails = lastRow - START_ROW + 1;

  const proceed = ui.alert(
    'Vérification en masse',
    `Cela vérifiera ${totalEmails} e-mails. Continuer ?`,
    ui.ButtonSet.YES_NO
  );

  if (proceed !== ui.Button.YES) {
    return;
  }

  // Obtenir tous les e-mails
  const emailRange = sheet.getRange(START_ROW, EMAIL_COL, totalEmails, 1);
  const emails = emailRange.getValues().flat();

  // Obtenir la clé API
  const apiKey = PropertiesService.getUserProperties().getProperty('EMAILVERIFY_API_KEY');
  if (!apiKey) {
    ui.alert('Veuillez d\'abord configurer votre clé API dans les paramètres.');
    return;
  }

  // Traiter par lots
  let processed = 0;
  const stats = { valid: 0, invalid: 0, disposable: 0, errors: 0 };

  for (let i = 0; i < emails.length; i++) {
    const email = emails[i];
    const row = START_ROW + i;

    // Ignorer si déjà vérifié
    const existingStatus = sheet.getRange(row, STATUS_COL).getValue();
    if (existingStatus) {
      processed++;
      continue;
    }

    if (!email || !isValidEmailFormat(email)) {
      sheet.getRange(row, STATUS_COL).setValue('format_invalide');
      stats.errors++;
      processed++;
      continue;
    }

    // Vérifier
    const result = verifyEmailWithKey(email, apiKey);

    // Écrire les résultats
    sheet.getRange(row, STATUS_COL).setValue(result.status);
    if (result.score !== undefined) {
      sheet.getRange(row, SCORE_COL).setValue(result.score);
    }

    // Mettre à jour les statistiques
    if (result.status === 'valid') stats.valid++;
    else if (result.status === 'invalid') stats.invalid++;
    if (result.isDisposable) stats.disposable++;
    if (result.error) stats.errors++;

    // Mettre en surbrillance les lignes invalides
    if (result.status === 'invalid' || result.isDisposable) {
      sheet.getRange(row, 1, 1, sheet.getLastColumn()).setBackground('#ffcccb');
    }

    processed++;

    // Mise à jour de progression toutes les 50 e-mails
    if (processed % 50 === 0) {
      SpreadsheetApp.flush();
      Logger.log(`Progression : ${processed}/${totalEmails}`);
    }

    // Limitation de débit
    Utilities.sleep(100);
  }

  // Statistiques finales
  const message = `
Vérification terminée !

Total : ${processed}
Valides : ${stats.valid}
Invalides : ${stats.invalid}
Jetables : ${stats.disposable}
Erreurs : ${stats.errors}
  `.trim();

  ui.alert('Résultats', message, ui.ButtonSet.OK);
}

function verifyEmailWithKey(email, apiKey) {
  const url = 'https://api.emailverify.ai/v1/verify';

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + apiKey,
    },
    payload: JSON.stringify({ email: email }),
    muteHttpExceptions: true,
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());

    return {
      status: data.status,
      score: data.score,
      isDisposable: data.result?.disposable || false,
    };
  } catch (error) {
    return {
      status: 'error',
      error: error.message,
    };
  }
}

Notifications par e-mail conditionnelles

Envoyez différents e-mails en fonction des résultats de vérification :

/**
 * Envoyer un e-mail de confirmation uniquement aux adresses vérifiées
 */
function sendConditionalConfirmation(e) {
  const response = e.response;
  const email = getEmailFromResponse(response);

  if (!email) return;

  // Vérifier l'e-mail d'abord
  const result = verifyEmail(email);

  if (!result.isValid) {
    // Envoyer une notification à l'administrateur à la place
    notifyAdminOfInvalidSubmission(response, email, result);
    return;
  }

  // Envoyer une confirmation à l'e-mail valide
  const formTitle = FormApp.getActiveForm().getTitle();

  MailApp.sendEmail({
    to: email,
    subject: `Merci pour votre soumission à ${formTitle}`,
    htmlBody: `
      <h2>Merci !</h2>
      <p>Nous avons reçu votre soumission et vous contacterons bientôt.</p>
      <p>Cordialement,<br>L'équipe</p>
    `,
  });
}

function notifyAdminOfInvalidSubmission(response, email, result) {
  const formTitle = FormApp.getActiveForm().getTitle();

  MailApp.sendEmail({
    to: CONFIG.NOTIFICATION_EMAIL,
    subject: `[Alerte] Soumission d'e-mail invalide - ${formTitle}`,
    body: `
Une soumission avec un e-mail invalide a été reçue.

E-mail : ${email}
Statut : ${result.status}
Jetable : ${result.isDisposable}

Veuillez consulter la soumission dans votre feuille de calcul.
    `,
  });
}

Bonnes pratiques

1. Stocker la clé API en toute sécurité

// Utiliser Properties Service au lieu de coder en dur
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');

2. Gérer les limites de débit

function verifyWithRetry(email, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const result = verifyEmail(email);

    if (result.status !== 'error' || !result.error.includes('rate')) {
      return result;
    }

    // Attendre et réessayer
    Utilities.sleep(2000 * (i + 1));
  }

  return { status: 'error', error: 'Nombre maximum de tentatives atteint' };
}

3. Gestion élégante des erreurs

// Ne jamais bloquer les soumissions de formulaire en cas d'erreurs API
if (result.error) {
  Logger.log('Échec de la vérification, autorisation de la soumission');
  return; // Ne pas bloquer la soumission
}

Ressources associées

On this page