Envois d'un mail en auto quand on change l'état d'une cellule G.Sheet
Bonjour ,
Je récupère, des données par le biais de formulaire(s) de commande.
J'ai rajouté une colonne avec un état qui est sur une liste de validation donnée par l'onglet "Bon commande" en C2 il y a un renvois qui se fait indépendamment sur chaque ligne de commande dans l'onglet "réponse au formulaire 1"
Exemple quand une ligne arrive sur le fichier et qu'on lui attribue un "Etat" en C2 de l'onglet Bon Commande" exemple: "En attente de validation" J'aimerais envoyer automatiquement un mail à celui qui en a la fait une demande ( adresse mail en colonne C--> Onglet "Réponses au formulaire 1" ) quand l'état est sélectionné avec un message prédéfinis ( ça ok compris) par contre pour l'envois du mail automatiquement je ne sais pas comment faire pour envoyer automatiquement le mail quand la case en colonne C2 Onglet "Bon commande"
est mis à jour par la sélection d'un nouvel état
quand Etat sélectionné en C2 onglet "Bon commande" pour la Cmd001 --> envois mail au demandeur de la commande CMD001
je laisse un fichier non officiel qui me sert à tester les fonctions
Je te prépare cela
Au passage, je me suis trompé dans les scripts+/-
var num=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A2') // modifier si nécessaire
var der=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Réponses au formulaire 1').getLastRow()-1
function moins(){
num.setValue(Math.max(num.getValue()-1,1))
}
function plus(){
num.setValue(Math.min(num.getValue()+1,der))
}
Je propose aussi
en B1
=OFFSET('Réponses au formulaire 1'!C1;'Bon commandes'!A2;)
en B3
="Bonjour, "& OFFSET('Réponses au formulaire 1'!D1;'Bon commandes'!A2;) & char(10) &
"La CMD """ & OFFSET('Réponses au formulaire 1'!G1;'Bon commandes'!A2;) & """" & char(10) & char(10) &
"passe à """ &'Bon commandes'!C2 & """" & char(10) & char(10) &
"Cordialement"
Envoi du mail
Replace la fonction onEdit par ceci :
function onSpeEdit(event){
var feuille = event.source.getActiveSheet();
var cellule = event.source.getActiveRange();
if (feuille.getName()=='Bon commandes' && cellule.getA1Notation()=='C2'){
// mise à jour Etat
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Réponses au formulaire 1').getRange('A'+(num.getValue()+1)).setValue(cellule.getValue())
cellule.setFormula("=IFERROR(OFFSET('Réponses au formulaire 1'!A1;$A$2;))")
// envoi mail
var message = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Message')
MailApp.sendEmail(message.getRange('B1').getValue(), message.getRange('B2').getValue(), message, {
htmlBody: message.getRange('B3').getValue().replace(/\n/g,'<br>')
});
SpreadsheetApp.getActive().toast('Email envoyé !', 'Fin de script 🗃️', 4)
}
}
onEdit est un déclencheur simple qui peut exécuter des opérations sans autorisations. L'envoi du mail étant une opération qui nécessite elle une autorisation, il faut déclarer un déclencheur (on parle de déclencheur installable). Dans ce cas, pour plus de clarté, je préfère utiliser un autre terme comme onSpeEdit et lui affecter le déclencheur ...
Et si je décidais de changer les états depuis la feuille " Réponse au formulaire 1" est ce que le mail peut s'envoyer aussi ?
je voulais savoir si ça peut se faire dans les deux sens ?
Cela peut se faire, il faut changer un peu (beaucoup) le script.
Question : tu veux le changer ligne par ligne ou sur plusieurs lignes en même temps (copier/coller sur plusieurs lignes) ?
Ligne par ligne indépendamment
Feuille "Réponses au formulaires 1"
Colonne "Etat" --> Validation données --> ligne par ligne
Exemple Ligne 2 feuille "réponses au formulaires 1 " Dde Devis--> En cde
--> mail en auto au demandeur.
ça change beaucoup ? j'ai essayé de rajouter une mise à jour (d'une autre case par exemple si on change la section concerné que ça m'envois aussi un mail en auto) ou de faire à l'inverse je n'y arrive pas
je n'ai pas testé ... à voir
function onSpeEdit(event){
var feuille = event.source.getActiveSheet();
var cellule = event.source.getActiveRange();
if (feuille.getName()=='Bon commandes' && cellule.getA1Notation()=='C2'){
// mise à jour Etat
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Réponses au formulaire 1').getRange('A'+(num.getValue()+1)).setValue(cellule.getValue())
cellule.setFormula("=IFERROR(OFFSET('Réponses au formulaire 1'!A1;$A$2;))")
// envoi mail
var message = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Message')
MailApp.sendEmail(message.getRange('B1').getValue(), message.getRange('B2').getValue(), message, {
htmlBody: message.getRange('B3').getValue().replace(/\n/g,'<br>')
});
}
if (feuille.getName()=='Bon commandes' && cellule.getRow()>1 && cellule.getColumn()==1){
// mise à jour bon de commande qui drive les données de l'email
var bon = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Bon commandes')
bon.getRange('A2').setValue(cellule.getRow()-1)
SpreadsheetApp.flush();
// envoi mail
var message = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Message')
MailApp.sendEmail(message.getRange('B1').getValue(), message.getRange('B2').getValue(), message, {
htmlBody: message.getRange('B3').getValue().replace(/\n/g,'<br>')
});
}
}
// mise à jour bon de commande qui drive les données de l'email
var bon = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Bon commandes')
bon.getRange('A2').setValue(cellule.getRow()-1)
SpreadsheetApp.flush();
// envoi mail
var message = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Message')
MailApp.sendEmail(message.getRange('B1').getValue(), message.getRange('B2').getValue(), message, {
htmlBody: message.getRange('B3').getValue().replace(/\n/g,'<br>')
});
SpreadsheetApp.getActive().toast('Email envoyé !', 'Fin de script 🗃️', 4)
}
}
Remplacer Bon commandes par 'Réponses au formulaires 1' pour que le mail s'envois quand je modifie de la colonne Etat de la feuille réponses au formulaire 1
c'est nickel j'ai même repris ta petit box email envoyé fin du Script qui est pas mal au moins visuellement je vois si l'action prend.
Ta répondu à mes interrogations
si j'ai bien saisis ton code je vais pouvoir l'adapter à d'autre section pour renvoyer un mail.
Un grand merci ça fais quelque jours que je découvre l'apps Scrit et c'est fort intéressant en espérant réussir à coder de moi même prochainement ;)
Mets ton code avec l'aide de </> pour qu'il soit lisible.
Nota important entre les 2 cas, j'ai ajouté l'instruction flush pour que la mise à jour soit effective dans le message
Quand un script met un jour une donnée qui implique d'autres données dans le même script ensuite il faut 'flusher' sinon le script ne tient compte que de l'état initial de la feuille au lancement (rappel : les scripts sont exécutés côté serveur).