Extraire une recherche de mail sous Google Sheets

Aujourd'hui, une demande un peu particulière d'une collègue : est il possible d'exporter une liste de mails dans Google Sheets en fonction d'une recherche dans Gmail?

En réfléchissant quelque peu, avec quelques lignes de script, c'est tout à fait possible.

D'une recherche Gmail, 


vous l'indiquez dans la cellule B1


Et vous lancer le menu Extraction Emails pour retrouver dans cet exemple 
  • Date
  • De
  • Vers
  • Sujet
  • Lien vers l'email
A noter qu'avant bien entendu, il vous faudra saisir le code ci dessous dans l'éditeur de script.

/**
* @OnlyCurrentDoc
*/


function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Extraction Emails')
  .addItem('Extraction Emails...', 'extractEmails')
  .addToUi();
}

// Extraction des mails depuis une recherche
function extractEmails() {
  
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getActiveSheet();
  var plagedeDonnees = feuille.getRange(2, 1, feuille.getMaxRows(), feuille.getMaxColumns());
  plagedeDonnees.clearContent();
  try {
    feuille.getDataRange();
    var banding = feuille.getDataRange().getBandings()[0];
    banding.remove();
  } catch (e) {
    
  }
  
  var recherche = feuille.getRange(1,2).getValue();
  
  // get all email threads that match label from Sheet
  
  var threads = GmailApp.search(recherche);
  
  var listArray = [];
  listArray.push(['Date','De','Vers', 'Sujet', 'Lien du message'])
  
  for (var i = 0 ; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var m = 0; m < messages.length; m++) {
      var msg = messages[m].getBody();
      var date = Utilities.formatDate(messages[m].getDate(),"GMT","dd-MM-yyyy");
      var de = messages[m].getFrom()
      var vers = messages[m].getTo();
      var sujet = messages[m].getSubject();
      var id = "https://mail.google.com/mail/u/0/#all/"
      + messages[m].getId();
      listArray.push([date, de, vers, sujet, id]);
      Logger.log(i);
    }
  }
  feuille.getRange(3, 1, listArray.length, listArray[0].length).setValues(listArray);
  var font = 'Proxima Nova';
  feuille.getRange(3, 1, listArray.length, listArray[0].length).setFontFamily(font);
  feuille.getRange(4, 1, listArray.length, listArray[0].length).sort({column: 1, ascending: true});
}