Envoi d'un mail si la valeur n'est pas compris dans un intervalle

D'accord merci

C'était juste des test pour voir si les valeurs étaient bien présentes dans le graphe. Le but c'et qu'au fur et à mesure on remplisse cette ligne de valeur

Donc avec les corrections demandées

function envoi() {
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('CAPA');

  // chargement des données calendaires et horaires
  var jour = feuille.getRange('D5:Z5').getDisplayValues()
  var heure = feuille.getRange('D6:Z6').getDisplayValues()

  // préparation du mail
  var email = 'xxxxxxxxx@yyyy.com'

  // boucle sur les lignes
  for (var i=8; i<=feuille.getLastRow(); i=i+20){

    // valeur de Px : P1,P2 ... Poids utiles pour aller chercher les limites
    var p = feuille.getRange('A'+i).getValue()
    var feuilleTolerances = classeur.getSheetByName('Capa '+p)
    var limiteSup = feuilleTolerances.getRange('H38').getValue()
    var limiteInf = feuilleTolerances.getRange('H39').getValue()
    //Logger.log(p + ' ' + limiteSup + ' ' + limiteInf)

    // préparation du mail
    var texte = ''

    // chargement des données et boucle sur celles-ci
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        //Logger.log(releve[0][n])
        texte += releve[0][n] + ' le ' + jour[0][n] + ' à ' + heure[0][n] + '\n'
      }
    }

    // envoi d'un mail par Px
    if (texte!='') {GmailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n' + texte)}
  }
}    

j'ai mis un peu d'explication ... en tant qu'ingénieure-qualité je te conseille vivement de comprendre et t'approprier la logique d'écriture

je reste à ta dispo si nécessaire pour t'aider

Je vous remercie pour vos remarques. J'en prend note et les appliquerai. Je vous remercie énormément, le programme fonctionne.

J'ai une question svp. Pour que mon programme s'exécute automatiquement seulement à la fin du remplissement de tous les Px . Cette partie de bout de script devrait normalement fonctionner?

var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        //Logger.log(releve[0][n])
        texte += releve[0][n] + ' le ' + jour[0][n] + ' à ' + heure[0][n] + '\n'

    // envoi d'un mail par Px
    GmailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n' + texte)
   }

"automatiquement" signifie que google sheet a reçu une instruction pour ce faire, en l'occurrence soit un moment dans la journée (je ne pense pas que ce soit le cas), soit par le renseignement manuel d'une cellule ... ma question est quelle cellule est renseignée manuellement ?

Les colonnes de la ligne "relevé" sont renseigné manuellement. Sauf que le mail ne s'envoie pas directement quand la valeur est hors de l'intervalle. Sauf si je mets un bouton sauf que je veux que ca fasse sans avoir appuyer sur un bouton. Et pour le déclenchement, aucun type d'événement ne correspond à ce que je veux.

Si tu veux recevoir l'email quand la dernière valeur (colonne Z) d'une ligne de relevés est renseignée

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('↓ Relance ↓')
  .addItem('Envois emails ↓', 'envoi')
  .addToUi();
}
function onEdit(event){
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='CAPA' && cellule.getColumn()==26){
    var jour = feuille.getRange('D5:Z5').getDisplayValues()
    var heure = feuille.getRange('D6:Z6').getDisplayValues()
    var i=cellule.getRow()
    var email = 'xxxxxxxxxxx@gmail.com'
    var p = feuille.getRange('A'+i).getValue()
    var feuilleTolerances = classeur.getSheetByName('Capa '+p)
    var limiteSup = feuilleTolerances.getRange('H38').getValue()
    var limiteInf = feuilleTolerances.getRange('H39').getValue()
    //Browser.msgBox(p + ' ' + limiteSup + ' ' + limiteInf)
    var texte = ''
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        texte += releve[0][n] + ' le ' + jour[0][n] + ' à ' + heure[0][n] + '\n'
      }
    }
    //Browser.msgBox(texte)
    if (texte!='') {
      GmailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n' + texte)
    }
  }
}
function envoi() {
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('CAPA');

  // chargement des données calendaires et horaires
  var jour = feuille.getRange('D5:Z5').getDisplayValues()
  var heure = feuille.getRange('D6:Z6').getDisplayValues()

  // préparation du mail
  var email = 'xxxxxxxxxx@gmail.com'

  // boucle sur les lignes
  for (var i=8; i<=feuille.getLastRow(); i=i+20){

    // valeur de Px : P1,P2 ... Poids utiles pour aller chercher les limites
    var p = feuille.getRange('A'+i).getValue()
    var feuilleTolerances = classeur.getSheetByName('Capa '+p)
    var limiteSup = feuilleTolerances.getRange('H38').getValue()
    var limiteInf = feuilleTolerances.getRange('H39').getValue()
    //Logger.log(p + ' ' + limiteSup + ' ' + limiteInf)

    // préparation du mail
    var texte = ''

    // chargement des données et boucle sur celles-ci
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        //Logger.log(releve[0][n])
        texte += releve[0][n] + ' le ' + jour[0][n] + ' à ' + heure[0][n] + '\n'
      }
    }

    // envoi d'un mail par Px
    if (texte!='') {GmailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n' + texte)}
  }
}    

il faut aussi mettre un déclencheur sur la fonction onEdit comme suit

trigger

je t'envoie en mp le lien du fichier que j'ai utilisé

Je vous remercie. Mais il ne fonctionne pas. D'après ma compréhension du programme, c'est à cause de cette partie du programme.

Donc tant que je ne suis pas à la colonne 26. Cela ne marchera pas.

image

Dans ce cas, tu dois pouvoir modifier la condition toi-même

(feuille.getName()=='CAPA' && (cellule.getColumn()>=4 && cellule.getColumn()<=26))

cela veut dire que l'événement sera détecté sir la feuille s'appelle bien CAPA et que la colonne touchée se trouve entre 4 (D) et 26 (Z)

Je vous remercie énormément pour votre aide et le temps consacrer à la réalisation du programme.

Merci beaucoup .

Bonsoir, je me permets de poser une question, suite à vos échanges. Est-il possible de déclencher l'envoi d'un mail lorsqu'une valeur est atteinte, sans qu'il y ait une quelconque saisie, modification, ou programmation horaire ?

Si, par exemple, une valeur change suite au remplissage d'un formulaire Google form, et que par conséquent, une valeur change et atteint un certain seuil, est-il possible de déclencher l'envoi d'un mail ?

Je pense que non car l'action n'est pas une action manuelle sur une cellule de la feuille (au conditionnel quand même car je ne connais pas bien le fonctionnement des google forms) - dans ce cas, on pourrait

  • soit lancer périodiquement (tous les jours, toutes les heures ... ) un script
  • soit lacer systématiquement un script sur l'émission de la form elle-même (ce que je n'ai jamais fait non plus mais qui existe)

Très bien merci pour ce retour. Je n'en ai pas besoin pour l'instant, c'était juste par simple curiosité.

Merci !

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('↓ Relance ↓')
  .addItem('Envois emails ↓', 'envoi')
  .addToUi();
}
function onEdit(event){
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='CAPA G' && (cellule.getColumn()>=4 && cellule.getColumn()<=26)){
    var jour = feuille.getRange('D5:Z5').getDisplayValues()
    var heure = feuille.getRange('D6:Z6').getDisplayValues()
    var i=cellule.getRow()
    var email = '**********************'
    var p = feuille.getRange('A'+i).getValue()
    var feuilleTolerances1 = classeur.getSheetByName('Capa P1')
    var feuilleTolerances2 = classeur.getSheetByName('Capa P2')
    var feuilleTolerances3 = classeur.getSheetByName('Capa P3')
    var feuilleTolerances4 = classeur.getSheetByName('Capa P4')
    var feuilleTolerances5 = classeur.getSheetByName('Capa P5')
    var limiteSup = feuilleTolerances1.getRange('H38').getValue()
    var limiteInf = feuilleTolerances1.getRange('H39').getValue()
    var limiteSup = feuilleTolerances2.getRange('H38').getValue()
    var limiteInf = feuilleTolerances2.getRange('H39').getValue()
    var limiteSup = feuilleTolerances3.getRange('H38').getValue()
    var limiteInf = feuilleTolerances3.getRange('H39').getValue()
    var limiteSup = feuilleTolerances4.getRange('H38').getValue()
    var limiteInf = feuilleTolerances4.getRange('H39').getValue()
    var limiteSup = feuilleTolerances5.getRange('H38').getValue()
    var limiteInf = feuilleTolerances5.getRange('H39').getValue()
    //Browser.msgBox(p + ' ' + limiteSup + ' ' + limiteInf)
    var texte = ''
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        var presse = feuille.getRange('M3:N3').getDisplayValues()
        texte +=  releve[0][n]+ 'le ' + jour[0][n] + 'à ' + heure[0][n] + 'sur la '+ presse + '\n '  
      }
    }
    //Browser.msgBox(texte)

    if (texte!='') {
      MailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n ' + texte)
    }
  }
}
function envoi() {
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('CAPA G');

  // chargement des données calendaires et horaires
  var jour = feuille.getRange('D5:Z5').getDisplayValues()
  var heure = feuille.getRange('D6:Z6').getDisplayValues()

  // préparation du mail
  var email = '*********************'

  // boucle sur les lignes
  for (var i=8; i<=feuille.getLastRow(); i=i+20){

    // valeur de Px : P1,P2 ... Poids utiles pour aller chercher les limites
    var p = feuille.getRange('A'+i).getValue()
    var feuilleTolerances1 = classeur.getSheetByName('Capa P1')
    var feuilleTolerances2 = classeur.getSheetByName('Capa P2')
    var feuilleTolerances3 = classeur.getSheetByName('Capa P3')
    var feuilleTolerances4 = classeur.getSheetByName('Capa P4')
    var feuilleTolerances5 = classeur.getSheetByName('Capa P5')
    var limiteSup = feuilleTolerances1.getRange('H38').getValue()
    var limiteInf = feuilleTolerances1.getRange('H39').getValue()
    var limiteSup = feuilleTolerances2.getRange('H38').getValue()
    var limiteInf = feuilleTolerances2.getRange('H39').getValue()
    var limiteSup = feuilleTolerances3.getRange('H38').getValue()
    var limiteInf = feuilleTolerances3.getRange('H39').getValue()
    var limiteSup = feuilleTolerances4.getRange('H38').getValue()
    var limiteInf = feuilleTolerances4.getRange('H39').getValue()
    var limiteSup = feuilleTolerances5.getRange('H38').getValue()
    var limiteInf = feuilleTolerances5.getRange('H39').getValue()

    //Logger.log(p + ' ' + limiteSup + ' ' + limiteInf)

    // préparation du mail                               
    var texte = ''

    // chargement des données et boucle sur celles-ci
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf) || (releve[0][n]>limiteSup)){
        //Logger.log(releve[0][n])
        texte += releve[0][n] + ' le ' + jour[0][n] + ' à ' + heure[0][n] + '\n'
      }
    }

    // envoi d'un mail par Px
    if (texte!='') {MailApp.sendEmail(email, 'Message d\'alerte', 'Valeur hors limite de surveillance sur "' + p + '"\n' + texte)}
  }
}    

J'ai une question s'il vous plait. J'ai rajouté dans mon document une partie Gauche et droite et réessayer de remodifier à maintes reprises mon script pour qu'il fonctionne. Mais malheureusement, le résultat n'y est toujours pas. Pouvez vous s'il vous me dire ce qui ne va pas avec mon script. En vous remerciant d'avance.

Pour le moment, je cherche juste à voir les différences ...

Quand tu écris ceci

    var limiteSup = feuilleTolerances1.getRange('H38').getValue()
    var limiteInf = feuilleTolerances1.getRange('H39').getValue()
    var limiteSup = feuilleTolerances2.getRange('H38').getValue()
    var limiteInf = feuilleTolerances2.getRange('H39').getValue()
    var limiteSup = feuilleTolerances3.getRange('H38').getValue()
    var limiteInf = feuilleTolerances3.getRange('H39').getValue()
    var limiteSup = feuilleTolerances4.getRange('H38').getValue()
    var limiteInf = feuilleTolerances4.getRange('H39').getValue()
    var limiteSup = feuilleTolerances5.getRange('H38').getValue()
    var limiteInf = feuilleTolerances5.getRange('H39').getValue()

seules les deux dernières valeurs sont prises en compte, les autres sont écrasées

Je comprends pourquoi le code ne fonctionnait que pour la dernière valeur je vous remercie.

Et en essayant le code ci dessous, le script ne fonctionne pas non plus, il m'envoie un mail malgré que la valeur soir dans l'intervalle. Et je crois comprendre que le problème vient surement du relevé ou je me trompe?

    var limiteSup1 = feuilleTolerances1.getRange('H38').getValue()
    var limiteInf 1= feuilleTolerances1.getRange('H39').getValue()
    var limiteSup2 = feuilleTolerances2.getRange('H38').getValue()
    var limiteInf2 = feuilleTolerances2.getRange('H39').getValue()
    var limiteSup3 = feuilleTolerances3.getRange('H38').getValue()
    var limiteInf3 = feuilleTolerances3.getRange('H39').getValue()
    var limiteSup4 = feuilleTolerances4.getRange('H38').getValue()
    var limiteInf4 = feuilleTolerances4.getRange('H39').getValue()
    var limiteSup5 = feuilleTolerances5.getRange('H38').getValue()
    var limiteInf5 = feuilleTolerances5.getRange('H39').getValue()
    var texte = ''
    var releve = feuille.getRange('D'+i+':Z'+i).getValues()
    for (var n=0;n<releve[0].length;n++){
      if (releve[0][n]!='' && (releve[0][n]<limiteInf1) || (releve[0][n]>limiteSup1) && (releve[0][n]<limiteInf2) || (releve[0][n]>limiteSup2) && (releve[0][n]<limiteInf3) || (releve[0][n]>limiteSup3) && (releve[0][n]<limiteInf4) || (releve[0][n]>limiteSup4) && (releve[0][n]<limiteInf5) || (releve[0][n]>limiteSup5))

ajoute des parenthèses et remplace les && par des ||

if ( releve[0][n]!='' && ( (releve[0][n]<limiteInf1) || (releve[0][n]>limiteSup1) || (releve[0][n]<limiteInf2) || (releve[0][n]>limiteSup2) || (releve[0][n]<limiteInf3) || (releve[0][n]>limiteSup3) || (releve[0][n]<limiteInf4) || (releve[0][n]>limiteSup4) || (releve[0][n]<limiteInf5) || (releve[0][n]>limiteSup5) ) )

enfin, je présumé (tout dépend de ce que tu souhaites)

En modiafiant le script, il prends beaucoup de temps et l'alerte renvoie toutes les valeurs qui sont dans la colonne relevée

Pour le temps, on peut le résoudre en passant par des arrays, donc en limitant le nombre d'interactions directes avec la feuille.

Ce qui me préoccupe d'abord, c'est l'aspect fonctionnel, peux-tu dire ce que tu cherches à faire (de façon plus littérale que via des formules)

Rechercher des sujets similaires à "envoi mail valeur pas compris intervalle"