Envoie d'un mail si date proche de la date d'aujourd'hui

Bonjour a tous,

Je rempli un tableau google sheet a partir de d'un formulaire "Contact form 7 " et d'un plugin 'CF7 Google Sheet Connector" qui ressemble a ça:

copie ecran

Mon objectif est de pouvoir recevoir un mail si une date de réservation, de la colonne A, est proche de la date d'aujourd'hui...

Comme je n'y connais strictement rien et que j'essaye de bidouiller, j'ai réussi a retourner en K2 une valeure 0 ou une valeure 1 si j'ai une date dans la colonne A égale a aujourd’hui + 1 ( la veille...).

J'ai fais dans APPS SCIPT le scripte suivant qui fonctionne:

function envoiemail() {const celluleK1030 = SpreadsheetApp.getActiveSheet().getRange('K2');const valeurK2 = celluleK1030.getValue();
if (valeurK2 == '1') { var subject = 'Réservation pour demain';
var message = 'Réservation pour demain';
var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';
MailApp.sendEmail(emailAddress, subject, message);}};

j'ai aussi ajouté un déclancheur a cette fonction lors de la modification de la feuille de calcul.

Tout fonctionne bien et je recois mon mail quand j'ouvre ma feuille google sheet et que je rentre une date manuellement (ou par le biais du formulaire de mon site web) mais si ma feuille est fermée, je ne reçois rien...

Comme je vous l'ai dis plus haut, je ne comprends pas grand chose mais peut être pouvez vous m'aider et m'expliquer pourquoi ça ne marche pas comme je le souhaiterais..

Merci!!

Pierre

Bonjour,

Primo, il faut faire un déclencheur "Déclencheur horaire" puis quotidien et le script suivant devrait faire l'affaire :

function envoiMailDate() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  SpreadsheetApp.flush();
  var plageDates = sheet.getRange("A2:A" + sheet.getLastRow()).getValues();
  var now = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy");
  var demain = Utilities.formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), "dd/MM/yyyy");
  for (var i = 0; i < plageDates.length; i++) {
    var dateCellule = Utilities.formatDate(new Date(plageDates[i][0]),Session.getScriptTimeZone(), "dd/MM/yyyy");
    Logger.log(dateCellule)
    if (dateCellule===demain) {
      var message = 'Réservation pour demain';
      var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';
      MailApp.sendEmail(emailAddress, subject, message);};
    }
  }

Bonjour,

Merci pour cette réponse rapide!

Quand j’exécute le scripte , j'ai une multitude de lignes dans le journal d’exécution...

1

Je ne reçois pas de mail quand google sheet est fermé et quand j'ouvre la feuille, ça n’arrête pas de calculer des formules (barre avancement bleu en haut a droite..)

C'est un log des dates, il y a manifestement un souci, peut être les cellules vides, modifie ainsi :

function envoiMailDate() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  SpreadsheetApp.flush();
  var plageDates = sheet.getRange("A2:A" + sheet.getLastRow()).getValues();
  var now = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy");
  var demain = Utilities.formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), "dd/MM/yyyy");
  for (var i = 0; i < plageDates.length; i++) {
    var dateCellule = Utilities.formatDate(new Date(plageDates[i][0]), Session.getScriptTimeZone(), "dd/MM/yyyy");
    if (dateCellule === demain) {
      Logger.log("envoi d'un email pour la ligne : "+(i+1));
      var message = 'Réservation pour demain';
      var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';
      MailApp.sendEmail(emailAddress, message);
    }
  }
}

Pour les journaux c'est ok mais je ne reçois pas de mail en ajoutant la date "20/04/2024" en col A , même quand la feuille est ouverte

Peux tu partager ton fichier ?

ma fonction envoiemail fonctionne mais seulement si la feuille google sheet "reservations" est ouverte.

Si je n'ouvre pas la feuille et que je fais une réservation via mon site, je ne reçois pas de mail.

Quand j'ouvre la feuille, alors le tableau se met a jour et je reçois le mail...

je ne sais pas si mes explications sont claires...

essaye ceci :

function envoiMailDate() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  SpreadsheetApp.flush();
  var plageDates = sheet.getRange("A2:A" + sheet.getLastRow()).getDisplayValues().filter(function(row) {
    return row[0] !== '';
  });
  var demain = Utilities.formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), "dd/MM/yyyy").toString();
  for (var i = 0; i < plageDates.length; i++) {
    var dateCellule = plageDates[i][0];
    if (dateCellule === demain) {
      Logger.log("envoi d'un email pour la ligne : "+(i+1));
      var message = 'Réservation pour demain';
      var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';
      MailApp.sendEmail(emailAddress, message);
    }
  }
}

avec un déclancheur quotidien, normalement ce script met a jour les formules avant.

J'ai cette erreur
2

Bonjour,

Le sujet est obligatoire :

https://developers.google.com/apps-script/reference/mail/mail-app?hl=fr#sendEmail

function envoiMailDate() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  SpreadsheetApp.flush();
  var plageDates = sheet.getRange("A2:A" + sheet.getLastRow()).getDisplayValues().filter(function(row) {
    return row[0] !== '';
  });
  var demain = Utilities.formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), "dd/MM/yyyy").toString();
  for (var i = 0; i < plageDates.length; i++) {
    var dateCellule = plageDates[i][0];
    if (dateCellule === demain) {
      Logger.log("envoi d'un email pour la ligne : "+(i+1));
      var message = 'Réservation pour demain';
      var subject = 'mettre sujet ici';
      var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';
      MailApp.sendEmail(emailAddress,subject, message);
    }
  }
}

Bonjour,

le mail arrive dans les spams mais ça fonctionne!

je vais essayer de comprendre votre script a présent :-)

je vous remercie beaucoup!!!

Voici une explication ligne par ligne :

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

On déclare dans une variable la feuille où l'ont souhaite travailler

  SpreadsheetApp.flush();

Cette fonction permet de forcer Sheets à actualiser les formules, données de la feuille

  var plageDates = sheet.getRange("A2:A" + sheet.getLastRow()).getDisplayValues().filter(function(row) {
    return row[0] !== '';
  });

Cette variable contient : les valeurs affichés dans la feuille "sheet", la plage A2:A + la dernière ligne de "sheet" filtrées pour ne conserver que les cellules où il y a des données.

  var demain = Utilities.formatDate(new Date(new Date().getTime() + 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), "dd/MM/yyyy").toString();

Là on créer la variable demain, qui est la date actuelle + 1 journée, au fuseau horaire de la session, au format dd/MM/yyyy et on le transforme en texte .

  for (var i = 0; i < plageDates.length; i++) {
    var dateCellule = plageDates[i][0];

On itère (càd on navigue sur chaque éléments d'une liste un à un, l'étape est représenté par "i") sur le nombre de dates issues de la feuille et on stocke chacun son tour chaque date dans une variable dateCellule

    if (dateCellule === demain) {

On teste si dateCellule = demain et si oui on exectue ce qui suit, entre { ... }

      Logger.log("envoi d'un email pour la ligne : "+(i+1));

Ceci est juste un log, quelque chose qu'on affiche dans la console pour vérifier le code, c'est une phrase + l'étape d'itération (i+1, si on ajoute un c'est que l'itération débute à 0 alors que les lignes du tableau à 1)

      var message = 'Réservation pour demain';
      var subject = 'mettre sujet ici';
      var emailAddress = 'xxxxxxxxxxxxxxx@hotmail.com';

RAS ici, ce sont 3 variable contenant du texte fixe, d'ailleurs tu peux si nécessaire faire appel des données du tableau, imaginons que le nom de ton client soit en B, tu pourrais faire comme message :

      var message = 'Une réservation est prévue demain, pour le client : '+sheet.getRange('B'+(i+1)).getValue();

Ainsi ça afficherai dans le mail le nom du client pour lequel tu as une réservation.

      MailApp.sendEmail(emailAddress,subject, message);

Cette ligne envoi un email à une / plusieurs adresse, avec un sujet et un corps.

Waou! merci!!!

Rechercher des sujets similaires à "envoie mail date proche aujourd hui"