2 déclencheurs (via case à cocher) sur une même feuille : possible ?

Bonjour à tous,

Après maintes recherches sur le net et ce forum infructueuses, je fais (encore) appel à vous.

Voici ma question : est-il possible d'avoir, sur une même feuille, 2 colonnes de cases à cocher utilisées comme déclencheur qui lancent 2 scripts différents.

Exemple : sur la feuille, colonne G : case à cocher qui lance le premier script (envoi d'un mail pour lancer la procédure)

même feuille, colonne I : case à cocher (plusieurs jours après la 1ère) qui lance le 2ème script (envoi d'un autre mail pour déclarer la fin de la procédure)

image

Pour l'instant, mon code ne fait pas la différence entre les 2 colonnes de cases, et lance le 1er script quelque soit la case cochée. (sur l'image, la colonne I est en "validation de donnée" car c'est le seul moyen que j'ai trouvé pour créer un second déclencheur différent du 1er. Mais d'un point de vue pratique, ça ne fonctionne pas à cause de la ligne en cours)

Est-il possible de différencier les 2 colonnes de case et de les attribuer à un déclencheur différent lié à une fonction ?

Bonjour,

Il est tout à fait possible de le faire en testant la colonne touchée par la modification getColumn()

un exemple en attendant un lien vers ton fichier si besoin

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='Feuille 1'){
    // colonne G
    if (cellule.getColumn()==7 && cellule.getValue()){
      Browser.msgBox('je fais ceci')
      cellule.setValue(false)
    }
    // colonne I
    if (cellule.getColumn()==9 && cellule.getValue()){
      Browser.msgBox('je fais cela')
      cellule.setValue(false)
    }
  }
}

Pour ne rien te cacher, je travaille sur le même fichier que celui de mon post précédent (que tu as résolu grâce au tostring() ) et comme tu las compris je cherche à intégrer la fonctionnalité d'envoyer une seconde salve de mail grâce à une seconde case à cocher.

Peux tu m'expliquer comment tu gères le fait que ça envoie le mail (avec les données) qui concerne la ligne où tu coches et pas une autre ?

Je demande ça car dans le code actuel, la case à cocher est définie "e" et on utilise getrow()

Et autre question : le déclencheur est contenu dans la fonction "onedit" ?

Ce sont les 2 points que je ne comprends pas bien dans le code que j'ai récupéré et que tu as corrigé (qui fonctionne très bien maintenant merci beaucoup !). Si je pige ça, je pense être capable de l'adapter en utilisant la structure que tu proposes "get column()"

Je n'avais pas fait le lien, et cela m'avait donné du fil à retordre !!

Pour ici,

1-

onEdit ne nécessite pas de déclencheur normalement sauf quand il entraîne des fonctions qui elles sont sécurisées comme l'envoi de mail, et dans ce cas il faut définir un déclencheur sur la fonction onEdit https://developers.google.com/apps-script/guides/triggers

Because simple triggers fire automatically, without asking the user for authorization, they are subject to several restrictions:

2-

j'avoue que je ne connais pas très bien la signification de e ou event ou autre chose ... c'est une sorte de flag de modification de quelque chose, et on utilise

/**
 * The event handler triggered when editing the spreadsheet.
 * @param {Event} e The onEdit event.
 */
function onEdit(e) {
  // j'exécute une action
  Browser.msgBox('ligne '+e.range.getRow()+' modifiée !')
}

on utilisera donc e sur lequel on peut rechercher toutes les propriétés que l'on veut comme la ligne, la colonne, la feuille, la cellule, et comme il ne peut logiquement n'y avoir logiquement qu'un seul onEdit(e) par fichier, ces propriétés permettront de savoir dans quel cas on se trouve, selon la colonne ou la feuille ou la ligne ou ... on peut alors agir sur toute une ligne, y capter les infos en utilisant var ligne = e.range.getRow()

Donc si je résume :

  • comme je souhaite envoyer des mails, il faut que j'utilise les déclencheurs
  • Il faut utiliser (e), donc pour différencier les 2 colonnes de cases, il faut cette structure : if e.getColumn()==7.value=TRUE qui détectera la colonne G et if e.getColumn()==9.value=TRUE qui détectera la colonne I

Si je suis à côté de la plaque, alors j'avoue que ça dépasse largement ma compréhension débutante du script et je te mettrai un fichier en partage pour que tu essaies quelque chose...

Je pense qu'il faut que tu mettes e.range.getColumn()

Le mieux est d'y aller pas à pas ...

Voici un code qui fonctionne !! (et tout ce qui va avec)

Pour une sheet configurée comme ceci :

Mail 1 (déclaration panne) à envoyer si on coche la case en G

Mail 2 (panne résolue) à envoyer si on coche la case en I

image

Le déclencheur qui utilise la fonction onEdit() avec évènement "à la modification" :

image

Et le fameux code qui permet de différencier les 2 cases à cocher :

J'ai utilisé ta structure et surtout le cellule.getRow() pour différencier les cases

function onEdit(event){

  //var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();

  var ui = SpreadsheetApp.getUi()
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var fuseauHoraire = Session.getScriptTimeZone();

  if (feuille.getName()=='Feuille 1'){

    // colonne G : mail 1 : déclaration de la panne

    if (cellule.getColumn()==7 && cellule.getValue()){

      var fal = feuille.getRange("E"+ cellule.getRow()).getValues().toString();

      // Alerte utilisateur
      var dialogue = ui.alert('Vous avez coché "Traité".', 'Envoyer le mail 1 ' + fal + ' ?', ui.ButtonSet.YES_NO)

      // Si l'utilisateur approuve
      if (dialogue == ui.Button.YES) {

        if (fal.indexOf("AAA")>-1) {
        SpreadsheetApp.getActiveSheet().getRange("E" + cellule.getRow()).setValue("AAA")
          var email = "adresse mail 1"; 
      }
        else if (fal.indexOf("BBB")>-1) {
        SpreadsheetApp.getActiveSheet().getRange("E" + cellule.getRow()).setValue("BBB")
        var email = "adresse mail 2"; 
      }
        else {
        ui.alert('Aucune liste de diffusion n\'a été entrée pour ce programme. Contactez le support')
          return; //on sort du code si pas de mail prévu
      }

      Logger.log("Emailing " + email) // Enregistrer le courriel dans la log
      SpreadsheetApp.getActiveSheet().getRange("H" + cellule.getRow()).setValue(Utilities.formatDate(new Date(), fuseauHoraire, "dd/MM/yyyy")); //Inscription dans la colonne H la date d'envoi du mail 

      // Envoyer le courriel
      MailApp.sendEmail({
        to: email,
        //cc :,
        subject: "Avis truc à créer" + feuille.getRange("B" + cellule.getRow()).getValues(), // Objet ici
        name: "L'équipe gestionnaire", // Votre nom ici
        body: "Bonjour, \nmerci de créer un avis truc pour l'équipement " + feuille.getRange("C" + cellule.getRow()).getValues() + " n° " + feuille.getRange("B" + cellule.getRow()).getValues() + " localisé en " + feuille.getRange("D" + cellule.getRow()).getValues() + ". \nCause : "+feuille.getRange("F" + cellule.getRow()).getValues() + "\n\nCordialement,\nL'équipe \n", // Corps du courriel ici
      })
      Logger.log("Envoyé") //
    }

   }
}

  // colonne I : mail 2 : panne résolue

  if (cellule.getColumn()==9 && cellule.getValue()){

    var lieu_recup = feuille.getRange("J" + cellule.getRow()).getValues();

    if (lieu_recup==0) {
      var saisie = ui.prompt('Veuillez indiquer le lieu de récupération de l\'équipement');
      var lieu_recup =saisie.getResponseText();
      SpreadsheetApp.getActiveSheet().getRange("J" + cellule.getRow()).setValue(lieu_recup)
    }
    else {
      var lieu_recup = feuille.getRange("J" + cellule.getRow()).getValues().toString();
         }

    // Envoyer le courriel
      MailApp.sendEmail({
        to: 'adresse mail 3',
        //cc :,
        subject: "Equipement " + feuille.getRange("B" + cellule.getRow()).getValues() + " disponible : panne résolue", // Objet ici
        name: "Gérant", // Votre nom ici
        body: "Bonjour, \nL\'équipement " + feuille.getRange("C" + cellule.getRow()).getValues() + " n° " + feuille.getRange("B" + cellule.getRow()).getValues() + " est disponible et peut être récupéré au " + feuille.getRange("J" + cellule.getRow()).getValues() + ". \n\nCordialement,\nGérant \n", // Corps du courriel ici
      })
      Logger.log("Envoyé") //

    SpreadsheetApp.getActiveSheet().getRange("K" + cellule.getRow()).setValue(Utilities.formatDate(new Date(), fuseauHoraire, "dd/MM/yyyy")); //Inscription dans la colonne K la date d'envoi du mail 

  }
}

Voilà grâce à ton aide j'ai pu réaliser ce code que je pensais beaucoup trop complexe pour mon niveau ! Encore merci, ça fait 3 fois que tu m'indiques les bonnes solutions

Bravo, c'est génial, tu passes en mode expert !

Rechercher des sujets similaires à "declencheurs via case cocher meme feuille possible"