Boucle Ligne Collone

Bonjour à tous.

Je recherche à ajouter des notes selon des conditions spécifiques. Malheureusement, je ne pense pas utiliser la bonne méthode, car les délais de traitement sont excessivement longs.

Je pense que je n'utilise pas la bonne méthode.

Avez vous des conseils pour moi ?

Merci d'avance pour le temps accordé.

Cordialement.

function Remarque_401_410() {
var classeur = SpreadsheetApp.getActiveSheet();
var recherche = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BO');
// Effacement des notes du classeur 
var range1 = classeur.getRange("B20:BQ29");
range1.clearNote();
// Boucles sur les lignes définit.
for (var i = 8;i<18; i++ )
  {
    //Boucles sur les collones définit.
    for  (var l = 2;l<62; l++)
    {
          // Si la valeur de la cellule = N
          if (classeur.getRange(i,l).getValue() === 'N')
          {
          //Recuperation de la valeur 1 de la ligne
          var zone = classeur.getRange(i,1).getValue();
          //Recuperation de la valeur 1 de la collone
          var rang = classeur.getRange(7,l).getValue();
          //Recherche Article
          var lastligne = recherche.getLastRow();
                  for (var n = 2; n<= lastligne; n++)
                  {
                    // ICI RECHERCHE

                    if (recherche.getRange(n,4).getValue() === zone & recherche.getRange(n,5).getValue() === rang)
                    {
                      //var datayoupi = recherche.getRange(n,1).getValue();
                      classeur.getRange(i +12,l).setNote(recherche.getRange(n,1).getValue());

                    }
                  }
          }
    }
  }

}

Bonjour,

1-

tu mets ceci dans la boucle

var lastligne = recherche.getLastRow();

donc c'est répété à chaque fois, il faut le mettre avant la première boucle car la valeur trouvée ne change ni en fonction de i, ni en fonction de l

2-

tu mets ceci dans la boucle de l

var zone = classeur.getRange(i, 1).getValue();

il faut mettre cela en dehors de cette boucle de l, mais tout en la mettant dans la boucle i car la valeur dépend de i

nota, évite la lettre l qui se confond avec le chiffre 1

3-

le plus chronophage est le fait de faire des allers/retours entre la feuille et le script, par exemple

classeur.getRange(i, l).getValue()

il faut capter les données en une seule fois avant les boucles

var data = classeur.getRange('ta_plage').getValues() // avec un S au bout

et ensuite aller chercher les données dans data ... data est un tableau à 2 dimensions qui s'écrit comme ceci

data[ligne][colonne]

où ligne n'est pas égal à i car ligne ici commence à 0, idem pour colonne

Merci pour votre réponse.

Si je comprend bien il me faut créer un tableau a deux dimension.

Je fait donc ma boucle sur mon tableau et non pas sur les lignes et colonne du classeur d'origine.

Je doit maintenant parcourir mon tableau pour tester chaque valeur ?

projet sans titre editeur de projet apps script google chrome

Si je comprend bien il me faut créer un tableau a deux dimension.

Je fait donc ma boucle sur mon tableau et non pas sur les lignes et colonne du classeur d'origine.

Je doit maintenant parcourir mon tableau pour tester chaque valeur ?

oui,

la création du tableau est automatique avec

var data = classeur.getRange('ta_plage').getValues() 

Bonjour, Merci pour votre aide.

Voici l'évolution du script avec votre aide.

Il faut maintenant que je recherche dans le second tableau de donnée

function Remarque_401_410() {

var classeur = SpreadsheetApp.getActiveSheet();
var recherche = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BO');
var debutzone =8;
var debutRang =2;
var lastligne = recherche.getLastRow();
classeur.getRange("B20:BQ29").clearNote();

var data = classeur.getRange('B8:BQ17').getValues();
var datasearch = recherche.getRange('A2:E' + lastligne).getValues();

for (i = 0 ;i <data.length;i++) 
  {
    for (k = 0;k<data[i].length;k++)
    {
    var zone = classeur.getRange(i+ debutzone,1).getValue();
        if (data[i][k] ==='N')
        {
          var rang = classeur.getRange(7,k+ debutRang).getValue();
          // RECHERCHE DANS LE DATASEARCH
            for (b = 0;b< data.length;b++)
            {
              if (datasearch[b][3] === zone & datasearch[b][4] === rang)
              {
                var test = datasearch[b][0];
                classeur.getRange(i + 20,k+2).setNote(test);
              }
            }

        }
    }
  }
}

Bravo, pas mal ... pour le reste si tu as besoin d'aide je suis là.

Attention à doubler & ici

if (datasearch[b][3] === zone && datasearch[b][4] === rang)

et si c'est encore trop long, on peut utiliser https://developers.google.com/apps-script/reference/spreadsheet/range#setnotesnotes à la place de

classeur.getRange(i + 20,k+2).setNote(test)

c'est le même principe, les notes seront emmagasinées dans un tableau et déverser en bloc à la fin

Bonsoir,

Merci pour vos encouragement.

C'est effectivement plus rapide.

Petite question cependant.

Au lieu de bouclé sur le tableau datasearch y a t'il un moyen de le parcourir avec des critères pour accélérer le script ?

Cordialement

je n'ai pas bien saisi comment tu balayes datasearch car tu écris

for (b = 0;b< data.length;b++)

est-ce que cela ne devrait pas être

for (b = 0;b< datasearch.length;b++)

pour accélérer, il y a 2 moyens :

Bonsoir.

Oui j'avais bien corrigé data par datasearch.

Je regarde a coté du break.

merci.

Bonjour,

Pour information j'ai regardé du coté de la fonction filter. Mais hélas sans gain significatif dans les performances.

function Remarque() 
{
var classeur = SpreadsheetApp.getActiveSheet();
var recherche = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BO');
var debutzone =3;
var debutRang =2;
var lastligne = recherche.getLastRow();
classeur.getRange("B15:BQ24").clearNote();
var data = classeur.getRange('B3:BQ12').getValues();
var datasearch = recherche.getRange('A2:E' + lastligne).getValues();
  for (i = 0 ;i <data.length;i++) 
    {
      for (k = 0;k<data[i].length;k++)
      {
      var zone = classeur.getRange(i+ debutzone,1).getValue();
        if (data[i][k] ==='N')
        {
        var rang = classeur.getRange(2,k+ debutRang).getValue();
        var resultdatasearch = datasearch.filter(function(e){return e[3] ==zone && e[4]==rang});
        classeur.getRange(i+15,k+2).setNote(resultdatasearch[0][0]);
        }
      }
    }
}
Rechercher des sujets similaires à "boucle ligne collone"