Méthode find, ajouter une condition si la valeur cherchée est trouvée

Bonjour,

Après avoir utilisé la méthode findNext pour rechercher des valeurs dans une plage de cellule (recherche qui fonctionne bien).

Je voudrais renvoyer la ligne correspondant à la valeur trouvée dans la plage lorsqu'elle existe (lorsqu'on a trouvé la valeur recherchée dans la plage).

pour cela j'ai essayé ce script avec la condition if, mais cela n'a pas marché.

 var recherche = plage.createTextFinder(trouve).matchEntireCell(true).findNext();
  if(!recherche = null){
 var ligne_matricule = recherche.getRow();
  }
  console.log(ligne_matricule)

Quelqu'un aurait-il une idée de solution svp ?

En vous remerciant par avance,

Bonjour,

Je pense que vous avez un problème de Scope dans votre Script. Vous définissez la variable ligne_matricule dans le bloc if. Donc en dehors de ce bloc, elle "n'existe pas". En tout cas elle n'est pas accessible.

Si c'est bien le problème, la correction est la suivante : déclarez votre variable en dehors du bloc, et assignez la dans le bloc.

Par exemple :

var recherche = plage.createTextFinder(trouve).matchEntireCell(true).findNext();
var ligne_matricule = "";

if(!recherche = null){
 ligne_matricule = recherche.getRow();
}

console.log(ligne_matricule)

Bonjour saboh12617,

Merci pour ton apport, j'ai réessayé en déclarant la variable hors bloc comme proposée mais cela ne marche toujours pas.

Salut,

J'ai testé, ça marche :

image image

Ah oui, c'est probablement la syntaxe "if(!recherche = null)" qui est incorrecte. Je crois qu'en javascript il faut 2 "==" et entourer avec des parenthèses… Ou bien utiliser directement !=. Mais à ce compte là, la solution de Pierre est plus propre je trouve.

Tu as raison j'ai corrigé par réflexe

Pour tester si une variable existe, dans notre cas "recherche", il existe plusieurs alternative :

  if(recherche){

Si recherche = true alors PASS

  if(recherche != null){

Si recherche est différent de NULL alors PASS

Bonjour,

Effectivement la solution de Pierre marche lorsqu'on n'itère pas la recherche dans une boucle. Dans mon cas le script est contenu dans boucle (désolé j'aurais du le préciser). Alors lorsque je débogue cela fonction jusqu'à l'itération où la valeur recherchée n'est pas trouvée. a cet itération, le script arrête de fonctionner. Voilà pourquoi j'ai décidé d'ajouter un bloc If pour que la recherche de la ligne ne se fasse uniquement au cas il y aurait une valeur trouvée.

var plage =sheet2.getRange(ligne_deb,col_plage,ligne_fin,col_plage)
  for ( i = 2; i <= derli1; i++)  {
   if (!sheet1.isRowHiddenByFilter(i)){
    var p = sheet1.getRange(i,numero).getValue();
    var r = sheet1.getRange(i,couleur).getValue();
      var matricule_recherche = p +" "+ r;
    console.log(matricule_recherche)
      var trouve = matricule_recherche;
  var recherche = plage.createTextFinder(trouve).matchEntireCell(true).findNext();
  if(recherche!=null){
 var ligne_matricule = recherche.getRow();
  }
  console.log(ligne_matricule)
    }
  }
}

En remplaçant "=" par "!=" comme proposée par Saboh, le script ne s'arrête plus. Mais lorsque la valeur recherchée n'est pas trouvée, au lieu passer à la recherche suivante, il renvoie la dernière valeur de ligne_matricule mémorisée, ce qui n'est pas correct.

Re,

A voir selon votre besoin final, mais pas de boucle nécessaire. J'ai lu ici Taking Advantage of TextFinder for Google Spreadsheet · GitHub que l'utilisation de map dans une arrowfonction vous permet d'extraire tous les résultats en 1 étape.

A adapter mais l'exemple 2 :

const searchText = "sample";
const sheetName = "Sheet1";
const rangeList = SpreadsheetApp.getActiveSpreadsheet()
  .getSheetByName(sheetName)
  .createTextFinder(searchText)
  .matchEntireCell(true)
  .findAll()
  .map((r) => r.getRow());
console.log(rangeList);

Me semble convenir (j'ai changé getRow c'est tout)

--------

Autrement, pour répondre exactement à votre dernier message, il faut ajouter un

else {
 break;
}

à votre if, puisque recherche == null indique que la recherche est terminée, donc il faut sortir de la boucle.

En fait pas besoin d'utiliser findAll parce que la valeur du matricule recherché est unique dans la plage (s'il existe). par contre il y'a plusieurs matricules à rechercher, l'un après l'autre dans la plage. D'où l'utilité de la boucle for.

Le problème est de trouve un script qui, lorsque le matricule n'est pas trouvé, ne se lance pas dans la recherche de la ligne correspondante mais saute pour recommence une nouvelle recherche avec un autre matricule (le matricule suivant dans la boucle for).

L'ajout de

else {
 break;
}

fais plutôt sortir de la boucle for, au premier matricule non trouvé, et ne recherche plus les autres matricules de la liste, ce qui n'est pas le résultat recherché.

J'ai partiellement copié ta fonction, j'itère bien plusieurs fois, dans mon cas "trouve" ne change pas, donc c'est toujours le même résultat :

image

Excusez moi, j'avais regardé cela un peu trop rapidement. Dans votre cas, vous pouvez, dans le else à la place de break affecter ligne_matricule à -1 (ou n'importe quelle valeur, comme vous le souhaitez), de manière à bien prendre en compte une ligne non trouvée (numéro de ligne = -1 => non trouvé) tout en continuant votre boucle.

Après je crois qu'en javascript les variables ne sont pas typées, donc vous pourriez aussi affeter ligne_matricule à "ligne non trouvé" ou null, suivant votre besoin. J'avais pris -1 car c'est la valeur classique que l'on prend pour indiquer qu'un nombre (positif) n'a pas été trouvé.

Bonjour

ça marche très bien Saboh.

Merci,

Rechercher des sujets similaires à "methode find ajouter condition valeur cherchee trouvee"