Mail automatique + écriture date relance faite

Bonjour,

Je suis en train d'automatiser un fichier de relance fournisseur si ils sont en retard.

J'arrive à envoyer le mail automatiquement dès que le champs Délai de DATA passe en Relance à faire.

Voici mes feuilles:

Feuille DATA :

data

Feuille MAIL :

mail

Feuille RELANCE :

relance
function Mail_simple() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var Liste_mail =ss.getSheetByName('Relance');
  var Liste_div =ss.getSheetByName('Relance')
  var Texte_mail =ss.getSheetByName('Mail')

  var Liste_date =ss.getSheetByName('Relance')

  var n = Liste_mail.getLastRow();

    for (var i = 2; i < n +1; i ++) {

      var emailAddress = Liste_mail.getRange(i,3).getValue();
      var num_div = Liste_div.getRange(i,1).getValue();
      var envoi = Liste_date.getRange(i,2).getValue();

  var message = Texte_mail.getRange(2,2).getValue();
  var subject = Texte_mail.getRange(2,1).getValue();

  subject = subject.replace("<div>", num_div);
  message = message.replace("<div>", num_div).replace("<jour>",envoi);

  MailApp.sendEmail(emailAddress,subject,message);
  }  
}

Ceci marche très pour l'envoi des mails. Maintenant j'aimerai une fois la relance effectuée, écrire dans la feuille DATA la date du jour des numéros de div RELANCER

Bonjour,

Afin d'inscrire dans votre feuille data quand la relance a été effectuée, voici un exemple de code :

1- vous devez annoncer votre feuille data (au début de votre fonction):

  const dataSheet =ss.getSheetByName('DATA');

2- dans votre boucle for, sélectionner la plage correspondante au mail :

var accuseEnvoi = dataSheet.getRange(i,7);

3- formaliser la date :

var maintenant = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy HH:mm:ss");

4- une fois le mail envoyé, insérer la date dans la plage :

accuseEnvoi.setValue(maintenant)

Bonjour,

Cela écris bien dans l'autre page, cependant si tout les DIV ne sont pas à relancer ça les écris quand même une ligne après l'autre sans faire le lien avec le numéro.

Je ne sais pas si c'est clair

Bonjour

si tout les DIV ne sont pas à relancer

Comment les distinguer des autres ?

En fait ce qui apparaissent dans cette page sont ceux à relancer. Si ils ne sont pas à relancer ils ne sont pas dans la page relance. Et dans la page DATA la case délai est renseigné OK au lieu de relance à faire

Bonjour,

Donc, lorsque vous lancez le script de relance Mail_simple() il faudrait récupérer les numéros de DIV, les comparer dans la feuille data et lorsque ça correspond, écrire la date et heure de relance ?

Si tel est le cas, il faut imbriquer une condition, voici le code actualisé :

1- vous devez annoncer votre feuille data (au début de votre fonction):

 const dataSheet =ss.getSheetByName('DATA');

2- récupérer les références DIV de la feuille data dans une liste :

  var dataDiv = dataSheet.getRange(2,1,dataSheet.getLastRow()).getValues();

3- à la fin de la boucle for, comparer la référence DIV relancée par rapport à celles de la feuille data : (attention, il faut peut-être modifier le +2 en fonction du nb de lignes d'en-tête)

  if(dataDiv.indexOf(num_div)>0){
var accuseEnvoi = dataSheet.getRange(dataDiv.indexOf(num_div)+2,7);}

4- formaliser la date :

var maintenant = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy HH:mm:ss");

5- une fois le mail envoyé, insérer la date dans la plage :

accuseEnvoi.setValue(maintenant)

je vous conseille de placer un log dans la condition if, vois si ça fonctionne, si dysfonctionne, ajoutez un .toString() lors de la récupération de la variable dataDiv.

Bonjour lorsque j'ecris le code cela me renvoie l'erreur de lecture sur le SetValue. Je ne comprend pas très bien. Voici le code que j'ai tapé

function Mail_Relance() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var Liste_mail =ss.getSheetByName('RELANCE');
  var Liste_div =ss.getSheetByName('RELANCE');
  var Texte_mail =ss.getSheetByName('ANNEXES');
  var Liste_date =ss.getSheetByName('RELANCE');

  const dataSheet =ss.getSheetByName('SUIVI X');

  var n = Liste_mail.getLastRow();

  var dataDiv = dataSheet.getRange(2,1,dataSheet.getLastRow()).getValues();

    for (var i = 3; i < n +1; i ++) {

      var emailAddress = Liste_mail.getRange(i,3).getValue();
      var num_div = Liste_div.getRange(i,1).getValue();
      var envoi = Liste_date.getRange(i,4).getDisplayValue();;

  var message = Texte_mail.getRange(2,7).getValue();
  var subject = Texte_mail.getRange(2,6).getValue();

  subject = subject.replace("<div>", num_div);
  message = message.replace("<div>", num_div).replace("<jour>",envoi);

  if(dataDiv.indexOf(num_div)>0){
    var accuseEnvoi = dataSheet.getRange(dataDiv.indexOf(num_div)+1,5);}

 var maintenant = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy");

  MailApp.sendEmail(emailAddress,subject,message);

 accuseEnvoi.setValue(maintenant);

    }

Il doit y avoir une erreur, si dans le if vous mettez un log sur la variable accuseEnvoi est ce que c'est bien une range ?

J'ai écris cela est ça ne fonctionne pas. Je ne comprend pas l'intêret du logger quel est-il ?

if(dataDiv.indexOf(num_div)>0){
    var accuseEnvoi = dataSheet.logger().getRange(dataDiv.indexOf(num_div)+1,5);}
if(dataDiv.indexOf(num_div)>0){
    var accuseEnvoi = dataSheet.getRange(dataDiv.indexOf(num_div)+1,5);
    Logger.log(accuseEnvoi)
}

Cela permet d'afficher la variable accuseEnvoi, ainsi, voir si dans un 1er temps c'est bel et bien une donnée de type Range.

Cela renvoie quand même un erreur.

Voilà mon code :

function Mail_Relance() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var Liste_mail =ss.getSheetByName('RELANCE');
  var Liste_div =ss.getSheetByName('RELANCE');
  var Texte_mail =ss.getSheetByName('ANNEXES');
  var Liste_date =ss.getSheetByName('RELANCE');

  const dataSheet =ss.getSheetByName('SUIVI X');

  var n = Liste_mail.getLastRow();

  var dataDiv = dataSheet.getRange(2,1,dataSheet.getLastRow()).getValues();

    for (var i = 3; i < n +1; i ++) {

      var emailAddress = Liste_mail.getRange(i,3).getValue();
      var num_div = Liste_div.getRange(i,1).getValue();
      var envoi = Liste_date.getRange(i,4).getDisplayValue();;

  var message = Texte_mail.getRange(2,7).getValue();
  var subject = Texte_mail.getRange(2,6).getValue();

  subject = subject.replace("<div>", num_div);
  message = message.replace("<div>", num_div).replace("<jour>",envoi);

if(dataDiv.indexOf(num_div)>0){
    var accuseEnvoi = dataSheet.getRange(dataDiv.indexOf(num_div)+1,5);
    Logger.log(accuseEnvoi)
}
 var maintenant = Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy");

  MailApp.sendEmail(emailAddress,subject,message);

 accuseEnvoi.setValue(maintenant);

    }
}
Rechercher des sujets similaires à "mail automatique ecriture date relance faite"