Plages d'exécution d'un script

Bonjour à tous,

je bricole et explore de nouvelles choses, aujourd'hui je m'attaque à une récupération de mail.

j'avais déjà un exemple réalisé par Mike et je m'en suis fortement inspiré pour une tout autre chose.

le voici (pour le moment)

function mail() {

var requete ="is:unread {label:Test1 label:Test2}"
var ss = SpreadsheetApp.getActive().getSheetByName("Mail");
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();

ss.appendRow([dat, sub, msg])
}
}  
GmailApp.markThreadsRead(threads);
}

donc il récupère les mails non lu de 2 labels différents et une fois "importé" il les marques en "lu" sur ma boite mail.

2 questions :

** je n'arrive pas a savoir/comprendre comment préciser dans ce script d'importer le contenu de "ss.appendRow" dans des cellules précises ?


par ex. "dat" en B2, "sub" en C2, et "msg" en D2

** et indirectement, car je pense que ce sera au même endroit, je ne veux pas écraser les anciennes données lorsque de nouveaux mails non lu seront importés

une fusion avec celui ci, mais j'ai du mal a placer les éléments !

function archiver(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var f2 = doc.getSheetByName('Test');
  var adresses = ["D1","B3","D3","B5"]; // les cellules concernées
  var destinations = ["B2","C2","D2","E2"]; // les colonnes où seront reportées les valeurs
  f2.insertRowBefore(2);
  for (var i = 0; i < adresses.length; i++){
    f2.getRange(destinations[i]).setValue(f1.getRange(adresses[i]).getValue());
  }
}

Merci a vous ! et bonne soirée !

PS : Question subsidiaire, pour un débutant, c'est plus facile d'importer des données via la version HTML d'un mail ? ou une version "texte" du contenu et du regextract par ex. ?


j'ai commencé a regarder les Expressions régulières .. aïe

ss.appendRow([dat, sub, msg])

** je n'arrive pas a savoir/comprendre comment préciser dans ce script d'importer le contenu de "ss.appendRow" dans des cellules précises ?

par ex. "dat" en B2, "sub" en C2, et "msg" en D2

À main levée, essaie quelque chose comme ...

ss.getRange('B'+ss.getLastRow()+':D'+ss.getLastRow()).setValues([dat, sub, msg])

PS : Question subsidiaire, pour un débutant, c'est plus facile d'importer des données via la version HTML d'un mail ? ou une version "texte" du contenu et du regextract par ex. ?

il ne doit pas y avoir de différence, mais autant travailler avec les données brutes textuelles au lieu du html

Bonjour

ss.getRange('B'+ss.getLastRow()+':D'+ss.getLastRow()).setValues([dat, sub, msg])

je le mets a la place de "ss.appendRow([dat, sub, msg])" ?

si c'est la cas voici le message d'erreur,

Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.

il ne doit pas y avoir de différence, mais autant travailler avec les données brutes textuelles au lieu du html

okok, j'avais commencé dans ce sens effectivement.

double les crochets ! et ajoute +1

var free = ss.getLastRow()+1 // première ligne libre
ss.getRange('B'+free+':D'+free).setValues([[dat, sub, msg]])

j'ai essayé ! parfait pour la selection des cellules

var free = ss.getLastRow()+1 // première ligne libre
ss.getRange('B'+free+':D'+free).setValues([[dat, sub, msg]])

en revanche ça démarre toujours sur la 1ere ligne

j'ai essayé

ss.getRange('B2'+free+':D2'+free).setValues([[dat, sub, msg]])

mais j'ai une ligne toute les ....

Tu n'as pas de titres en première ligne ? ou bien je n'ai pas compris ...est-ce que tu veux que ce soit toujours la ligne 2 en insérant une ligne ?

ss.insertRowBefore(2);
ss.getRange('B2:D2').setValues([[dat, sub, msg]])

Tu n'as pas de titres en première ligne ? ou bien je n'ai pas compris ..

tu avais bien compris.. je suis simplement idiot.. j'ai testé dans une feuille vide pour voir comment se comporte le script et effectivement je n'avais pas mis de titre..

Donc c'est top comme ça. merci !

je cloture, car je ferais du hors sujet si jamais j'ai une ou deux question sur le regex..

merci !

regex..

regexextract pardon

je regardais les scripts avec les expressions régulières aussi c'est pour ça

et tu as aussi REGEXREPLACE

Re !

petite chose a laquelle je n'avais pas pensé, je viens d'avoir le cas lors de mes tests.

si jamais j'actionne le script sur une période aléatoire et que je reçois plusieurs mails, il y a un remède pour que ce soit bien trié quand même sur mon Sheets ?

par ex.

image

l'importation se fait dans le sens mail plus récent non lu >>> mail plus ancien non lu

je ne pense pas pouvoir intervenir la dessus, en revanche peut-être qu'une ligne de code sur le script permet d'ordonner la colonne "A" par ex. dans par ordre croissant ou décroissant à chaque utilisation du script ?

merci

si tu veux que ce soit trié sur ta feuille ... fais appel à cette fonction

function trier(feuille){
    var r = feuille.getRange(2, 1, f.getLastRow() - 1, f.getLastColumn());
    r.sort([{column: 10, ascending: true}, {column: 17, ascending: true}]);
}

règle 10 et 17 qui sont les colonnes comme tu le souhaites

Merci !

si tu veux que ce soit trié sur ta feuille ... fais appel à cette fonction

hum... je mets quoi a la place de feuille ? ^^' j'ai comme le sentiment qu'il n'est pas a sa place sur ton script et qu'il faut que je le change.. ou je dois juste mettre ton script en dessous du miens et c'est okay

j'avais presque pareil, mais je ne pouvais pas choisir croissant ou decroissant ^^

function mail() {

  var requete ="is:unread {label:label1 label:label2}"
  var ss = SpreadsheetApp.getActive().getSheetByName("Mail");
  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 = ss.getLastRow()+1 

    ss.getRange('A'+free+':D'+free).setValues([[dat, sub, msg,test]])
    }
  }    
  ss.sort(1);
  GmailApp.markThreadsRead(threads);
}

PS : j'avais essayé ça aussi entre temps " ss.sort({column: 1, ascending: false}); " à la place de ss.sort(1);

mais j'ai cette erreur la Exception: Cannot convert '[object Object]' to int.

c'est bon ! j'ai compris :) merci encore !

function mail() {

  var requete ="is:unread {label:label2 label:label1}"
  var ss = SpreadsheetApp.getActive().getSheetByName("Mail");
  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 = ss.getLastRow()+1 

    ss.getRange('A'+free+':D'+free).setValues([[dat, sub, msg,test]])
    }
  }
  var r = ss.getRange(2, 1, ss.getLastRow()-1, ss.getLastColumn());    
  r.sort([{column: 1, ascending: false}]);
  GmailApp.markThreadsRead(threads);
}

et moi j'ai compris qu'il fallait que je te laisse mijoter car tu trouves toujours la réponse

tu deviens un pro

ah ah

et moi j'ai compris qu'il fallait que je te laisse mijoter car tu trouves toujours la réponse

je comprend pas toujours tout, mais à force de voir et d'avoir des exemples, je me débrouille en effet (j'essaye)

merci

Rechercher des sujets similaires à "plages execution script"