it-swarm.com.ru

Найти значение ячейки, совпадающее с номером возврата

Лист сотрудника содержит имя сотрудника в ячейке C2. Имя сотрудника также должно быть в техническом паспорте в диапазоне B3: B153.

Как я могу получить номер ячейки на листе данных, который соответствует имени сотрудника?

Я попробовал следующий скрипт, но он не работает.

  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

Вот код

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;
    }
  }
}

Когда вы хотите выполнить поиск такого типа, лучше получить данные с помощью sheet.getDataRange (). GetValues ​​(), потому что в этом случае вы получите данные в виде таблицы значений, это быстрее. Когда вы используете стандартный EmployeeSheet.getRange (2,3,1,1) .getValue (), фактически вы получаете объект, который требует больше времени для обработки и каждый раз, когда вы запрашиваете электронную таблицу.

В моем примере я сделал только один запрос, чтобы получить все данные, а не n запрос, чтобы получить один данные каждый раз.

Stéphane

29
St3ph

Я предпочитаю загружать все значения в массив один раз при открытии листа, а затем использовать Array.indexOf () для поиска индекса совпадающей строки. Я думаю, что это решение будет иметь меньше времени выполнения, чем другие решения.

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