Extraire des information d'un mail depuis Gmail vers Sheets ?

mais cela me tracasse, donc je vais poursuivre et éclairer ce mystère ! je vais m'envoyer via un script un tableau similaire et voir le résultat ... donc je reviendrai sur le sujet si j'ai du nouveau

Tu veux que je te transfère le mail ? 🤔

pourquoi pas !

Pour clore proprement le sujet, voici le script final (après déblocage du problème lié aux expressions régulières)

var requete = "label:inbox is:unread to:me NOT label:done";
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mails')

function capturerEmails() {
  let label = GmailApp.getUserLabelByName("done");
  if (!label) {label = GmailApp.createLabel("done")}
  var threads = GmailApp.search(requete);
  threads.forEach(thread => {
    var msgs = thread.getMessages();
    for (var j in msgs) {
      var r = feuille.getLastRow()+1
      var data = [] 
      var prov = []
      var msg = msgs[j].getBody().replace(/\n|\t/g,'')
      prov.push(msgs[j].getDate()) 
      prov.push(msgs[j].getSubject()) 
      prov.push(msg) 
      data.push(prov)
      feuille.getRange(r,1,1,3).setValues(data);
      feuille.getRange(r,4,1,1).setValue(importOrder(msg));
      var a = (importTableHTML(msg))
      feuille.getRange(r,5,a.length,a[0].length).setValues(a);
    }
    label.addToThread(thread);
  })
}

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}

Re,

Comment cette partie, composé de 2 fonctions, communique avec le reste ?

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}
image

si je décortique ton script… (selon moi)

function capturerEmails() = Concerne les colonnes A, B, C

function ImportOrder() = Concerne la colonne D par rapport au contenu de C

function ImportTableHTML() = Concerne les colonnes E, F, G par rapport au contenu de C

Comment le script détermine dans quelle cellule il doit passer a l'action ?

j'ai juste un " var data = [ ] ou var data = ' ' " et un " function importTableHTML(source) " comme piste mais je ne comprend pas comment ça fait le lien avec la source ( ici en C1 )

c'est le seul point noir qui m'empêche d'avancer pour bricoler et comprendre ces derniers éléments pour le reproduire selon certaines situations

Merci !

J'en connais un qui va dire que je trouve tout seul en me laissant chercher a croire que j'ai besoins d'écrire pour que ça me saute aux yeux…

Du coup j'ai essayé d'adapter sur mon script perso, j'ai pas toute les infos, mais une partie est bien traité :

function mail() {

  var requete ="is:unread label:realT/Orders"
  var ss = SpreadsheetApp.getActive().getSheetByName("Mail");
  var threads = GmailApp.search(requete);

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++) {
      var msg = messages[j].getBody();
      var sub = messages[j].getSubject();
      var dat = messages[j].getDate();
      var test = messages[j].getFrom();
      var free = ss.getLastRow()+1 
      var a = (importTableHTML(msg))

    ss.getRange('A'+free+':C'+free).setValues([[dat, sub, a]])
    }
  }
  var r = ss.getRange(2, 1, ss.getLastRow()-1, ss.getLastColumn());    
  r.sort([{column: 1, ascending: false}]);

  ss.getRange('A:A').activate();
  ss.getActiveRangeList().setNumberFormat('dd.MM.yyyy');

  GmailApp.markThreadsRead(threads);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}

voici ce que j'obtiens

image

il m'en manque encore un peu car voici le résultat obtenu avec ton script : ( pour la colonne "C" c'est normal vu que j'ai enlevé mon "msg" dans le ss.getrange )

image

Je pense que c'est sur cette partie du script que je dois travailler et adapter

 feuille.getRange(r,1,1,3).setValues(data);
      feuille.getRange(r,4,1,1).setValue(importOrder(msg));
      var a = (importTableHTML(msg))
      feuille.getRange(r,5,a.length,a[0].length).setValues(a);

mais pas de resultat interessant :

function mail() {

  var requete ="is:unread label:realT/Orders"
  var ss = SpreadsheetApp.getActive().getSheetByName("Mail");
  var threads = GmailApp.search(requete);

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++) {
      var msg = messages[j].getBody().replace(/\n|\t/g,'');
      var sub = messages[j].getSubject();
      var dat = messages[j].getDate();
      var test = messages[j].getFrom();
      var free = ss.getLastRow()+1 
      var a = (importTableHTML(msg))
      var b = (importOrder(msg))

    ss.getRange('A'+free+':E'+free).setValues([[dat, sub, msg, b, a]])
    }
  }
  var r = ss.getRange(2, 1, ss.getLastRow()-1, ss.getLastColumn());    
  r.sort([{column: 1, ascending: false}]);

  ss.getRange('A:A').activate();
  ss.getActiveRangeList().setNumberFormat('dd.MM.yyyy');

  GmailApp.markThreadsRead(threads);
}

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}
image

il en manque tjr :D mais je vais le faire ahah

alors vous allez me dire " pourquoi faire un script diffèrent pour le même résultat ? " j'ai l'impression que la partie pour importer le mail avec mon script est plus "simple", donc je voulais travailler et décortiquer a partir de cette base.

A force de test et de persévérance j'ai repris le script que tu avais fait Mike. avec un mélange du mien.

var requete = "is:unread label:realT/Tokens";
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mail')

function capturerEmails() {

  var threads = GmailApp.search(requete);

  threads.forEach(thread => {
    var msgs = thread.getMessages();
    for (var j in msgs) {
      var r = feuille.getLastRow()+1
      var data = [] 
      var prov = []
      var msg = msgs[j].getBody().replace(/\n|\t/g,'')
      prov.push(msgs[j].getDate()) 
      data.push(prov)
      feuille.getRange(r,1,1,1).setValues(data);
      feuille.getRange(r,2,1,1).setValue(importOrder(msg));
      var a = (importTableHTML(msg))
      feuille.getRange(r,3,a.length,a[0].length).setValues(a);     
      }
      var r = feuille.getRange(2, 1, feuille.getLastRow()-1, feuille.getLastColumn());    
      r.sort([{column: 1, ascending: true}]);

    GmailApp.markThreadsRead(threads);
  })
}

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}
image

2 petits points que j'aimerai ajouter, mais que je ne sais pas ou placer sur la feuille.

1) En colonne 2 j'ai le résultat suivant par ex : Order #203803 — August 25, 2021 et je veux y placer un RegexExtract pour juste avoir le numéro de commande donc

#(\d*) si je ne me trompe pas, mais je ne sais pas ou le placer exactement

2) le prix qui qui sort en colonne E doit avoir un format texte car je ne peux pas additionner les prix, ce qui est embêtant

3) je suis actuellement avec " var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mail') "

Comment choisir la plage d'une feuille précise plutôt ?j'ai essayé ça a la place " =SpreadsheetApp.getActiveSpreadsheet().getRange('A2:G'); " mais... echec

désolé, je ne réagis pas beaucoup car je suis en pleine panade ... mais cela va venir !!

désolé, je ne réagis pas beaucoup car je suis en pleine panade ... mais cela va venir !!

pas de soucis, j'ai avancé petit à petit de mon côté !

à bientôt

Je complète la seconde partie que je voulais aborder ensuite.

c'est surement possible de le traiter avec le script mais je ne parviens pas a le modifier de façon efficace.

voici le résultat attendu :

image

colonnes A,B,C geré par le script.

Colonne D avec formule externe au script pour le moment =

=index(split(REGEXEXTRACT(C2,"(https[\S]+sharing)"),"/"),1,5)

Colonne E avec formule externe au script pour le moment =

=index(SPLIT(B2," "),1,4)

Colonne F avec formule externe au script pour le moment =

=index(SPLIT(B2," "),1,6)

mais voici la structure du mail et les parties concernées =

image

bonne journée !

Comment choisir la plage d'une feuille précise plutôt ?j'ai essayé ça a la place " =SpreadsheetApp.getActiveSpreadsheet().getRange('A2:G'); " mais... echec

j'ai également essayer d'adapter ce que j'ai mis ici https://forum.excel-pratique.com/sheets/donnees-generees-par-un-script-a-cote-d-autres-donnees-impac...

, mais le fait d'avoir plusieurs fois les "feuille.getRange" comme ceci :

feuille.getRange(r,1,1,1).setValues(data);
      feuille.getRange(r,2,1,1).setValue(importOrder(msg));
      var a = (importTableHTML(msg))
      feuille.getRange(r,3,a.length,a[0].length).setValues(a);

me perturbe pour adapter du coup ^^"

Alex, si tu souhaites une aide, il faudrait que tu synthétises là où tu en es, quel script, et quels problème à résoudre.

Bonjour

Alex, si tu souhaites une aide, il faudrait que tu synthétises là où tu en es, quel script, et quels problème à résoudre.

Oui je comprend, je te fait une réponse complète juste en dessous dans quelques minutes

J'utilise le script de 2 façon différentes alors je ferais une réponse, et une autre réponse ultérieurement.

var requete = "is:unread label:realT/Tokens";
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Commande')

function capturerEmails() {

  var threads = GmailApp.search(requete);

  threads.forEach(thread => {
    var msgs = thread.getMessages();
    for (var j in msgs) {
      var r = feuille.getLastRow()+1
      var data = [] 
      var prov = []
      var msg = msgs[j].getBody().replace(/\n|\t/g,'')
      prov.push(msgs[j].getDate()) 
      data.push(prov)
      feuille.getRange(r,1,1,1).setValues(data);
      feuille.getRange(r,2,1,1).setValue(importOrder(msg));
      var a = (importTableHTML(msg))
      feuille.getRange(r,3,a.length,a[0].length).setValues(a);     
      }
      var r = feuille.getRange(2, 1, feuille.getLastRow()-1, feuille.getLastColumn());    
      r.sort([{column: 1, ascending: true}]);

    GmailApp.markThreadsRead(threads);
  })
}

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace(/\r\n|\n|\r|\t/g,'');
}

Voici le résultat affiché

image

Problématique 1 ) En "B" j'aimerai juste avoir le numéro d'ordre, Donc peut-être placer quelque part ce regexextract : #(\d*) il me semble

voici la partie du code source du mail si jamais :

image

Problématique 2 ) le prix qui est généré en Colonne "E" est au format texte je pense, et à cause du "$" je pense que le changement de format manuel ne fonctionne pas et je ne peux pas effectuer de somme.

Problématique 3 ) Même cas que la dernière fois, j'aimerai bien que que la plage d'action soit bien localisé entre A et E, ( je ne veux pas qu'une ligne soit sautée si j'ai des données en F3 par ex.

je n'arrive pas a adapter ce que j'avais fait sur d'autres scripts

J'espère que c'est plus clair comme ça, il est vrai que je mettais des réponses au fur et a mesure sans porter attention a la lisibilité

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
  return(data);
}

Voici le résultat affiché

image

Problématique 1 ) En "B" j'aimerai juste avoir le numéro d'ordre, Donc peut-être placer quelque part ce regexextract : #(\d*) il me semble

Pour cela, essaie ceci

//importation du titre contenu dans la balise h2
function importOrder(source) {
  var data=''
    var debut = source.indexOf('<h2')
    var fin = source.indexOf('</h2')
    var titre = source.substring(debut,fin)
    debut = titre.indexOf('>')+2
    data = titre.substring(debut)
    var regExp = new RegExp("#[0-9]+", "g"); 
    var commande = regExp.exec(data)[0];
  return(commande);
}

et dis moi si c'est ok !

//importation du tableau (contenu de tbody)
function importTableHTML(source) {
  var data = [];
  try{
    var debut = source.indexOf('<tbody')
    var fin = source.indexOf('</tbody')
    var html = source.substring(debut,fin)
    var trs = html.split('<tr')
    for (var i=1;i<trs.length;i++){
      var tds = trs[i].split('<td')
      var prov=[]
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]))
      }
      data.push(prov)
    }
  }catch(e){
    data.push([''])
  }
  return(data);
}

Problématique 2 ) le prix qui est généré en Colonne "E" est au format texte je pense, et à cause du "$" je pense que le changement de format manuel ne fonctionne pas et je ne peux pas effectuer de somme.

essaie

      for (var j=1;j<tds.length;j++){
        var donnee = stripTags('<td'+tds[j])
        if (donnee.indexOf('$') != -1){
          donnee=donnee.replace('$','')*1
        }
        prov.push(donnee)
      }

ou simplement ...

      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]).replace('$',''))
      }

Problématique 3 ) Même cas que la dernière fois, j'aimerai bien que que la plage d'action soit bien localisé entre A et E, ( je ne veux pas qu'une ligne soit sautée si j'ai des données en F3 par ex.

pas pigé !

Merci, j'essaye tout ça dans la soirée, je suis sur mon téléphone.

pas pigé !

lorsque je lance le script. Les données sont créer en A1:E, A2:E, etc....

si jamais j'ai autre chose sur la feuille (en F2 par exemple), le script ne générera pas de données sur la plage A2:E, ça passera directement en ligne A3:E

mais j'aimerai que ce ne soit pas le cas

Rechercher des sujets similaires à "extraire information mail gmail sheets"