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 ?
| MailApp | GmailApp | |
|---|---|---|
| Envoyer un e-mail (texte, HTML, pièces jointes, copie) | Oui | Oui |
| Créer un brouillon, répondre à un fil, lire la boîte | Non | Oui |
Envoyer depuis un alias (option from) | Non | Oui |
| Autorisation demandée | Envoi d’e-mails uniquement | Accè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énom | B : E-mail | C : Montant | D : Échéance | E : Envoyé le |
|---|---|---|---|---|
| Julie | julie@exemple.fr | 1 200 | 15/11/2026 | |
| Karim | karim@exemple.fr | 450 | 20/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.com | Google Workspace |
|---|---|---|
| Destinataires par jour | 100 | 1 500 |
| Destinataires par message | 50 | 50 |
| Taille du corps de l’e-mail | 200 Ko | 400 Ko |
| Taille totale des pièces jointes | 25 Mo | 25 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.