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

effectivement j'ai un changement de format dans le mail :

mail non traité :

image

mail traité :

image

En soit, ce sont des anciens mails, si j'ai pas de solution "universelle" ce n'est pas trop grave, je pense que le format actuel va rester en place.

si ça reviens, je reviendrais sur ce sujet :D

si c'est simplement le " # " et le " ° " devant le numéro de commande qui bloque, on peux surement faire sauter la chose :D

en effet, cela veut dire que sur ce mail il n'y a pas de n° commençant pas un #

enlève le # de l'expression régulière !

cela veut dire que sur ce mail (si tu peux le retrouver) il n'y a pas de n° commençant pas un #

enlève le # de l'expression régulière !

quand j'ai fait mes captures d'écran, c'est ce que je me suis empressé de faire ! en effet c'est ok

impec merci

Du coup est-ce qu'on peux optimiser le temps d'exécution du script ? même si je ne pense pas a avoir autant de mail a traiter d'un coup lors de prochaines actions

Du coup est-ce qu'on peux optimiser le temps d'exécution du script ? même si je ne pense pas a avoir autant de mail a traiter d'un coup lors de prochaines actions

je te fais un topo d'ici 1h ou 2 (j'espère)

je te fais un topo d'ici 1h ou 2 (j'espère)

pas de soucis, encore une fois pas d'urgences, j'ai vu quelques petites choses aussi de mon coté :D

bonne journée

Fais un essai comme ceci (mais sans garantie car je n'ai pas pu tester, c'est de la théorie)

supprimé - sans intérêt

plus les fonctions annexes comme

getLastDataRow

petit retour

Fais un essai comme ceci (mais sans garantie car je n'ai pas pu tester, c'est de la théorie)

mes mails passent en "lu" mais il n'y a pas d'écriture sur la feuille correspondante. ( + un chargement long sans mouvement )

mouais, je le craignais, je ne peux rien faire sans une base de travail ...

c'est peut-être moins beau et moins conventionnel, mais si je "reconstruit" a partir du script utilisé pour l'ID google qu'on a refait plus haut cela semble plus rapide pour le moment.

Après, est-ce que empiler les "var" est une bonne chose ? je ne sais pas. je fais des expériences...

function mail() {

  var requete ="is:unread label:realT/Tokens"
  var ss = SpreadsheetApp.getActive().getSheetByName("test");
  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 dat = messages[j].getDate();

      var free = getLastDataRow(ss)+1

      var debut = msg.indexOf('<h2')
      var fin = msg.indexOf('</h2')
      var titre = msg.substring(debut,fin)
          debut = titre.indexOf('>')+2
          data = titre.substring(debut)
      var regExp = new RegExp("[0-9]+", "g"); 
      var commande = regExp.exec(data)[0];

    ss.getRange('A'+free+':B'+free).setValues([[dat, commande]])
    }
  }

  var r = ss.getRange(2, 1, ss.getLastRow()-1, ss.getLastColumn());    
      r.sort([{column: 1, ascending: false}]);

  function getLastDataRow(sheet) {
    var lastRow = sheet.getLastRow();
    var range = sheet.getRange("A" + lastRow);
      if (range.getValue() !== "") {
        return lastRow;
      } else {
        return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
      }              
  }

  GmailApp.markThreadsRead(threads);
}

je vais m'attaquer au contenu le plus "difficile" maintenant et voir si il y a du changement

Oups je n'avais pas vu ta reponse

mouais, je le craignais, je ne peux rien faire sans une base de travail ...

Dis moi ce que je peux faire et si je peux le faire :)

-supprimé-

https://docs.google.com/spreadsheets/d/1I3ngkmSQGfOIpUY1KZT9tGl-sGugU4kmkDeXtYGSUd4/edit?usp=sharing

si jamais tu veux reprendre un code source exemple je l'ai mis dans un html de l'outils App script

Après honnêtement te casse pas la tète j'aurais jamais 100mails a traité encore une fois... je suis deja hyper content du resultat

Je mets quand même mes tests, j'ai encore du travail sur l'extraction mais j'avance d'une façon différente ( sur un malentendu ça fonctionnera )

function mail() {

  var requete ="is:unread label:realT/Tokens"
  var ss = SpreadsheetApp.getActive().getSheetByName("test");
  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 free = getLastDataRow(ss)+1
    var obj = messages[j].getBody()
    var debut = obj.indexOf('<tbody')
    var fin = obj.indexOf('</tbody')
    var html = obj.substring(debut,fin)
            .replace(/<.*?>/ig, ' ')
            .replace(/^\s*\n/gm, '')
            .replace(/^\s*/gm, '')   
    var sub = messages[j].getSubject();
    var dat = messages[j].getDate();
    var regex = obj.match(/(\w.+)h2>/ig);

    ss.getRange('A'+free+':D'+free).setValues([[dat, sub, regex, html]])
    }
  }

  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');

  function getLastDataRow(sheet) {
    var lastRow = sheet.getLastRow();
    var range = sheet.getRange("A" + lastRow);
      if (range.getValue() !== "") {
        return lastRow;
      } else {
        return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
      }              
  }

  GmailApp.markThreadsRead(threads);
}
image

Comme je disais j'ai encore du travail, mais l'extraction est beaucoup plus rapide, je vais continuer mes bricolages en attendant, ça me permet d'apprendre aussi :D

bonjour,

d'ailleurs quelque chose me viens à l'esprit, ce n'est pas possible de travailler comme un importxml d'ailleurs ?

la réponse à messages[j].getBody() ou messages[j].getrawcontent() ne sort pas un format adéquat pour être traité comme tels ?

bonne journée :)

Tu as raison, le format est bien du html ... mis pour utiliser importxml, il faudrait connaître l' "url" du message si cette url existe. Je n'ai rien trouvé là-dessus https://developers.google.com/gmail/api/guides/threads

il faudrait connaître l' "url" du message si cette url existe. Je n'ai rien trouvé là-dessus

exact, j'avais cherché par curiosité moi aussi, rien de concluant

bonjour,

petite question de bon matin !

function mail() {

  var requete ="is:unread label:realT/Tokens"
  var ss = SpreadsheetApp.getActive().getSheetByName("test");
  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 dat = messages[j].getDate();
      var debut = msg.indexOf("<tbody")
      var fin = msg.indexOf("</tbody")
      var html = msg.substring(debut,fin)+"</tbody>";
      var source = "<table>"+ html +"</table>" ;

      var document = XmlService.parse(source);
      var content = document.getAllContent();

      ss.appendRow([content])
    }
  }
}

pourquoi j'obtiens [Ljava.lang.Object;@41e8e0c9 en réponse ? et comment résoudre ce "problème" ? je n'ai jamais vu ça avant et vu que j'expérimente !


bon dimanche !

Bonjour Alex

Je te conseilles de regarder les infos que tu trouves dans tes mails, par exemple en faisant ceci

function test() {

  var requete ="is:unread label:realT/Tokens"
  var threads = GmailApp.search(requete);
  Logger.log(threads.length)

  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();
      Logger.log('i=' i + ' j=' + j + ' : ' + msg)
      var debut = msg.indexOf("<tbody")
      var fin = msg.indexOf("</tbody")
      var html = msg.substring(debut,fin)+"</tbody>";
      var source = "<table>"+ html +"</table>" ;

      Logger.log(source)
    }
  }
}

en lançant cette fonction à partir de l'explorateur de script.

Je te conseilles de regarder les infos que tu trouves dans tes mails, par exemple en faisant ceci

je vais essayer mais avant j'ai une erreur de syntaxe sur ton script apparemment

Erreur de syntaxe : SyntaxError: missing ) after argument list (ligne : 12, fichier : test.gs) ( la ligne 12 correspond a ton 1er Logger.log )

en faite, ça me frustre d'avoir une fonction "importHTML" ou "importXML" aussi simple et d'avoir des choses plus complexe pour importer un tableau HTML dans des cellules depuis une boite mail juste parce qu'on a pas d'url ^^

par rapport a mon mail j'ai parfaitement le tableau donc d'autant plus frustrant pour moi ahah

( ps : le html que tu vois en dessous correspond a ce que j'obtiens quand j'enlève la partie xmlservice )

image

j'ai modifier par =

Logger.log('i =' + 'j= ' + ':' + msg)

et j'obtiens bien le même code HTML qu'avec mon script, c'est juste la mise en cellule qui me casse la tête en faite

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