Automatisation envoi e-mail de rappel

Bonjour à tous,

J'ai parcouru pas mal de sujet sur le forum, j'ai édité un code, mais celui-ci n'a pas l'air de fonctionner... Je m'en remet donc à vous pour une petite aide.

J'ai un classeur qui comporte des noms en colonne A et une date en colonne I. J'ai des emails en colonne O.

J'aimerais que lorsque la date = la date du jour, un email s'envoi aux e-mail de la colonne O en indiquant "C'est l'heure d'arroser xxxx", xxxx étant le nom de la plante de la colonne A.

function onOpen() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [ 
    { name: "Envoyer un e-mail maintenant", functionName: "envoyerEmailManuellement" }
  ];
  feuilleDeCalcul.addMenu("Menu Personnalisé", menu);
}

function envoyerEmail() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = feuilleDeCalcul.getSheetByName('Plantes Boulogne'); 
  var plageDonnees = feuille.getDataRange().getValues();
  var dateAujourdhui = new Date();

  for (var i = 1; i < plageDonnees.length; i++) {
    var nom = plageDonnees[i][0];
    var dateEvenement = new Date(plageDonnees[i][8]); // Colonne I (index 8)
    var email1 = plageDonnees[i][14]; // Colonne O (index 14)
    var email2 = plageDonnees[i][15]; // Colonne O (index 15)

// Vérifiez si la date de l'événement est égale à la date actuelle
    if (dateEvenement.getDate() === dateAujourdhui.getDate() && dateEvenement.getMonth() === dateAujourdhui.getMonth() && dateEvenement.getFullYear() === dateAujourdhui.getFullYear()) {
      if (email1) {
        MailApp.sendEmail(email1, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
      if (email2) {
        MailApp.sendEmail(email2, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
    }
  }
}

function envoyerEmailManuellement() {
  envoyerEmail();
}

Sauriez-vous me dire où cela coince ?

Merci par avance :)

Juju_ski

Bonjour,

tentez un log voir dans un premier temps si les données collectées sont correctes :

function onOpen() {
var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
var menu = [
{ name: "Envoyer un e-mail maintenant", functionName: "envoyerEmailManuellement" }
];
feuilleDeCalcul.addMenu("Menu Personnalisé", menu);
}

function envoyerEmail() {
var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
var feuille = feuilleDeCalcul.getSheetByName('Plantes Boulogne');
var plageDonnees = feuille.getDataRange().getValues();
var dateAujourdhui = new Date();

for (var i = 1; i < plageDonnees.length; i++) {
var nom = plageDonnees[i][0];
var dateEvenement = new Date(plageDonnees[i][8]); // Colonne I (index 8)
var email1 = plageDonnees[i][14]; // Colonne O (index 14)
var email2 = plageDonnees[i][15]; // Colonne O (index 15)
Logger.log("Plante = "&nom&"date = "&dateEvenement&" email1 = "&email1&" email2 = "&email2)

// Vérifiez si la date de l'événement est égale à la date actuelle
if (dateEvenement.getDate() === dateAujourdhui.getDate() && dateEvenement.getMonth() === dateAujourdhui.getMonth() && dateEvenement.getFullYear() === dateAujourdhui.getFullYear()) {
if (email1) {
MailApp.sendEmail(email1, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
}
if (email2) {
MailApp.sendEmail(email2, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
}
}
}
}

function envoyerEmailManuellement() {
envoyerEmail();
}

Si les données sont correctes, c'est que le souci réside dans la comparaison des dates, dans ce cas tentez le log suivant :

function onOpen() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [ 
    { name: "Envoyer un e-mail maintenant", functionName: "envoyerEmailManuellement" }
  ];
  feuilleDeCalcul.addMenu("Menu Personnalisé", menu);
}

function envoyerEmail() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = feuilleDeCalcul.getSheetByName('Plantes Boulogne'); 
  var plageDonnees = feuille.getDataRange().getValues();
  var dateAujourdhui = new Date();

  for (var i = 1; i < plageDonnees.length; i++) {
    var nom = plageDonnees[i][0];
    var dateEvenement = new Date(plageDonnees[i][8]); // Colonne I (index 8)
    var email1 = plageDonnees[i][14]; // Colonne O (index 14)
    var email2 = plageDonnees[i][15]; // Colonne O (index 15)

// Vérifiez si la date de l'événement est égale à la date actuelle
    Logger.log("test date : event = "&dateEvenement&" / aujourdhui = "&dateAujourdhui)
    if (dateEvenement.getDate() === dateAujourdhui.getDate() && dateEvenement.getMonth() === dateAujourdhui.getMonth() && dateEvenement.getFullYear() === dateAujourdhui.getFullYear()) {
      Logger.log("test OK pour ligne "&i)
      if (email1) {
        MailApp.sendEmail(email1, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
      if (email2) {
        MailApp.sendEmail(email2, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
    }
  }
}

function envoyerEmailManuellement() {
  envoyerEmail();
}

Bonjour Pierre,

Merci pour ce retour.

Les résultats des log me donne de 0.0 partout. Je ne sais pas réellement ce que cela signifie...

Merci pour cette aide.

En effet, il fallait mettre des + au lieu des &, bref voici le résultat du 1er log :

15:38:43 Infos Plante = date = Invalid Date email1 = email2 = undefined

15:38:43 Infos Plante = Kalanchoe Red Lipsdate = Fri Nov 03 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Alocasia Cuculattadate = Fri Nov 03 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Pilea White Splashdate = Mon Nov 06 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Asparagus Plumosusdate = Mon Nov 06 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Cordylinedate = Tue Nov 07 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Cactusdate = Thu Nov 09 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Cactusdate = Thu Nov 09 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Eccheveriadate = Thu Nov 09 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Aloe Veradate = Thu Nov 09 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = Aloe Arristatadate = Thu Nov 09 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

15:38:43 Infos Plante = TESTdate = Thu Nov 02 2023 00:00:00 GMT+0100 (Central European Standard Time) email1 = email2 = undefined

Donc 1er souci, les données ne sont pas bien stockées dans les variables.

les plantes OK, la date OK, mais email1 et email2 ca ne va pas.

Voici votre script modifié, cela semble fonctionner :

function onOpen() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [ 
    { name: "Envoyer un e-mail maintenant", functionName: "envoyerEmailManuellement" }
  ];
  feuilleDeCalcul.addMenu("Menu Personnalisé", menu);
}

function envoyerEmail() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = feuilleDeCalcul.getSheetByName('Plantes Boulogne'); 
  var dateAujourdhui = new Date();

  for (var i = 0; i < feuille.getLastRow(); i++) {
    var nom = feuille.getRange(i+1,1).getValue();
    var dateEvenement = new Date(feuille.getRange(i+1,9).getValue());
    var email1 = feuille.getRange(i+1,15).getValue(); // Colonne O (index 14)
    var email2 = feuille.getRange(i+1,16).getValue(); // Colonne O (index 15)

// Vérifiez si la date de l'événement est égale à la date actuelle
    Logger.log("test date : event = "+dateEvenement+" / aujourdhui = "+dateAujourdhui)
    if (dateEvenement.getDate() === dateAujourdhui.getDate() && dateEvenement.getMonth() === dateAujourdhui.getMonth() && dateEvenement.getFullYear() === dateAujourdhui.getFullYear()) {
      Logger.log("test OK pour ligne "+i)
      if (email1) {
        MailApp.sendEmail(email1, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
      if (email2) {
        MailApp.sendEmail(email2, 'Il est temps d\'arroser', 'Cher ' + nom + ',\n\nIl est temps d\'arroser.');
      }
    }
  }
}

function envoyerEmailManuellement() {
  envoyerEmail();
}

Merci Pierre. Malheureusement, cela n'a pas l'air de fonctionner.

Est-ce que le problème ne viendrait pas du format de la date ? S'ils comparent avec les heures/minutes, peut-être cela impact-il le processus ?

J'ai testé, ça fonctionne chez moi

J'ai modifié la date en I4 afin de tester avec le 02/11/2023, puis j'ai mis mon adresse mail en O4, puis j'ai lancé la fonction, le mail a bien été envoyé.

OK ça fonctionne :)

Les adresses mails ne doivent pas être au bon endroit dans mon fichier en étant en O1 et O2...

Pour que je puisse les conserver en O1 et O2 j'ai un doute sur le code

    var email1 = feuille.getRange(i+1,15).getValue(); // Colonne O (index 14)
    var email2 = feuille.getRange(i+1,16).getValue(); // Colonne O (index 15)

C'est bien celui là que je dois corriger ?

Merci beaucoup Pierre

  var email1 = feuille.getRange("O1").getValue();
  var email2 = feuille.getRange("P1").getValue();

J'ai spécifiquement nommé les plages.

Et ça fonctionne parfaitement :)

J'ai juste une demande.

Est-ce possible de regrouper sur un seul mail la liste des choses à arroser qui tombe le même jour ? Avec ce code, ça m'envoi un mail par plante. C'est juste une amélioration si c'est facile à faire.

Merci Pierre

Oui il est possible de prendre en compte x adresses e-mails, ils seraient tous dans une cellule ? Si oui, il suffit de les séparer par des virgules

Le tableau ne changerait pas, mais si 2 plantes sont à arroser le même jour, plutôt que chaque destinataire ne reçoive 2 mails, chacun n'en reçoit qu'un.

D'accord, il est possible d'ajouter une telle logique au script actuel, mais cela va devenir peu optimum, voici un nouveau script plus adapté :

function onOpen() {
  var feuilleDeCalcul = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [ 
    { name: "Envoyer un e-mail maintenant", functionName: "envoyerEmail" }
  ];
  feuilleDeCalcul.addMenu("Menu Personnalisé", menu);
}

function envoyerEmail() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName('Plantes Boulogne');
  let emails = Array.from(new Set(sheet.getRange('O2:O').getValues())).filter(email => email[0] !== "");
  let data = sheet.getDataRange().getValues();
  let now = Utilities.formatDate(new Date(), 'GMT+2', 'dd/MM/yyyy');
  let message = {};

  for (let i = 0; i < emails.length; i++) {
    let email = emails[i].toString();

    for (let j = 0; j < data.length; j++) {
      let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy');

      if (data[j][14] === email && prochainArrosage === now) {
        if (!message[email]) {
          message[email] = [email];
        }
        message[email].push(data[j][0]);
      }
    }
  }
  let messages = Object.values(message);

  messages.forEach(messageData => {
    let destinataire = messageData[0];
    let nomsPlantes = messageData.slice(1).join(', ');
    let sujet = 'Rappel d\'arrosage pour vos plantes';
    let corps = 'Bonjour,\n\nVoici la liste des plantes qui ont besoin d\'arrosage aujourd\'hui : ' + nomsPlantes;
    GmailApp.sendEmail(destinataire, sujet, corps);
  });
}

Merci mais j'ai ajouté une colonne et du coup, cela ne fonctionne pas... Je ne comprends pas pourquoi :(

J'ai pourtant décalé let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy') de un rang...

Juju

Par ailleurs, j'ai identifié un autre problème :

Quand j'ajoute une ligne, elle s'ajoute en ligne 999 et non à la suite du tableau.

Sauriez-vous d'où cela peut provenir ?

Merci mais j'ai ajouté une colonne et du coup, cela ne fonctionne pas... Je ne comprends pas pourquoi :(

J'ai pourtant décalé let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy') de un rang...

Juju

La liste des emails est-elle toujours en O ?

  let emails = Array.from(new Set(sheet.getRange('O2:O').getValues())).filter(email => email[0] !== "");

La date du prochain arrosage à cet index :

      let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy');

Le nom de la plante à cet index :

message[email].push(data[j][0]);

Par ailleurs, j'ai identifié un autre problème :

Quand j'ajoute une ligne, elle s'ajoute en ligne 999 et non à la suite du tableau.

Sauriez-vous d'où cela peut provenir ?

Ça n'a rien à voir avez-vous mis des filtres ?

Oui la liste des emails est en O.

La date du prochain arrosage en J.

Le nom des plantes en A.

Je n'ai pas mis de filtre mais des formules telles que :

={"Prochain arrosage";ARRAYFORMULA(SI(A2:A="";;SI($N$1=$D$2;I2:I+D2:D;SI($N$1=$E$2;I2:I+E2:E;SI($N$1=$F$2;I2:I+F2:F;I2:I+G2:G)))))}

afin que lors de l'ajout d'une ligne, la formule s'applique à cette nouvelle ligne. Cela peut venir de là ?

Il faut changer la ligne

 let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy');

par

 let prochainArrosage = Utilities.formatDate(new Date(data[j][9]), 'GMT+2', 'dd/MM/yyyy');

Voyez en premier si ça fonctionne avant de voir votre autre souci.

Malheureusement, cela ne fonctionne pas :/

Bonjour,

Le script fonctionne bien sur mon fichier test, il faudrait que vous fassiez des logs ou débuger voir ce qui coince.

Edit. Avec des + à la place des & c'est OK pour les mails.

J'essaie un log pour le reste, mais je ne sais pas où le placer ^^

Rechercher des sujets similaires à "automatisation envoi mail rappel"