it-swarm.com.de

Finden Sie den passenden Wert für die Zelle und geben Sie die Rownumber zurück

Das Mitarbeiterblatt enthält den Namen des Mitarbeiters in Zelle C2. Der Name des Mitarbeiters sollte auch auf dem Datenblatt im Bereich B3: B153 stehen.

Wie kann ich die mit dem Namen des Mitarbeiters übereinstimmende Nummer der Zelle im Datenblatt erhalten?

Ich habe das folgende Skript ausprobiert, aber es scheint nicht zu funktionieren.

  var Sheet = SpreadsheetApp.getActive();
  var Employeesheet = Sheet.getSheetByName('Employee')
  var DataSheet = Sheet.getSheetByName('Data');
  var Column = Sheet.getRange(3,2,151,1);
  var Values = column.getValues(); 
  var Row = 0;

  while ( Values[Row] && Values[Row][0] !=(EmployeeSheet.getRange(2,3,1,1).getValue()) ) {
    Row++;
  }

  if ( Values[Row][0] === (EmployeeSheet.getRange(2,3,1,1).getValue()) ) 
    return Row+1;
  else 
    return -1;

  }
17
LennartB

Hier der Code

function rowOfEmployee(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var employeeName = sheet.getRange("C2").getValue();
  for(var i = 0; i<data.length;i++){
    if(data[i][1] == employeeName){ //[1] because column B
      Logger.log((i+1))
      return i+1;
    }
  }
}

Wenn Sie diese Art von Lookup durchführen möchten, ist es besser, Daten mit sheet.getDataRange (). GetValues ​​() abzurufen, da in diesem Fall Daten als Wertetabelle schneller angezeigt werden. Wenn Sie den Standard EmployeeSheet.getRange (2,3,1,1) .getValue () verwenden, rufen Sie tatsächlich ein Objekt ab, das mehr Zeit benötigt, um verarbeitet zu werden, und jedes Mal, wenn Sie die Tabelle abfragen.

In meinem Beispiel habe ich nur eine Abfrage ausgeführt, um alle Daten abzurufen, statt eine Abfrage, um jedes Mal eine Daten abzurufen.

Stéphane

29
St3ph

Ich ziehe es vor, alle Werte einmal in ein Array zu laden, wenn das Blatt geöffnet wird, und dann mit Array.indexOf () den Index der übereinstimmenden Zeichenfolge nachzuschlagen. Ich denke, diese Lösung wird weniger Ausführungszeit haben als andere Lösungen.

function updateValues(){
  dataRangeSearch = activeSheet.getRange(1,1,activeSheet.getLastRow());
  dataSearch = dataRangeSearch.getValues().reduce(function (a, b) {
    return a.concat(b);
  });;
}
updateValues();

function findValue(fieldName){
  var row = dataSearch.indexOf(fieldName);
  if (row == -1){ // Variable could not be found
    SpreadsheetApp.getUi().alert('I couldn\'t find field name "'+fieldName+'"');
    return "";
  } else {
    return activeSheet.getRange(row+1,2).getValue(); //Return the value of the field to the right of the matched string
  }
}
0
Julian