Générer 2 tableaux distincts contenant des éléments grâce à Google Sheets

Bonjour,

Avant tout, je sais que certaines personnes vont penser à me répondre à ma demande ci-dessous que "Gmail m'autorise à exporter une archive de mes emails et que ça répondrait au besoin", mais en réalité, non ça ne répond pas au besoin car je vais tellement avoir besoin de faire ma demande ci-dessous plein de fois dans le mois que Gmail bloquerait mon compte au bout d'un moment bien qu'il n'y ait rien de bizarre dans ce que je fais.

J'ai une adresse email Gmail qui contient mes emails reçus et mes emails envoyés.

Je souhaiterais faire 2 chose différentes grâce à Google Sheets (il faudra probablement utiliser 2 scripts différents de façon indépendante je pense):

Voici la 1ère chose que je souhaiterais faire (à l'aide du 1er script):

Je veux que soit généré un tableau allant du moment où j'exécute mon script jusqu'à un mois en arrière.

Ce tableau doit contenir:

-Dans la 1ère colonne les destinataires (je précise qu'à chaque fois que j'envois un email, je n'ai qu'un seul destinataire par email, je n'en ai jamais plusieurs)

-Dans la 2ème colonne les objets des emails

-Dans la 3ème colonne les jours où j'ai envoyé ces emails (du plus récent au plus ancien, c'est à dire compris entre le moment où j'exécute le script et 1 mois en arrière)

-Et dans la 4ème colonne les heures où j'ai envoyé ces emails

Je n'ai besoin que de cela dans le tableau, je n'ai absolument pas besoin de récupérer le corps de l'email.

Voici la 2ème chose que je souhaiterais faire (à l'aide du 2ème script):

Je veux que soit généré un tableau allant du moment où j'exécute mon script jusqu'à un mois en arrière.

Ce tableau doit contenir:

-Dans la 1ère colonne les expéditeurs (je précise qu'à chaque fois que je reçois un email, je n'ai qu'un seul expéditeur par email, je suis bête de le préciser car c'est logique un email ne peut m'être envoyé que par une seule personne à la fois)

-Dans la 2ème colonne les objets des emails

-Dans la 3ème colonne les jours où j'ai reçu ces emails (du plus récent au plus ancien, c'est à dire compris entre le moment où j'exécute le script et 1 mois en arrière)

-Et dans la 4ème colonne les heures où j'ai reçu ces emails

Je n'ai besoin que de cela dans le tableau, je n'ai absolument pas besoin de récupérer le corps de l'email.

Merci à toute personne pouvant m'aider.

Bonjour,

en colonne C tu as la date et l'heure (mets au format date-heure)

repris ci-dessous

Bonjour et

Peut-on afficher des mails dans GS de bubule@machin.org ?

Merci Mike

Bonjour,

Merci pour ton aide Steelson, j’ai testé ton script et j’ai détecté des bug, voici comment je m’y suis pris.

J’ai créé un email Gmail et j’ai désactivé le mode conversation.

Cas 1 : J’ai envoyé un email spontané à Ortense, J’ai envoyé un email spontané à Manon, J’ai envoyé un email spontané à Romuald, voici ce qui s’affiche vraiment dans les messages envoyés de ma boite email :

Destinataire

Objet

Date et heure

EmailDeRomuald

Covid…

03/05/2022 23 :53

EmailDeManon

Je viens de dire…

03/05/2022 23 :52

EmailDeOrtense

Je viens de créer…

03/05/2022 23 :50

Cas 2 : Dans ma boîte de réception, Romuald a répondu à mon email en cliquant sur Répondre et m’a envoyé sa réponse, Tessa m’a envoyé un email spontané, et Etienne m’a envoyé un email spontané, voici ce qui s’affiche vraiment dans les messages reçus de ma boite email :

Expéditeur

Objet

Data et heure

EmailDeEtienne

Demain…

04/05/2022 00 :53

EmailDeTessa

Merci T…

04/05/2022 00 :50

EmailDeRomuald

Re: Covid…

03/05/2022 23 :56

Normalement lorsque j’utilise ton script je dois obtenir exactement ce que j’ai dans mes 2 tableaux ci-dessus, or ce n’est pas le cas, voici ce que j’obtiens avec ton script :

Cas 1bis : Avec ton script j’ai 4 emails envoyés alors qu’en réalité je ne devrai en avoir que 3.

à

Objet

Date

Erreur 1 : mon email s’affiche ici

Erreur 2 : Re : Covid..

Erreur 3 : 02/05/2022 23:56:21

EmailDeRomuald

Covid…

02/05/2022 23:53:19

EmailDeManon

Je viens de dire…

02/05/2022 23:52:19

EmailDeOrtense

Je viens de créer…

02/05/2022 23:50:57

Cas 2bis : Avec ton script j’ai 4 emails reçus alors qu’en réalité je ne devrai en avoir que 3.

de

Objet

Date

Erreur 1 : mon email s’affiche ici alors que je ne suis pas l’expéditeur

Erreur 2 : mon email s’affiche ici alors que je ne suis pas l’expéditeur

Erreur 3 : mon email s’affiche ici alors que je ne suis pas l’expéditeur

EmailDeRomuald

Erreur 4 : il s’affiche « Covid… » alors qu’il devrait s’afficher « Re : Covid.. »

Erreur 5 : Il s’affiche 02/05/2022 23:53:19 alors que je l’ai réellement reçu à 23 :56

Je n’ai pas complété tout le cas 2bis ci-dessus mais il est pratiquement tout faux, le cas1 et le cas1bis devraient générer exactement les mêmes tableaux mais ce n’est pas le cas, et le cas 2 et le cas 2bis devraient aussi générer exactement le même tableau mais ce n’est pas le cas.

D’ailleurs je me demande pourquoi dans les tableaux générés par tes scripts certaines lignes sont rouges et d’autres sont noires.

J’ai l’impression que ton script perd la boussole lorsque quelqu’un répond à l’un de mes emails, et du coup ça fausse quasiment tout.

Penses-tu qu’il serait possible de le corriger Steelson s’il te plaît ?

Merci.

Le script est basé sur le mode conversation ... As-tu essayé sans ré-activer ce mode ?

  var conversations = GmailApp.getInboxThreads();
  for (var i = 0; i < conversations.length; i++) {
      conversations[i].getMessages().forEach(m => {
        if (m.getDate()>jusque) {result.push([m.getTo(), m.getSubject(), m.getDate()])}
      })
  }

Mais j'ai quand même des scripts qui fonctionnent depuis de nombreuses années sans défaut.

Il faut sans doute utiliser la Class GmailMessage https://developers.google.com/apps-script/reference/gmail/gmail-message au lieu de Class GmailThread https://developers.google.com/apps-script/reference/gmail/gmail-thread

Pour les couleurs, je ne comprends pas du tout ! et là il faudrait voir le fichier.


@Alexander : oui, tu peux sélectionner sur getFrom(), ou mieux l'inclure dans une requête de ce type

  var requete ="is:unread {label:Test1 label:Test2}"
  var threads = GmailApp.search(requete);

là aussi je regarderai

à corriger cette ligne dans le script recus

if (m.getDate()>jusque) {result.push([m.getFrom(), m.getSubject(), m.getDate()])}

je viens de refaire un série de tests d'envoi, réponses comme tu l'as fait (en mode conversation),

  1. je retrouve bien les emails envoyés plus une réponse qui m'a été faite dans les envoyés
  2. et pour les reçus, je les retrouve tous, plus aussi ceux que j'avais envoyés et qui ont été répondus

donc en filtrant sur l'email, je n'ai plus de redondances

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 mails reçus', 'recus')
    .addItem('👉 mails envoyés', 'envoyes')
    .addToUi();
}
const ss = SpreadsheetApp.getActiveSpreadsheet()
function recus() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('reçus')
  if (sh == null) { var sh = ss.insertSheet('reçus') }
  var result = [[' de', ' objet', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.getInboxThreads();
  for (var i = 0; i < conversations.length; i++) {
      conversations[i].getMessages().forEach(m => {
        if (m.getDate()>jusque && !m.getFrom().includes(proprio())) {result.push([m.getFrom(), m.getSubject(), m.getDate()])}
      })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function envoyes() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('envoyés')
  if (sh == null) { var sh = ss.insertSheet('envoyés') }
  var result = [[' à', ' objet', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.search('in:sent');
  for (var i = 0; i < conversations.length; i++) {
      conversations[i].getMessages().forEach(m => {
        if (m.getDate()>jusque && !m.getTo().includes(proprio())) {result.push([m.getTo(), m.getSubject(), m.getDate()])}
      })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function proprio(){
  return (Session.getActiveUser().getEmail());
}

Merci Steelson, j’ai remis Gmail en mode conversation activée, et j’ai utilisé ton dernier script, j’obtiens 1 Bug dans l’onglet « reçus » dans la colonne « de » (correspondant à la colonne A) : dans chaque cellule de la colonne A au lieu de m’afficher juste l’email cela m’affiche « Prénom Expéditeur » « Nom Expéditeur » « <EmailExpéditeur> », alors que moi j’ai juste besoin de l’EmailExpéditeur.

Je n’ai pas ce problème dans l’onglet « envoyés » qui fonctionne parfaitement puisque dans la colonne A tous les emails s’affichent sous la forme EmailExpéditeur

Est-ce corrigeable ?

Le mot bug est un peu excessif.

C'est juste que l'adresse de l'expéditeur est "riche" comme par exemple CodePen <support@codepen.io>

si c'est bien le cas que tu cites, et qui n'est pas un bug car c'est bien ce que tu reçois, on peut aménager en ajoutant

function email(x) {
  try { return x.split('<')[1].split('>')[0] }
  catch (e) { return x }
}

et en modifiant ces 2 lignes

if (m.getDate() > jusque && !m.getFrom().includes(proprio())) { result.push([email(m.getFrom()), m.getSubject(), m.getDate()]) }
et
if (m.getDate() > jusque && !m.getTo().includes(proprio())) { result.push([email(m.getTo()), m.getSubject(), m.getDate()]) }

pour inclure cette transformation

Oui c'est vrai ce n'est pas un Bug, j'ai fait un abus de langage.

Steelson je ne suis pas capable de faire les remplacements que tu m'indiques par moi-même dans ton script, je n'arrive pas à comprendre par moi même quoi et où le remplacer dans ton script, c'est peu être simple pour toi mais pour moi c'est trop difficile à comprendre, pourrais tu poster le script avec les modifications dont tu parles s'il te plaît?

voici l'intégralité

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 mails reçus', 'recus')
    .addItem('👉 mails envoyés', 'envoyes')
    .addToUi();
}
const ss = SpreadsheetApp.getActiveSpreadsheet()
function recus() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('reçus')
  if (sh == null) { var sh = ss.insertSheet('reçus') }
  var result = [[' de', ' objet', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.getInboxThreads();
  for (var i = 0; i < conversations.length; i++) {
    conversations[i].getMessages().forEach(m => {
      if (m.getDate() > jusque && !m.getFrom().includes(proprio())) { result.push([email(m.getFrom()), m.getSubject(), m.getDate()]) }
    })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function envoyes() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('envoyés')
  if (sh == null) { var sh = ss.insertSheet('envoyés') }
  var result = [[' à', ' objet', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.search('in:sent');
  for (var i = 0; i < conversations.length; i++) {
    conversations[i].getMessages().forEach(m => {
      if (m.getDate() > jusque && !m.getTo().includes(proprio())) { result.push([email(m.getTo()), m.getSubject(), m.getDate()]) }
    })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function proprio() {
  return (Session.getActiveUser().getEmail());
}
function email(x) {
  try { return x.split('<')[1].split('>')[0] }
  catch (e) { return x }
}

Ca fonctionne, merci Steelson, ça correspond à ce que je veux.

Est-ce que je peux conclure ma demande en ajoutant une ultime demande de modification de script (à la base ça n’était pas dans ma demande initiale).

Que ce soit dans l’onglet « reçus » ou dans l’onglet « envoyés » est ce qu’on peut ajourer entre la colonne « objet » et la colonne « date » une dernière colonne qui contiendrait le corps de l’email, c’est-à-dire ce que j’ai envoyé dans le corps de l’email ou ce qu’on m’a envoyé dans le corps de l’email ?

Merci.

Il faudra peut-être limiter le nombre de caractères du texte ... sinon cela va vite se remplir !

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 mails reçus', 'recus')
    .addItem('👉 mails envoyés', 'envoyes')
    .addToUi();
}
const ss = SpreadsheetApp.getActiveSpreadsheet()
function recus() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('reçus')
  if (sh == null) { var sh = ss.insertSheet('reçus') }
  var result = [[' de', ' objet', 'texte', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.getInboxThreads();
  for (var i = 0; i < conversations.length; i++) {
    conversations[i].getMessages().forEach(m => {
      if (m.getDate() > jusque && !m.getFrom().includes(proprio())) {
        result.push([email(m.getFrom()), m.getSubject(), m.getPlainBody(), m.getDate()])
      }
    })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function envoyes() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheetByName('envoyés')
  if (sh == null) { var sh = ss.insertSheet('envoyés') }
  var result = [[' à', ' objet', ' texte', ' date']]
  var delaijours = 30;
  var jusque = new Date();
  jusque.setDate(jusque.getDate() - delaijours);
  var conversations = GmailApp.search('in:sent');
  for (var i = 0; i < conversations.length; i++) {
    conversations[i].getMessages().forEach(m => {
      if (m.getDate() > jusque && !m.getTo().includes(proprio())) {
        result.push([email(m.getTo()), m.getSubject(), m.getPlainBody(), m.getDate()])
      }
    })
  }
  result = result.sort(function (a, b) {
    return b[2] - a[2];
  });
  sh.clearContents()
  sh.getRange(1, 1, result.length, result[0].length).setValues(result)
}
function proprio() {
  return (Session.getActiveUser().getEmail());
}
function email(x) {
  try { return x.split('<')[1].split('>')[0] }
  catch (e) { return x }
}

// --------------------------
function allLabels() {
  var labels, i;
  labels = GmailApp.getUserLabels();
  for (i = 0; i < labels.length; i++) {
    Logger.log("label: " + labels[i].getName());
  };
};

function getInboxEmails() {
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    Logger.log(threads[i].getFirstMessageSubject());
  }
}

function getEmails() {
  var threads = GmailApp.search('label:all')
  for (var i = 0; i < threads.length; i++) {
    Logger.log(threads[i].getFirstMessageSubject());
  }
}

function getSentEmails() {
  var threads = GmailApp.search('in:sent')
  for (var i = 0; i < threads.length; i++) {
    Logger.log(threads[i].getFirstMessageSubject());
  }
}

Merci Steelson, effectivement tu as raison il faudrait limiter le nombre de caractères du texte dans le corps des reçus et des envoyés, car là ça fait des tableaux énormes, est-ce que ton script est modifiable pour limiter à trois cent caractères s'il te plaît pour le corps des reçus et des envoyés?

ajoute

.substring(0,300)

aux 2

m.getPlainBody().substring(0,300)
Rechercher des sujets similaires à "generer tableaux distincts contenant elements google sheets"