Extraire des information d'un mail depuis Gmail vers Sheets ?
effectivement j'ai un changement de format dans le mail :
mail non traité :
mail traité :
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
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 :)
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);
}
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 )
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