Envoi de mail (contenant tableau) automatique avec AppsScript (Gsheet)
Bonjour à tous,
Je possède un Gsheet avec plusieurs onglet:
un onglet : Listing OF Saleh (qui contient un tableau avec des données)
un onglet message : qui contient l'objet et le texte du mail.
J'ai mis le fichier en copie (j'ai essayé de l'anonymiser avec des chiffre ^^'), en excel pour avoir une vue des données mais je l'exécute sur Gsheet.
J'ai comme code sur apps script :
function sendEmail() {
// Definir les Variables
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Listing_OF =ss.getSheetByName('Listing OF Saleh');
var Texte_mail =ss.getSheetByName('Message');
var subject = Texte_mail.getRange(2,1).getValue();
// retrouver la dernière ligne
var n = Listing_OF.getLastRow();
//-------la boucle--------
// le compteur
for (var i = 2; i< n+1; i ++) {
// les variables de la boucle
var emailAddress = Listing_OF.getRange(i,22).getValue();
var nom_prenom = Listing_OF.getRange(i,23).getValue();
var numero_OF = Listing_OF.getRange(i,2).getValue();
var dateDeSaisie = Listing_OF.getRange(i,12).getValue();
var numeroArticle = Listing_OF.getRange(i,4).getValue();
var designationOF = Listing_OF.getRange(i,5).getValue();
var message = Texte_mail.getRange(2,2).getValue();
// remplacer les mots clefs
message = message.replace("<NOM_Prenom>", nom_prenom).replace("<OF>", numero_OF).replace("<numeroArticle>", numeroArticle).replace("<designationOF>", designationOF).replace("<date de saisie>", dateDeSaisie);
// envoyer les mails
MailApp.sendEmail(emailAddress,subject,message);
}
}Le message (onglet Message) en question est :
"Bonjour <NOM_Prenom> :
<OF> - <numeroArticle> <designationOF> <date de saisie>
Pouvez-vous s'il vous plait vérifier si cet OF sera lancé ? Dans le cas contraire, pouvez-vous cloturer ou recaler l'OF?
Si besoin, n'hésitez pas à me répondre pour me donner plus amples informations à ce sujet.
Merci d'avance pour votre aide."
Sachant que les éléments entre <> sont des valeur du tableau du de la feuille Listing OF Saleh.
Ce programme envoie pour chaque ligne, un mail au destinataire. J'aimerai modifier le code pour au lieu d'envoyer x mail à une personne (en fonction du nombre de fois que cette personne est présente dans la colonne NomPrenom), envoyer un seul mail par personne (donc le <NOM_Prenom>, l'adresse mail seront utilisés une seule fois pour chaque personne) et avec dans le mail un tableau de toutes les lignes lui concernant :
"Bonjour <NOM_Prenom> :
Voici un tableau récapitulatif des OF à cleaner :
<OF1> - <numeroArticle1> <designationOF1> <date de saisie1>
<OF2> - <numeroArticle2> <designationO2F> <date de saisie2> --> Sous la forme d'un tableau avec comme entête les entête du fichier
Si besoin, n'hésitez pas à me répondre pour me donner plus amples informations à ce sujet.
Merci d'avance pour votre aide. "
J'ai essayé de modifier la boucle afin d'avoir un test sur le nom prénom mais je n'y suis pas arrivé.
Une personne sachant mieux programmer que moi pourrait m'aider svp ? J'espère que c'est clair sinon je peux re expliquer.
Merci d'avance pour votre aide.
Bonjour,
Si je saisi bien votre problématique :
- Vous envoyez des emails automatiques en fonction de références "OF"
- Vous aimeriez que lorsqu'une personne à plusieurs "OF" attribuées, elle ne reçoit qu'un seul mail compilant ses "OF" ?
Si tel est le cas, à votre place, je créerais des listes par personne au début de votre script et ensuite, j'ajouterai les lignes à chaque personne lorsque la ligne correspond à son nom.
Ensuite, une condition qui dit que si la liste est vide, on ne fait rien, sinon, on envoi un email avec la liste correpondant à cette personne.
C'est ça. Merci pour votre réponse.
Pouvez vous me montrer comment faire svp ? Je n'en ai pas les compétences.
1 - récupérer la liste des destinataires dans une liste :
var listedest = Listing_OF.getRange(1,23,n,1).getValues();
2 - nettoyer la liste afin de ne conserver que les noms uniques :
var destinataires = listedest.flat().filter(menage)
Logger.log(unique)
function menage(value, index, self) {
return self.indexOf(value) === index;
}Maintenant nous avons bien une liste avec les noms qui apparaissent dans la colonne 23 (et qu'une fois chaque nom).
Il faut maintenant sélectionner les données, et les envoyer aux destinataires correspondant ( à l'aide d'une boucle for, et de condition if / else).
Je ne vais pas avoir le temps d'écrire l'intégralité de ce code.
Re bonjour, encore merci pour votre aide. Après de multiples essais je n'y arrive pas à finir le code. Pouvez vous finir svp votre code commencé ?
Merci d'avance.
Je débute en App Script et aujourd'hui, finir un tel code me prendrait environ 2 heures, peut-être que des personnes + compétentes peuvent vous aider.
Sinon pour vous mettre sur la piste, je pense qu'il faut imbriquer 2 boucles , une qui prend chaque nom 1 par 1 des destinataire, qui les teste par rapport à votre colonne 23 et qui, si le nom correspond, met les données dans une liste, qu'on envoi ensuite par email. (comme ça, qu'il y ai un nom 1 ou 3 fois, il y a un mail envoyé avec x données).
var Nbnom = length(destinataires)
for (var i=1; i<Nbnom; i ++) {
var nomboucle = destinataire[i];
var listeboucle = []
for(var j=1,i<n;i++){
if (destinataire[i] = nomboucle) {
listeboucle.push( METTRE ICI VOS GETVALUES)