Automatisation envoi e-mail de rappel

La photo 8 n'est pas une euphorbe plutôt qu'un cactus ?

👍

C'est vrai que cela ressemble, mais cela m'a été vendu comme étant cactus alors je vais approfondir

Bonjour,

J'ai ajouté quelques Logger.log(), voyez ce que ca donne, étape par étape.

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

    Logger.log("email analysé = "+email);

    for (let j = 0; j < data.length; j++) {
      let prochainArrosage = Utilities.formatDate(new Date(data[j][8]), 'GMT+2', 'dd/MM/yyyy');
      Logger.log("data prochain arrosage = "+prochainArrosage)
      Logger.log("test email colonne O = email analysé, colonne O = "+data[j][14)
      if (data[j][14] === email && prochainArrosage === now) {
        if (!message[email]) {
          message[email] = [email];
        }
        Logger.Log("test passé, ajout d'un mail pour la plante : "+data[j][0]+" à l'adresse mail : "+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);
  });
}

EDIT

Pour les log c'est OK (sauf le log "Test passé, ajout d'un mail pour la plante" qui n'est pas pris en compte). J'ai corrigé cette ligne en j9 au lieu de j8 qui renvoyait vers la colonne I et non la J.

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

En revanche, je ne reçois toujours pas de mail, alors même que le log détecte bien mon mail...

Et autre soucis, quand j'ai ajouté 2 nouvelles lignes, la colonne I ne reste pas au format date pour les nouvelles lignes. Donc la date n'est pas trouvée et le log m'indique 0 alors même que la date devait être aujourd'hui.

Vous avez identifié le problème :

sauf le log "Test passé, ajout d'un mail pour la plante" qui n'est pas pris en compte

Il faut savoir pourquoi le test ne fonctionne pas, dans un premier temps si les valeurs sont bien égales, si elles le sont ce doit être à cause du format (par exemple le format date qui n'est pas identique).

Voici le script actualisé avec des logs spécifiques sur les tests.

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][9]), 'GMT+2', 'dd/MM/yyyy');
      Logger.log("test : "+data[j][14]+" = "+email+"? et "+prochainArrosage+" = "+now+" ?")
      if (data[j][14] === email && prochainArrosage === now) {
      Logger.log("test 1 OK")
        if (!message[email]) {
        Logger.log("test 2 OK")
          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);
  });
}

Avez-vous des tests qui devraient fonctionner ? C'est-à-dire que les 2 emails + les 2 dates sont identiques (strictement identique)

Alors, j'ai une ligne avec les dates qui correspondent, mais j'ai qu'un seul email :

10:01:40 Infos test : = juju_ski@hotmail.com? et 08/11/2023 = 08/11/2023 ?

En revanche, les 2 test précédents, j'ai bien les 2 emails, mais les dates sont 01/01/1970 et 08/11/2023

exemple :

10:05:05 Infos test : juju_ski@hotmail.com = juju_ski@hotmail.com? et 01/01/1970 = 08/11/2023 ?

Rien sur les log Test 1 et test 2.

D'accord, est ce bien la bonne colonne de date qui est prise en compte ? Pouvez-vous vérifier en mettant une date bidon (ex : 01/01/2000) voir si la date est bien affichée.

Ensuite, vérifiez qu'il y a bien une adresse email pour une plante dont la date du prochain arrosage est le 08/11/2023.

Oui la première date est bien la bonne colonne. La seconde date est bien la date du jour.

10:17:10 Infos test : = juju_ski@hotmail.com? et 08/01/2000 = 08/11/2023 ?

Et j'ai bien un mail

10:18:10 Infos test : = juju_ski@hotmail.com? et 08/11/2023 = 08/11/2023 ?

Rechercher des sujets similaires à "automatisation envoi mail rappel"