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é
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
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("")
}
[...]
mais cela fonctionne ou pas maintenant ? c'est le cas ici https://docs.google.com/spreadsheets/d/1tUaYQyP3rcEUNJrwdUsymZUh-_DYI3pUJB2zJ_46Fgw/copy