Numeriblog Google Workspace Gmail, le coeur du réacteur Google Apps Script, Sheets, Contacts, Gmail : envoyer régulièrement un mail à un groupe de contacts

Google Apps Script, Sheets, Contacts, Gmail : envoyer régulièrement un mail à un groupe de contacts

Voici un script permettant d’envoyer un message de Gmail à un groupe de personnes géré dans Contacts. Ce script fait le lien entre trois applications de la suite Workspace : « Contacts » qui permet de classer […]

personnes ont consulté cet article

4 minutes

Rédigé par Antoine MARTIN - il y a 2 ans

Ce que vous allez découvrir

  • Comment récupérer la liste des libellés depuis Contacts avec Google Apps Script dans Google Sheets ?
  • Comment récupérer la liste des messages brouillons ou modèles de Gmail et leur ID dans une table Google Sheets avec Apps Script ?
  • Créez le tableau de bord pour lister les récurrences d'envois de mails
  • Comment déclencher un mail automatiquement depuis Google Apps Script ?
  • Voici un résumé de tout le script :
  • Comment déclencher le script chaque jour ?

Google Apps Script, Sheets, Contacts, Gmail : envoyer régulièrement un mail à un groupe de contacts

Voici un script permettant d’envoyer un message de Gmail à un groupe de personnes géré dans Contacts.

Ce script fait le lien entre trois applications de la suite Workspace :

  • « Contacts » qui permet de classer et organiser vos contacts (y a pas à dire, mais ils sont trop forts pour trouver des noms d’application les ricains !:), application depuis laquelle le script va récupérer les « libellés » qui rassemblent plusieurs adresses mails ;
  • « Gmail« , où vous pouvez créer des messages modèles ;
  • « Sheets » qui centralise les demandes et associe : le groupe de contacts, le jour de la semaine auquel envoyer le mail et le message brouillon.
schéma relationnel entre Contact, Sheets et Gmail
Relation entre Contacts / Sheets et Gmail
  • Commencez par créer un Sheets ;
  • puis nommez les onglets « TDB », « GROUPS » et « DRAFTS » et « ENVOIS » (ou comme vous voulez, à condition de répercuter le nom dans le script) ;
  • enfin, ouvrez la console de scripts (Outils / <> Éditeur de Scripts).

Comment récupérer la liste des libellés depuis Contacts avec Google Apps Script dans Google Sheets ?

function getContactGroups() {
  const groups = ContactsApp.getContactGroups();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetGroups = ss.getSheetByName("GROUPS");
  let groupsInfos = [];
  groups.forEach(function (group) {
    const nbContacts = group.getContacts().length;
    groupsInfos.push([group.getGroupName(), nbContacts]);
  });
  sheetGroups.getRange(1, 1, groupsInfos.length, groupsInfos[0].length).setValues(groupsInfos);
}
  • Appelez le service Contacts et récupérez les libellés (« groups » en anglais).
  • Appelez le service Sheets et le Spreadsheet actif.
  • Récupérez l’onglet GROUPS.
  • Déclarez une table groupsInfo.
  • Bouclez sur les libellés pour à chaque fois :
    • récupérer le nombre de contacts présents dans le libellé ;
    • incrémenter la table groupsInfo avec une nouvelle table contenant le nom du groupe et le nombre de contacts.
  • Enfin, écrivez toutes ces informations recueillies dans l’onglet « GROUPS ».

Comment récupérer la liste des messages brouillons ou modèles de Gmail et leur ID dans une table Google Sheets avec Apps Script ?

function getGmailDrafts() {
  const drafts = GmailApp.getDrafts();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetDrafts = ss.getSheetByName("DRAFTS");
  let drafsInfos = [];
  if (drafts.length > 0) {
    drafts.forEach(function (draft) {
      drafsInfos.push([draft.getMessage().getSubject(), draft.getMessageId()]);
    })
    sheetDrafts.getRange(1, 1, drafsInfos.length, drafsInfos[0].length).setValues(drafsInfos);
  }
}

Sur la même structure, récupérez les messages placés en brouillon ou en modèle dans votre messagerie préférée.

Créez le tableau de bord pour lister les récurrences d’envois de mails

Dans l’onglet « TDB », créez une colonne avec validation de données vous permettant de choisir le libellé de contacts, une colonne permettant de choisir un jour de la semaine (celui auquel se déclenchera l’envoi de mail), une colonne affichant automatiquement le numéro du jour en fonction de celui sélectionné (attention ici le dimanche est 0, lundi 1, mardi 2 etc.), une colonne permettant de choisir le message à envoyer et enfin la colonne affichant l’ID du message (rechercheV sur la feuille « GROUPS »).

Comment déclencher un mail automatiquement depuis Google Apps Script ?

function sendMessage() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetConsignes = ss.getSheetByName("TDB");
  const sheetEnvois = ss.getSheetByName("ENVOIS");
  const consignes = sheetConsignes.getDataRange().getValues();
  const aujourdhui = new Date();
  const aujourdhuiJour = aujourdhui.getDay();
  const emails = [];
  consignes.forEach(function (consigne) {
    const jour = consigne[2];
    if (jour == aujourdhuiJour) {
      const thisLabel = consigne[0];
      Logger.log(thisLabel);
      const thisGroup = ContactsApp.getContactGroup(thisLabel);
      const contacts = ContactsApp.getContactsByGroup(thisGroup);
      const thisMessageDraftId = consigne[4];
      const draftMessage = GmailApp.getMessageById(thisMessageDraftId);
      const thisSubject = draftMessage.getSubject();
      const thisBody = draftMessage.getBody();
      const thisplainBody = draftMessage.getPlainBody();
      contacts.forEach(function (contact) {
        const thisEmail = contact.getEmails()[0].getAddress();
        emails.push(thisEmail);
      })
      if (emails.length > 0) {
        GmailApp.sendEmail( emails , thisSubject, thisplainBody, { htmlBody: thisBody });
        sheetEnvois.appendRow([new Date(), thisSubject, emails.join(",")]);
      }
    }
  })
}

Le script permet de

  • récupérer les onglets du Spreadsheet ;
  • récupérer les informations de la feuille TDB sous forme de consignes ;
  • récupérer la date du jour et le numéro du jour (get.day()).
  • Pour chaque consigne :
    • comparer le numéro du jour avec la troisième valeur de la ligne consigne (comme on commence à 0, c’est donc l’index 2) ;
    • si les deux sont identiques :
      • récupérer le libellé (la première valeur de la ligne, donc index 0) ;
      • ouvrir le libellé et récupérer les contacts qui le composent ;
      • récupérer l’ID du message sélectionné (index 4) ;
      • ouvrir ce message et récupérer l’objet et le corps (getSubject() et getBody() ;
      • lister les contacts pour construire une liste d’adresses mail ;
      • si la liste d’adresses mail n’est pas nulle, envoyer un message à tous les destinataires, avec les informations récupérées du messages sélectionné et écrire une ligne dans l’onglet « ENVOIS » pour lister les exécutions.

Voici un résumé de tout le script :

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("AMCMS / NUMERICOACH").addItem("Mettre à jour les contacts et les brouillons", "updateRef")
    .addItem("Envoyer les messages", "sendMessage")
    .addToUi();
}
function updateRef() {
  getContactGroups();
  getGmailDrafts();
}
function sendMessage() {
  updateRef();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetConsignes = ss.getSheetByName("TDB");
  const sheetEnvois = ss.getSheetByName("ENVOIS");
  const consignes = sheetConsignes.getDataRange().getValues();
  const aujourdhui = new Date();
  const aujourdhuiJour = aujourdhui.getDay();
  const emails = [];
  consignes.forEach(function (consigne) {
    const jour = consigne[2];
    Logger.log(jour);
    if (jour == aujourdhuiJour) {
      const thisLabel = consigne[0];
      Logger.log(thisLabel);
      const thisGroup = ContactsApp.getContactGroup(thisLabel);
      const contacts = ContactsApp.getContactsByGroup(thisGroup);
      const thisMessageDraftId = consigne[4];
      const draftMessage = GmailApp.getMessageById(thisMessageDraftId);
      const thisSubject = draftMessage.getSubject();
      const thisBody = draftMessage.getBody();
      const thisplainBody = draftMessage.getPlainBody();
      contacts.forEach(function (contact) {
        const thisEmail = contact.getEmails()[0].getAddress();
        emails.push(thisEmail);
      })
      if (emails.length > 0) {
        GmailApp.sendEmail( emails , thisSubject, thisplainBody, { htmlBody: thisBody });
        sheetEnvois.appendRow([new Date(), thisSubject, emails.join(",")]);
      }
    }
  })
}
function getContactGroups() {
  const groups = ContactsApp.getContactGroups();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetGroups = ss.getSheetByName("GROUPS");
  let groupsInfos = [];
  groups.forEach(function (group) {
    const nbContacts = group.getContacts().length;
    groupsInfos.push([group.getGroupName(), nbContacts]);
  })
  sheetGroups.getRange(1, 1, groupsInfos.length, groupsInfos[0].length).setValues(groupsInfos);
}
function getGmailDrafts() {
  // Crer un trigger
  const drafts = GmailApp.getDrafts();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetDrafts = ss.getSheetByName("DRAFTS");
  let drafsInfos = [];
  if (drafts.length > 0) {
    drafts.forEach(function (draft) {
      drafsInfos.push([draft.getMessage().getSubject(), draft.getMessageId()]);
    })
    sheetDrafts.getRange(1, 1, drafsInfos.length, drafsInfos[0].length).setValues(drafsInfos);
  }
}

J’ai ajouté la création d’un menu permettant d’appeler les différentes fonctions (onOpen()).

Remarquez la présence d’une fonction updateRef() qui peut être appelée manuellement et qui déclenche la mise à jour des libellés et des brouillons, qui est de toute façon actualisée avant chaque envoi.

Comment déclencher le script chaque jour ?

Ajoutez un déclencheur :

ajouter un déclencheur

En espérant que ce script vous permette de mettre en place des procédures de mise en relation d’informations issues de Contacts et de Gmail, n’hésitez pas à laisser un commentaire ci-dessous !

Rédacteur

Photo de profil de l'auteur
Antoine MARTIN

Consultant et formateur sur les outils bureautiques, j'ai intégré l'équipe de Numericoach en 2020. J'accompagne les utilisateurs de Google Workspace à trouver des solutions répondant à leurs besoins. Mes domaines de prédilections sont les outils Sheets, Docs, Slides et Google Apps Script.

S’abonner
Notification pour
guest
5 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires

Belle perf’ Antoine.

Cet avis vous a été utile ?

Antoine

Merci Thierry !

Cet avis vous a été utile ?

Lauren
Lauren

Magnifique Antoine !
J’ai essayé mais pour bien faire il faudrait ajouter le tableur pour la composition du Mail il me semble ( Voir Croquis 2 sur 3 « Relation entre Contacts / Sheets et Gmail »)

Cet avis vous a été utile ?

Laurent
Laurent

Magnifique Antoine !
J’ai essayé mais pour bien faire il faudrait ajouter le tableur pour la composition du Mail il me semble ( Voir Croquis 2 sur 3 « Relation entre Contacts / Sheets et Gmail »)

Cet avis vous a été utile ?

grâce
grâce

Bonjour je ne comprends pas tres bien lorsque vous parlez d’onglet GROUPS etc .. doit-on creer c’est onglet ou rajouter des colonnes

Cet avis vous a été utile ?