web-dev-qa-db-ja.com

セル一致値を検索して行番号を返す

従業員シートには、セル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;

  }
21
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()を使用すると、実際には、処理に時間がかかり、スプレッドシートを照会するたびにオブジェクトを取得します。

私の例では、毎回1つのデータを取得するnクエリではなく、すべてのデータを取得する1つのクエリのみを作成しました。

ステファン

35
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
  }
}
1
Julian