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

ok, il faut changer ceci

var r = feuille.getLastRow()+1

par

var r = getLastDataRow(feuille)+1

en ajoutant

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();
  }              
}

ok merci, je te fais un retour sur tout ça dès que possible !

merci encore

tout fonctionne a merveille ! parfait.

pour la dernière partie, j'aurais été incapable de trouver tout seul...

un point vient de me sauter aux yeux.

image

Comment faire comprendre ( lors d'un query ou autre outils pour faire des stat' ) que ce qui est en jaune correspond bien au numéro de commande et date en orange ?

j'avoue ne pas avoir penser a ce cas de figure

oui justement j'y pensais en roulant, il faut que tu remplaces A par C ...

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

maintenant, il y a plusieurs solutions pour répéter ce qui est à gauche autant de fois qu'il y a de lignes dans le tableau ... je te donne une ou deux réponses d'ici demain

ok merci j'attend ton retour,

il faut quand même que je te demande... tu es sur quel fuseau horaire ? je te vois actif un bon nombre d'heure sur une journée ahah

Longitude : -2.2438923 | pas d'inquiétude, je dors au moins 6h d'affilée

Fait un essai comme ceci pour mentionner date et order sur chaque ligne et ajoute la modif du $, je ne sais pas quelle proposition tu as retenue.

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 = getLastDataRow(feuille)+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 order = importOrder(msg)
      var date = msgs[j].getDate()
      var a = (importTableHTML(msg,date,order))
      feuille.getRange(r,1,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)
    var regExp = new RegExp("#[0-9]+", "g"); 
    var commande = regExp.exec(data)[0];
  return(commande);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source,date,order) {
  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=[]
      prov.push(date)
      prov.push(order)
      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,'');
}

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();
  }              
}

Bonjour !

j'avais pris celle que tu as mis dans ton script !

tout fonctionne bien ! nickel !

je reviendrais surement un dernière fois sur ce sujet. mais pareil je ferais une synthèse clair

bonne journée !

Et du coup pour la Deuxième ( et dernière partie ) de ma question.

Voici le Script:

function mail() {

  var requete ="is:unread label:realT/Rents"
  var ss = SpreadsheetApp.getActive().getSheetByName("Rapport");
  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].getPlainBody();
      var sub = messages[j].getSubject();
      var dat = messages[j].getDate();
      var test = messages[j].getFrom();
      var free = getLastDataRow(ss)+1 

    ss.getRange('A'+free+':C'+free).setValues([[dat, sub, msg]])
    }
  }
  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);
}

Voici le rendu actuel :

image

En complément, pour ce tableau, j'ai ça :

image

En D :

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

En E et F :

=index(SPLIT(B2," "),1,4 pour "E" et 7 pour "F")

c'est surement possible de traiter ces formules dans le script directement ?

Voici une capture d'écran du mail et des infos ( si jamais c'est plus facile a faire d'une autre façon :

image

merci !

Re,

j'ai pu extraire l'ID google du mail avec

var regExp = msg.match(/[-\w]{25,}/);

ce qui me semble correct.

pour les dates j'ai essayé

Pour la date de debut ( application depuis la colonne B " Object " ) =

var regExp1 = sub.match(/(\d+.\d+.\d+)/);

Pour la date de fin ( application depuis la colonne B " Object " ) =

var regExp2 = sub.match(/(\d+.\d+.\d+)$/);
image

j'ai essayé sur plusieurs mails et j'ai des dates faussées, il faut donc que je revois ma technique ^^'

function myFunction() {
  var texte = 'CVDFG VGGF HH  2021/8/30'
  var date = texte.match(/[0-9\/]+/)[0];
  Logger.log(date)
  Logger.log(new Date(date))
}

J'ai vraiment du mal avec ce format ^^' merci j'essaye ça tout à l'heure !

Alors petit retour !

var date = texte.match(/[0-9\/]+/)[0];

je récupère bien la première date tout comme ce que j'avais essayé, bien que ta formule soit plus "sexy" et plus propre

petite question : pourquoi mettre ce "[0]" ?

maintenant il faut que je récupère la deuxième date ! je poursuis mes recherches !

EDIT : j'ai eu ma réponse en testant :

      var regExp1 = sub.match(/(?<year>[0-9]{4}).(?<month>[0-9]{1,2}).(?<day>[0-9]{1,2})/)[0];
      var regExp2 = sub.match(/(?<year>[0-9]{4}).(?<month>[0-9]{1,2}).(?<day>[0-9]{1,2})/)[1];
      var regExp3 = sub.match(/(?<year>[0-9]{4}).(?<month>[0-9]{1,2}).(?<day>[0-9]{1,2})/)[2];

et j'ai pu voir ma date se détacher en 3 partie ^^'

Bonjour,

Ho des regex !!!

Le [0] signifie que c'est le premier élément qui réponds à la condition.

Sans rien tu auras un tableaux avec les date.

Pour la deuxième

var date2 = texte.match(/[0-9\/]+/)[1];

Bonne Journée

bonjour :)

j'étais en train d'éditer mon msg justement !

Pour la deuxième

var date2 = texte.match(/[0-9\/]+/)[1];

j'ai essayé mais aucuns résultat !

edit : j'ai testé ainsi =

var regExp1 = sub.match(/([0-9]{4}.[0-9]{1,2}.[0-9]{1,2})/)[0];
var regExp2 = sub.match(/([0-9]{4}.[0-9]{1,2}.[0-9]{1,2})/)[1];

on peux voir que les groupes sont respectés pourtant

image

mais je ne chope pas les bonnes dates que je mette [1] ou [2] d'ailleurs

image
var regExp1 = sub.match(/([0-9]{4}.[0-9]{1,2}.[0-9]{1,2})/g)[0];
var regExp2 = sub.match(/([0-9]{4}.[0-9]{1,2}.[0-9]{1,2})/g)[1];

Trouvé ! j'ai rajouté les "g" a la fin de chaque Regex

il faut que je trouve un moyen de trier plusieurs colonnes maintenant ^^'

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

j'ai 2 colonnes a rajouter qui sont pas cote a cote !

ss.getRangeList(['A:A','D:D','E:E']).activate(); 
ss.getActiveRangeList().setNumberFormat('dd.MM.yyyy');

et voila !

Fini ici ( je pense )

merci encore !

Bonjour ! petite erreur détecté que je ne comprend pas.

maintenant que le script est complet pour moi, j'ai voulu l'exécuter sur l'ensemble des mails du label concerné ( une centaine de mail )

le temps d'exécution du script est assez long ( >6min ) alors j'ai tenté de le faire en plusieurs fois en attendant d'optimiser le script, si c'est possible…

Lorsque je pointe les 20 derniers mails le script génère une erreur et n'importe pas les mails !

je ne comprend pas d'où peut venir l'erreur ( changement de format dans le mail ? ) peut-être qu'on peux voir l'erreur plus précisément mais je ne sais pas faire

image

je remet le script

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 = getLastDataRow(feuille)+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 order = importOrder(msg)
      var date = msgs[j].getDate()
      var a = (importTableHTML(msg,date,order))
      feuille.getRange(r,1,a.length,a[0].length).setValues(a);     
      }
      var r = feuille.getRange(2, 1, feuille.getLastRow()-1, feuille.getLastColumn());    
      r.sort([{column: 1, ascending: false}]);

    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)
    var regExp = new RegExp("#[0-9]+", "g"); 
    var commande = regExp.exec(data)[0];
  return(commande);
}

//importation du tableau (contenu de tbody)
function importTableHTML(source,date,order) {
  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=[]
      prov.push(date)
      prov.push(order)
      for (var j=1;j<tds.length;j++){
        prov.push(stripTags('<td'+tds[j]).replace('$',''))
      }
      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,'');
}

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();
  }              
}

merci !

S'il n'importe pas les mails, c'est qu'il ne trouve pas la dernière ligne, en effet Google "fige" la feuille au début du script pour y puiser les infos, et ensuite effectue les calculs sur le serveur seul. C'est intelligent et rapide, mais si on veut mettre des infos dans les feuilles et les récupérer dans le script (comme la dernière ligne après copie), il faut flusher comme ici https://forum.excel-pratique.com/sheets/macro-bug-vlookup-figer-les-valeurs-162102#p1003661

SpreadsheetApp.flush();

Mais dans ton cas, ce n'est pas utile car il faut réduire le temps, et il y a une façon efficace de le faire, c'est de ne pas dialoguer avec la feuille tant que le script n'est pas terminé. Ces instructions sont donc à reprendre pour les mettre en tout dernier, mais pas n'importe comment bien sûr !

      feuille.getRange(r,1,a.length,a[0].length).setValues(a);     
// et
    var r = feuille.getRange(2, 1, feuille.getLastRow()-1, feuille.getLastColumn());    
    r.sort([{column: 1, ascending: false}]);

Je vais te faire un topo à tête reposée là-dessus car il faut que je teste comment faire

Il peut aussi y avoir autre chose, quelle est la ligne 40 dans importOrder ?

Il peut aussi y avoir autre chose, quelle est la ligne 40 dans importOrder ?

image

tout a bien fonctionné pour les autres mails, d'où mon incompréhension

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