Подтвердить что ты не робот

Найти соответствие ячейки и вернуть номер

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

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

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

  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;

  }
4b9b3361

Ответ 1

Здесь код

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

Ответ 2

Я предпочитаю загружать все значения в массив один раз при открытии листа, а затем использовать 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
  }
}

Ответ 3

Джулиан, мне очень нравится то, что ты здесь делаешь. Но, будучи NOOB в сценариях приложений, я изо всех сил пытаюсь изменить то, что вы делаете, чтобы соответствовать моим потребностям, но я понимаю, что вы делаете, это путь, по которому я хочу идти.

Для активной электронной таблицы мне нужно найти индекс столбца (в первых 3 строках), который содержит значение "Unit #".

В конечном итоге я пытаюсь предоставить пункт меню "Сортировать по единице №", который будет запускать сценарий, и отсортировать диапазон ячеек из A1: (последний диапазон значений) по найденному номеру столбца, содержащему "Блок № ":

Вот что я пока имею:

function sortByUnit2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  updateValues(sheet);
  var columnName = "Unit #";
  var columnIndex = findValue(columnName)
  var range = sheet.getDataRange();

  var cl = Sheet.getRange(fieldName).getColumn();
    // Sorts by the values in column c1
    range.sort([{column: columnIndex, ascending: true}]);
  }        

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

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
  }