Effectuer une action en fonction du résultat d'une tickbox

Bonjour,

Une fois n'est pas coutume, je reviens vers vous car je bloque...

Globalement et pour expliquer le but, le sheet concerné me sert à traiter les prêts de matériel.

https://docs.google.com/spreadsheets/d/1clsBBaHXftBXimCepfCpO6EhhwKpjllsJweycsA7XHA/edit?usp=sharing

Ce que je souhaite, c'est que lorsque je clique sur mon bouton "DELIVER SELECTED", cela envoie un mail avec les infos du prêt à l'utilisateur concerné.

La partie mail est fonctionnelle mais pas implémentée dans ce fichier de test.

Là où je bloque, c'est que j'ai essayé de faire une boucle incrémentielle pour prendre les infos et envoyer le mail (en l'occurrence j'ai remplacé l'action d'envoyer un mail par effectuer une copie dans des cellules) pour chaque ligne jusqu'à la dernière ligne concernée cochée, et j'ai seulement la première ligne prise en compte...

Voici le code concerné:

// Deliver List A - BOUTON: "DELIVER SELECTED"

function deliverA() {

 var spreadsheet = SpreadsheetApp.getActive();
 var sheetDeliverA = spreadsheet.getSheetByName("Deliver List A");

//Début boucle-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 for (var i=9;i<=13;i++){

  var LoanToA = sheetDeliverA.getRange('C'+i).getValue();
  var MailA1 = sheetDeliverA.getRange('D'+i);
  var MailA2 = sheetDeliverA.getRange('E'+i).getValue();
  var LoanAssetA = sheetDeliverA.getRange('F'+i).getValue();
  var TickBoxA = sheetDeliverA.getRange('I'+i).getValue();

//Début condition 1_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  if(TickBoxA === true) {

//Début condition 2_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  if(MailA2 !== "") {
    MailAfull = MailA2;
  } else {
    MailAfull = MailA1;

//DEBUT MANIP A FAIRE (FUTUR ENVOI MAIL)-----------------------------------
  sheetDeliverA.getRange('L'+i).setValue(LoanAssetA);
  sheetDeliverA.getRange('M'+i).setValue(MailAfull);
  sheetDeliverA.getRange('N'+i).setValue(LoanByA);
  sheetDeliverA.getRange('O'+i).setValue(LoanToA);
//FIN MANIP A FAIRE-------------------------------------------------------- 

//Fin condition 2_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
};

//Fin condition 1_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
};

//Fin boucle-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
};

 Browser.msgBox("Loan(s) delivered successfully & mail(s) sent");
};

Pouvez-vous m'aider (encore et encore...)?

Bonjour,

j'ai une erreur : LoanByA n'est pas défini ! et donc a priori le script s'arrête là à la première occurrence.

Ah oui... pardon, comme j'ai pris cette partie du code de mon projet global j'ai oublié d'enlever cette variable. Je la retire de suite

Quand je lance le script, j'ai bien autant de résultats que de cases cochées !

J'ai trouvé où se situe mon souci (je n'avais pas tout mis dans le fichier partagé).

En fait, lorsqu'une ligne est sélectionnée dans la feuille "Deliver List A", il faut que je récupère d'autres données dans une autre feuille (ici "Reservation List").

Par exemple, si je sélectionne dans la "Deliver List A" la ligne de "HUGO Victor" et "VINCENT David", je veux récupérer depuis la "Reservation List" le "Course N", "Material type", "Master version", et "Reservation Date" pour ces même personnes.

Puis-je faire une boucle qui me recherche ces infos à l'intérieur de la boucle déjà existante?

C'est ce que j'ai tenté dans mon fichier principal (non-partagé) et il s'arrête à la première occurrence trouvée (ne continue pas avec les autres lignes cochées)...

pas la peine de faire une boucle, il suffit d'ajouter dans ton tableau

=iferror(query('Reservation List'!$A$1:$H;"select D,E,F where A='"& C9 &"' and B='"& $B$9 &"' ";0);"pas trouvé !")

que j'ai mis en colonne Q pour le moment

ET ... certaines personnes ne sont pas trouvées !!

C'est un bon début, merci.

Mais plutôt que d'utiliser une formule, je ne peux pas le scripter?

Car actuellement les datas récupérées sont copiées dans les colonnes, mais le but final est que ça récupère les valeurs (donc en variables) et que je construise un mail où j'intègre ces mêmes variables...

Et du coup ça paraît normal qu'une boucle à l'intérieur d'une autre boucle ne continue pas?

Mais plutôt que d'utiliser une formule, je ne peux pas le scripter?

J'ai par principe de toujours faire par formule quand je peux plutôt que par script. Pourquoi ? parce que le script s'exécute côté serveur et qu'il vaut mieux minimiser cette pratique sachant qu'en plus du temps du script il faut y ajouter les temps de transferts.

Et du coup ça paraît normal qu'une boucle à l'intérieur d'une autre boucle ne continue pas?

Non, on peut faire une boucle dans une boucle sans problème.

Et dans ton cas, il est même préférable de d'abord charger la table en mémoire car balayer à chaque pas d'une boucle la feuille par script peut amener des temps de réponses significatifs (au moins sensibles, voire rédhibitoires si la table est importante)

Je vais regarder ce point pour t'aider bien qu'il ne me plaise pas.

il faut indenter correctement un code pour qu'il soit lisible


pour charger les données de Reservation List

  var sheetReservationA = spreadsheet.getSheetByName("Reservation List")
  // ici je charge les données de Reservation List
  var reseravtionList = sheetReservationA.getDataRange().getValues();

il faudrait en faire de même Deliver List A pour éviter d'aller en continu chercher les infos dans la feuille


je ne comprends pas qu'on ne ferme pas ici ce que tu appelles la condition 2

      if(MailA2 !== "") {
        MailAfull = MailA2;
      } else {
        MailAfull = MailA1;
        // je ne comprends pas qu'on ne ferme pas ici
      }

... je continuerai plus tard car je m'y perds dans les données du fait du maque d'indentation

pour charger les données de Reservation List

  var sheetReservationA = spreadsheet.getSheetByName("Reservation List")
  // ici je charge les données de Reservation List
  var reseravtionList = sheetReservationA.getDataRange().getValues();

C'est ce que tu as fait ici, mais sans exploiter ni le lastRow, ni le tableau readingGender

      var readingGender = sheetReservationA.getRange("D1:D15").getValues();
      var lastRow = sheetReservationA.getLastRow();

par contre il ne faut pas le faire à chaque fois, mais une fois pour toutes.

N'ayant plus retrouvé le code sur lequel j'avais commencé à travailler ... je te laisse gérer la suite, d'autant que je ne vois pas les recommandations ci-dessus reprises..

Bonjour,

Désolé j'étais absent depuis pas mal de temps suite à des soucis.

Du coup je reprends mon script aujourd'hui seulement...

Déjà, merci beaucoup pour les retours. Je vais essayer de reprendre tout ça et je vous tiens au courant

En reprenant mes tests, en fait je m'aperçois que je n'ai que ma première ligne qui est traitée. Ma boucle ne continue pas ensuite pour la ligne 2, 3, etc... jusqu'à la dernière ligne complétée...;

Je dirais plutôt que le mail est envoyé 15 fois à la même personne ! parce que je crois que la boucle s'appuie sur la mauvaise page, mais comme le code n'est toujours pas indenté, ce n'est donc pas très lisible !

J'avais commencé à travailler sur un code qui a été effacé !

Je viens de faire des modifs et de refaire un test en essayant de commenter au mieux (le code est "Test2 du fichier Code") et effectivement le mail part plusieurs fois au même utilisateur...

Je ne trouve pas où ça coince :-(

Déjà une des raisons, est que les 2 boucles ont la même variable i ... et donc la seconde influe sur la première. Commence par changer cela.

Je viens de modifier mais idem... Ca envoi toujours autant de mails (même si je ne sélectionne qu'une seule ligne).

J'ai l'impression que le souci est au niveau de ma boucle n°2 imbriquée dans ma boucle n°1...

En fait je ne retourne pas au début de ma boucle n°1 mais reste à ma n°2...mais je ne pige pas pourquoi ça ne recommence pas au début

Commence par travailler tes boucles comme ceci (exécute la fonction dans l'éditeur de script)

function architecture() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheetDeliverA = spreadsheet.getSheetByName("Deliver List A");
  var sheetReservationA = spreadsheet.getSheetByName("Reservation List");
  var lastRow1 = sheetDeliverA.getLastRow();
  var lastRow2 = sheetReservationA.getLastRow();

  for (var i=9;i<=lastRow1;i++){
    var TickBoxA = sheetDeliverA.getRange('F'+i).getValue();
    var DeliveredA = sheetDeliverA.getRange('G'+i).getValue();

    if((TickBoxA == true) && (DeliveredA != 'Ok')){
      var LoanToA = sheetDeliverA.getRange('C'+i).getValue();

      Logger.log(LoanToA)

      for (var j=1;j<=lastRow2;j++){
        if (sheetReservationA.getRange('A'+j).getValue() == LoanToA) {
          var CourseNbA = sheetReservationA.getRange('B'+j).getValue();

          Logger.log(CourseNbA)

        }
      }

    }
  }
}

après tu remplis à l'intérieur des boucles

Désolé pour le temps passé depuis votre réponse mais j'ai dû laisser mon script de côté car beaucoup de boulot...

Ca a marché nickel!!! Je n'ai plus qu'à l'intégrer dans mon script global.

Encore mille mercis!!!!!!!!

Rechercher des sujets similaires à "effectuer action fonction resultat tickbox"