Fonction FILTER mais en script

Bon ben...il n'aura pas fallu longtemps pour que je revienne solliciter l'aide de la communauté :-)

Mon souci est le suivant : je voudrais scripter la formule suivante: =SI(D17="";"";(FILTER(DATAS!B2:B500;DATAS!A2:A500=D17)))

En fait, je dispose d'une feuille "planning", dans laquelle j'ai dans la colonne "D" les codes de compagnies aériennes (en jaune).

image

Je voudrais que pour chaque ligne, le code de la compagnie soit "traduit" avec le nom de la compagnie dans la colonne "E" (en vert) en me basant sur un tableau comparatif (dans une autre feuille nommée "DATAS").

image

Si je mets la formule donnée précédemment dans chaque cellule de ma colonne "E" de la feuille "planning", cela fonctionne nickel, mais je voudrais éviter de mettre une formule dans les cellules => d'où ma demande de convertir en script cette formule.

Sauf que je ne suis pas doué et mon script (ci-dessous) ne fonctionne pas...

// Tri des Company

function company() {

var spreadsheet = SpreadsheetApp.getActive();
var sheetdatas = spreadsheet.getSheetByName("DATAS");
var sheetplanning = spreadsheet.getSheetByName("MASTER_sheet");

var lastRowMeansP1 = sheetplanning.getLastRow();
var lastRowDatas = sheetdatas.getLastRow();
var List = sheetdatas.getRange('A2:B'+lastRowDatas).getValues();

console.log(List);

for (var x=1;x<=lastRowMeansP1;x++){
 var CompanyCode = sheetplanning.getRange('D'+x).getValue();
 if (CompanyCode == ""){
 } else {
  var Companyname = List.filter(function(result){
    return result.Companyname == CompanyCode;
  });

 console.log(Companyname);

 }
}
}

Je pense que mon souci vient du fait que dans mon script je n'indique pas mes colonnes où effectuer les recherches dans ma feuille "DATAS"....

Pouvez-vous m'apporter (encore) votre aide précieuse?

ok je regarderai, néanmoins pourquoi ceci :

je voudrais éviter de mettre une formule dans les cellules => d'où ma demande de convertir en script cette formule.

car tu pourrais mettre en E16 (je dis bien 16 et non 17)

 ={"Company name";arrayformula(iferror(vlookup(D17:D,DATAS!A:B,2,0)))}

pas testé mais cela devrait fonctionner ...

Je voudrais éviter de mettre des formules dans des cellules de cette feuille car j'ai des collègues bidouilleurs (mais qui ne connaissent pas l'App script :-) ) et je ne peux pas augmenter le niveau de sécurité du classeur car sinon j'ai d'autres actions qui ne fonctionnent plus...

ceci suppose que la liste soit organisée comme un json

  var Companyname = List.filter(function(result){
    return result.Companyname == CompanyCode;
  });

il faut donc transformer List en un json

  List.forEach((r, i) => {
    json[i] = {}
    json[i].code = r[0]
    json[i].nom = r[1]
  })

et l'utiliser ensuite, la correction serait donc

function company() {

  var spreadsheet = SpreadsheetApp.getActive();
  var sheetdatas = spreadsheet.getSheetByName("DATAS");
  var sheetplanning = spreadsheet.getSheetByName("MASTER_sheet");

  var lastRowMeansP1 = sheetplanning.getLastRow();
  var lastRowDatas = sheetdatas.getLastRow();
  var List = sheetdatas.getRange('A2:B' + lastRowDatas).getValues();
  var json = []
  List.forEach((r, i) => {
    json[i] = {}
    json[i].code = r[0]
    json[i].nom = r[1]
  })

  for (var x = 1; x <= lastRowMeansP1; x++) {
    var CompanyCode = sheetplanning.getRange('D' + x).getValue();
    if (CompanyCode == "") {
    } else {
      var Companyname = json.filter(function (result) {
        return result.code == CompanyCode;
      });
      sheetplanning.getRange('E' + x).setValue(Companyname[0].nom);
    }
  }

}

bon, ce n'est pas la méthode la plus rapide, voir la suivante en travaillant avec des arrays

function company() {

  var spreadsheet = SpreadsheetApp.getActive();
  var sheetdatas = spreadsheet.getSheetByName("DATAS");
  var sheetplanning = spreadsheet.getSheetByName("MASTER_sheet");

  var lastRowMeansP1 = sheetplanning.getLastRow();
  var lastRowDatas = sheetdatas.getLastRow();
  var List = sheetdatas.getRange('A2:B' + lastRowDatas).getValues();
  var json = []
  List.forEach((r, i) => {
    json[i] = {}
    json[i].code = r[0]
    json[i].nom = r[1]
  })

  var compagnies = []
  sheetplanning.getRange('D2:D' + lastRowMeansP1).getValues().forEach(r => {
    var CompanyCode = r[0];
    if (CompanyCode == "") {
    } else {
      var Comp = json.filter(function (result) {
        return result.code == CompanyCode;
      });
      try { 
        console.log(Comp[0].nom)
        compagnies.push([Comp[0].nom]) 
      } catch (e) { compagnies.push([e]) };
    }
  })
  sheetplanning.getRange(2,5, compagnies.length, 1).setValues(compagnies);
}

cela dit, je ne suis pas fana de filter, j'aurais préférer map

Oups j'avais oublié de clôturer ce sujet :-)

Merci pour l'aide précieuse

Rechercher des sujets similaires à "fonction filter script"