11 min de lecture

Envoyer des e-mails depuis Google Sheets avec Apps Script : MailApp, GmailApp et publipostage

Envoyer automatiquement un e-mail personnalisé à chaque ligne d’un Google Sheets : MailApp ou GmailApp, e-mail HTML, pièce jointe PDF, colonne « Envoyé » pour ne jamais envoyer deux fois, quotas quotidiens et erreurs fréquentes, avec un script complet prêt à copier.

  • Google Apps Script
  • Gmail
  • Tutoriel
  • Automatisation
Schéma : feuille partagée versus base applicative Croissance des usages Sheets App + rôles + audit

Le premier e-mail en trois lignes

function testEnvoi() {
  MailApp.sendEmail('vous@exemple.fr', 'Test Apps Script', 'Bonjour, ceci est un test.');
}

À la première exécution, Google demande l’autorisation d’« envoyer des e-mails en votre nom ». L’e-mail part de votre adresse, et apparaît dans vos messages envoyés.

MailApp ou GmailApp ?

MailAppGmailApp
Envoyer un e-mail (texte, HTML, pièces jointes, copie)OuiOui
Créer un brouillon, répondre à un fil, lire la boîteNonOui
Envoyer depuis un alias (option from)NonOui
Autorisation demandéeEnvoi d’e-mails uniquementAccès complet à Gmail

Pour un simple envoi, MailApp est le bon choix : l’autorisation est plus étroite, donc plus facile à faire accepter par vos collègues. Passez à GmailApp quand vous voulez préparer des brouillons à relire avant envoi, ou envoyer depuis une adresse de type contact@ configurée comme alias.

Le publipostage : un e-mail par ligne

Tableau de départ, onglet Envoi :

A : PrénomB : E-mailC : MontantD : ÉchéanceE : Envoyé le
Juliejulie@exemple.fr1 20015/11/2026
Karimkarim@exemple.fr45020/11/2026
function envoyerRelances() {
  const feuille = SpreadsheetApp.getActive().getSheetByName('Envoi');
  const donnees = feuille.getDataRange().getValues();
  const tz = Session.getScriptTimeZone();
  for (let i = 1; i < donnees.length; i++) {          // i = 1 : on saute l’en-tête
    const [prenom, email, montant, echeance, envoyeLe] = donnees[i];
    if (!email || envoyeLe) continue;                    // pas d’adresse ou déjà envoyé
    if (MailApp.getRemainingDailyQuota() < 1) {
      Logger.log('Quota du jour atteint, reprise demain à la ligne ' + (i + 1));
      break;
    }
    const date = Utilities.formatDate(new Date(echeance), tz, 'dd/MM/yyyy');
    MailApp.sendEmail({
      to: email,
      subject: 'Rappel : échéance du ' + date,
      body: 'Bonjour ' + prenom + ',\n\nPetit rappel : le règlement de ' + montant +
            ' € est attendu pour le ' + date + '.\n\nBonne journée',
      name: 'Service comptabilité',
      replyTo: 'compta@exemple.fr',
    });
    feuille.getRange(i + 1, 5).setValue(new Date());     // colonne E
    SpreadsheetApp.flush();                              // écrit tout de suite
  }
}

Les trois détails qui font la différence :

  • La colonne « Envoyé le » rend le script relançable sans risque : si l’exécution s’arrête au milieu, la relancer ne renvoie que les lignes manquantes.
  • getRemainingDailyQuota() arrête proprement la boucle avant d’atteindre le quota, au lieu de planter au milieu.
  • Utilities.formatDate évite les dates du type « Sun Nov 15 2026 00:00:00 GMT+0100 » dans le texte de l’e-mail.

Un e-mail en HTML

MailApp.sendEmail({
  to: email,
  subject: 'Votre inscription est confirmée',
  body: 'Bonjour ' + prenom + ', votre inscription est confirmée.', // version texte
  htmlBody: '<p>Bonjour ' + prenom + ',</p>' +
            '<p>Votre inscription est <strong>confirmée</strong>.</p>',
});

Gardez une version body en texte simple : elle s’affiche dans les messageries qui bloquent le HTML. Si une donnée du tableau peut contenir des caractères comme < ou &, échappez-la avant de l’insérer dans le HTML.

Joindre le classeur en PDF

function envoyerPdf() {
  const classeur = SpreadsheetApp.getActive();
  const pdf = DriveApp.getFileById(classeur.getId())
    .getAs(MimeType.PDF)
    .setName(classeur.getName() + '.pdf');
  MailApp.sendEmail({
    to: 'direction@exemple.fr',
    subject: 'Tableau de bord de la semaine',
    body: 'Veuillez trouver le tableau de bord en pièce jointe.',
    attachments: [pdf],
  });
}

Cette méthode exporte tous les onglets du classeur. Pour un seul onglet, la solution habituelle consiste à copier l’onglet dans un classeur temporaire, à l’exporter, puis à supprimer ce classeur. Programmé avec un déclencheur temporisé, ce script envoie le rapport tous les lundis sans intervention.

Préparer des brouillons plutôt qu’envoyer

Pour relire avant envoi, remplacez l’envoi par un brouillon Gmail :

GmailApp.createDraft(email, objet, texte, { htmlBody: html });

Les brouillons apparaissent dans Gmail : vous les vérifiez puis les envoyez un par un. C’est une bonne façon de tester un publipostage sur de vraies données avant de l’automatiser complètement.

Quotas d’envoi

Limite (page des quotas Google)gmail.comGoogle Workspace
Destinataires par jour1001 500
Destinataires par message5050
Taille du corps de l’e-mail200 Ko400 Ko
Taille totale des pièces jointes25 Mo25 Mo

Le quota compte les destinataires, pas les e-mails : un message envoyé à trois personnes (à, cc, cci) en consomme trois. Apps Script convient aux envois transactionnels et aux relances internes ; pour une newsletter vers des centaines de contacts, un outil d’e-mailing dédié gère mieux la délivrabilité et les désinscriptions.

Questions fréquentes

Peut-on envoyer l’e-mail quand une case est cochée ?

Oui, avec un déclencheur installable « Lors de la modification » qui teste la colonne de la case à cocher. Un onEdit simple ne suffit pas : il n’a pas le droit d’envoyer d’e-mail. Le détail est dans l’article sur les déclencheurs Apps Script.

Comment changer l’adresse d’expédition ?

MailApp envoie toujours depuis le compte qui exécute le script ; l’option name change le nom affiché et replyTo l’adresse de réponse. Pour une autre adresse d’expédition, elle doit être configurée comme alias dans Gmail, puis utilisée avec GmailApp et l’option from.

Mes e-mails arrivent en spam

Évitez les objets en majuscules, gardez une version texte, et n’envoyez pas des centaines d’e-mails identiques d’un coup. Si l’envoi part d’une adresse de domaine Google Workspace, vérifiez que le domaine est bien configuré pour l’e-mail (SPF, DKIM).

L’envoi d’e-mails personnalisés est l’un des exercices de la formation Google Apps Script. Pour un circuit complet de relances ou de rapports déjà en place dans votre entreprise, voir l’automatisation Google Sheets sur mesure.