找到细胞匹配值并返回Rownumber

时间:2015-09-14 13:17:17

标签: google-apps-script google-sheets google-docs row-number

员工表包含单元格C2中员工的姓名。员工的姓名也应该在B3:B153范围内的数据表中。

如何在数据表中获取与员工姓名匹配的单元格的rownumber?

我尝试了以下脚本,但它似乎无法正常工作。

  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;

  }

4 个答案:

答案 0 :(得分:32)

这里是代码

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 :(得分:2)

由于Google App Script是一个JavaScript平台,因此我可以想到另外两种获取行索引的方法。可能会更快一些,因为它们是内置的Array方法。

方法1:使用Array.prototype.forEach()

function getRowIndexUsingforEach(){
  let term = 'user-1700@example.com';
  var data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1, 2000).getValues();
  data.forEach((val, index) => {
     if(val == term){
         Browser.msgBox(index+1); //because Logger.log() takes too long
     }               
  })
}

方法2:使用Array.prototype.findIndex()

function getRowUsingfindIndex(){
  let term = 'user-1700@example.com';
  let data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1, 2000).getValues();
  let row = data.findIndex(users => {return users[0] == term});  
  Browser.msgBox(row+1); //because Logger.log() takes too long
}

要查看哪种方法更快,我对22000行数据的列运行了这两种方法和公认的anwer方法几次。平均值如下:

  • 使用for loop(来自已接受的答案):2.66ms
  • 使用Array.prototype.forEach:11.75毫秒
  • 使用Array.prototype.findIndex:2.00毫秒

我猜Array.prototype.forEach并不意味着找到比赛的索引; Array.prototype.findIndex是为此目的而设计的

答案 2 :(得分:2)

我今天遇到了这个问题,我找到了一种本机的方法来完成这项工作。

以下是要测试它是否适合您的代码段:

  var spreadsheet = SpreadsheetApp.getActive();
  var tosearch = "your text to search";
  var tf = spreadsheet.createTextFinder(tosearch);
  var all = tf.findAll();
  
  for (var i = 0; i < all.length; i++) {
    Logger.log('The sheet %s, cell %s, has the value %s.', all[i].getSheet().getName(), all[i].getA1Notation(), all[i].getValue());
  }

答案 3 :(得分:1)

我更喜欢在打开工作表时将所有值加载到数组中,然后使用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
  }
}