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

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 )

si c'est bien cette ligne Logger.log (curieux) cela veut dire que ton erreur viendrait du fait qu'il ne trouve pas de threads correspondant à ta sélection !

Supprime cette ligne et relance ...

Je ne peux pas tester mais il ne me semble pas avoir fait de fautes d'orthographe sur cette ligne

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 ^^



je suis bien d'accord, mais ce n'est pas in fine si complexe que cela... sachant que le script intègre aussi le filtrage des emails

mais ce n'est pas in fine si complexe que cela

je trouve beaucoup de documentation sur comment transformer un tableau sheet en html mais pas l'inverse, c'est curieux..

Supprime cette ligne et relance ..

on a repondu en même temps, ton log obtiens bien ce que j'avais obtenu egalement. à savoir ce code HTML :

<table><tbody>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        128 E Weber St, Toledo, OH 43608        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.15</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        1612 Denver Ave, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.72</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        338 Willard St, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.15</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        601 Milton St, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.71</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        1204 E Manhattan Blvd, Toledo, OH 43608        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>51.20</span>        </td>
    </tr>
</tbody></table>

et si je ne garde que ceci =

var document = XmlService.parse(source);

j'obtiens dans ma cellule = [Document: No DOCTYPE declaration, Root is [Element: <table/>]]

ok, avec la changement de page, je n'avais pas vu ta réponse.

donc le mail est mal "configuré" pour utiliser XmlService.parse, il n'y a pas d'objet supérieur à table

bon, je vais te proposer un erstaz pour XmlService.parse ... cela fera un peu d'exercice pour mes neurones !!

avant tout, essaye de modifier cette ligne

var source = "<table>"+ html +"</table>"

comme ceci

var source = "<!DOCTYPE html><html><body><table>"+ html +"</table></body></html>"

comme ceci

var source = "<!DOCTYPE html><html><body><table>"+ html +"</table></body></html>"

j'avais déjà testé sans changement visible de mon coté

et juste

var source = "<html><body><table>"+ html +"</table></body></html>"

et juste

var source = "<html><body><table>"+ html +"</table></body></html>"

En faite je dois m'attendre a quoi comme résultat selon toi ? car cela rajoute juste des balises au débuts et a la fin du code html.

Code que j'ai déjà extrait avec cette ligne = ( résultat juste en dessous )

var html = msg.substring(debut,fin)+"</tbody>";
<tbody>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        128 E Weber St, Toledo, OH 43608        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.15</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        1612 Denver Ave, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.72</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        338 Willard St, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.15</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        601 Milton St, Toledo, OH 43605        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>48.71</span>        </td>
    </tr>
<tr class="order_item">
<td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap: break-word;">
        1204 E Manhattan Blvd, Toledo, OH 43608        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            1        </td>
        <td class="td" style="color: #636363; border: 1px solid #e5e5e5; padding: 12px; text-align: left; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
            <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>51.20</span>        </td>
    </tr>
</tbody>

au début de ma réflexion j'avais ajouté manuellement ceci var source = "<table>"+ html +"</table>"; pour bien définir la table.

petite question de bon matin !

      var source = "<table>"+ html +"</table>" ;

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

cette fonction permet de récupérer les informations d'une table html (doit remplacer les 2 dernières lignes ci-dessus)

function importTableHTML(source) {
  var trs = [...source.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  var data = [];
  for (var i=0;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      var donnee=stripTags(tds[j][0]).trim()
      prov.push(donnee);
    }
    data.push(prov);
  }
  return(data);
}
function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

voir exemple ici : https://docs.google.com/spreadsheets/d/1tUaYQyP3rcEUNJrwdUsymZUh-_DYI3pUJB2zJ_46Fgw/copy

reste à intégrer à ton projet car tu as plusieurs tableaux html potentiels.

parfait, cela me semble plus simple a adapter pour d'autres mails différents que de ceux qui me servent d'exemple. merci !

je pense que le fait d'avoir isoler dès le début la partie du code HTML cible rends le script plus rapide, les 112 mails ont été traités en très peu de temps

Est-ce possible de mettre 2 Expressions régulière cote a cote ? je parle pour cette partie la

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

je voulais placer un petit (\$) supplémentaire ou (\€) le cas échéant

et dernière petite question

si je veux rajouter des éléments sur d'autres colonnes, je rajoute simplement un feuille.getrange(ligne, colonne).setValues( donnée supplémentaires ) ?

function test() {

  var requete ="is:unread label:realT/Tokens"
  var feuille = 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 r = feuille.getLastRow()+1
      var msg = messages[j].getBody();
      var date = messages[j].getDate();
      var debut = msg.indexOf("<tbody")
      var fin = msg.indexOf("</tbody")
      var html = msg.substring(debut,fin)+"</tbody>";
      var source = "<!DOCTYPE html><html><body><table>"+ html +"</table></body></html>" ;
      var a = (importTableHTML(source))
      feuille.getRange(r,2,a.length,a[0].length).setValues(a);              
    }
  }
}
function importTableHTML(source) {
  var trs = [...source.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  var data = [];
  for (var i=0;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      var donnee=stripTags(tds[j][0]).trim()
      prov.push(donnee);
    }
    data.push(prov);
  }
  return(data);
}
function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

Excellent ! j'avais eu la flemme de le faire !

var r = feuille.getLastRow()+1

...

var a = (importTableHTML(source))
feuille.getRange(r,2,a.length,a[0].length).setValues(a);

Oui tu peux ajouter la suppression de $ et € comme suit

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace("$|€","");
}

à tester

ton excellent ne répond pas à ma question 😁

si je veux rajouter des éléments sur d'autres colonnes, je rajoute simplement un feuille.getrange(ligne, colonne).setValues( donnée supplémentaires ) ?

pour ex, je veux rajouter les données issues de

var date = messages[j].getDate();

je rajoute un feuille.getrange(ligne, colonne).setValues(date) ?

à tester

ok, je suis sur mon téléphone, je regarderai plus tard

merci

si je veux rajouter des éléments sur d'autres colonnes, je rajoute simplement un feuille.getrange(ligne, colonne).setValues( donnée supplémentaires ) ?

ah! ben je n'ai pas compris ... d'où viennent ces infos ?

ah! ben je n'ai pas compris ... d'où viennent ces infos ?

nul part, j'en avais vu plusieurs sur le 1er script que tu avais fait.

screenshot 20210926 154525 chrome

donc je me demandais comment placer d'autres données supplémentaires

Oui tu peux ajouter la suppression de $ et € comme suit

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace("$|€","");
}

à tester

j'ai essayé de la placer a 1000 endroits mais ça marche pas

Bonjour,

Bonjour Mikhail

Une proposition

function stripTags(body) {
  var regex = /((<([^>]+)>)|€|$)/ig;
  return body.replace(regex,"");
}

Ou encore

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  body = body.replace(regex,"")
  return body.replace("$|€","");
}

Je précise à tester.

Bonne Journée

Bonjour Imoka, et merci

tes 2 propositions font parties des choses que j'ai essayé, mais sans issues favorable

Oui tu peux ajouter la suppression de $ et € comme suit

function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"").replace("$|€","");
}

à tester

j'ai essayé de la placer a 1000 endroits mais ça marche pas

var donnee=stripTags(tds[j][0]).trim().replace("$","").replace("€","")

j'avais essayé aussi

var donnee=stripTags(tds[j][0]).trim().replace("$","")

tout comme :

var donnee=stripTags(tds[j][0]).replace("$","").trim();

et

var msg = messages[j].getBody().replace("$","");
var html = (msg.substring(debut,fin)+"</tbody>").replace("$","");
var source = ("<!DOCTYPE html><html><body><table>"+ html +"</table></body></html>").replace("$","");

(pour ceux la j'ai eu un résultat partiel) le "$" n'était pas enlevé partout ( même résultat pour les 3 versions )

ça me laisse assez dubitatif

EDIT : j'ai trouvé une alternative avec :

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

    for (var j = 0; j < messages.length; j++) {
      var r = feuille.getLastRow()+1
      var msg = messages[j].getBody();
      var debut = msg.indexOf("<tbody")
      var fin = msg.indexOf("</tbody")
      var html = msg.substring(debut,fin)+"</tbody>";
      var source = "<!DOCTYPE html><html><body><table>"+ html +"</table></body></html>";
      var a = (importTableHTML(source));

    feuille.getRange(r,2,a.length,a[0].length).setValues(a);              
    }
  }
  var f = feuille.getRange("D:D");
        f.createTextFinder("$").replaceAllWith("")
}
[...]
Rechercher des sujets similaires à "extraire information mail gmail sheets"