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"

formulaire bidon reponses formulaire bidon reponses 1 formulaire bidon reponses 2

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

https://docs.google.com/spreadsheets/d/1tszKuK4QtaFgX8OraoJf_LDzlBbcbvCKy3O5AG3SE8s/edit#gid=1543444...

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"
image

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 ...

image

Rien à dire top !

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 ?

https://docs.google.com/spreadsheets/d/1tszKuK4QtaFgX8OraoJf_LDzlBbcbvCKy3O5AG3SE8s/edit#gid=3245797...

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>')
    });
  }
}
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>')

});

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).

Rechercher des sujets similaires à "envois mail auto quand change etat sheet"