Google apps script 查找单元格匹配值并返回Rownumber

Google apps script 查找单元格匹配值并返回Rownumber,google-apps-script,google-sheets,row-number,Google Apps Script,Google Sheets,Row Number,员工工作表包含单元格C2中的员工姓名。员工的姓名也应在数据表上的B3:B153范围内 如何获取数据表中与员工姓名匹配的单元格的行号 我尝试了以下脚本,但似乎不起作用 var Sheet = SpreadsheetApp.getActive(); var Employeesheet = Sheet.getSheetByName('Employee') var DataSheet = Sheet.getSheetByName('Data'); var Column = Sheet.g

员工工作表包含单元格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;

  }
这是密码

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;
    }
  }
}
函数rowOfEmployee(){
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data=sheet.getDataRange().getValues();
var employeeName=sheet.getRange(“C2”).getValue();

对于(var i=0;i我更喜欢在打开工作表时将所有值加载到数组中一次,然后使用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
  }
}

由于googleappscript是一个JavaScript平台,我可以想出另外两种方法来获取行索引,因为它们是内置的数组方法,所以速度可能会快一些

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

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

为了了解哪种方法更快,我在22000行数据的列上运行了这两种方法和公认的anwer方法数次。平均值如下所示:

  • 对循环使用
    (来自接受的答案):2.66ms
  • 使用
    Array.prototype.forEach
    :11.75ms
  • 使用
    Array.prototype.findIndex
    :2.00ms

我猜
Array.prototype.forEach
并不是用来查找匹配项的索引;它是为这个目的而设计的
Array.prototype.findIndex
,我今天遇到了这个问题,我找到了一个本地方法来完成这项工作

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

  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());
  }
var spreadsheet=SpreadsheetApp.getActive();
var tosearch=“要搜索的文本”;
var tf=电子表格.createTextFinder(tosearch);
var all=tf.findAll();
对于(变量i=0;i
我收到一个错误:Errortype:无法从未定义中读取属性“1”。你知道我如何解决它吗?脚本必须从电子表格中的脚本启动,而不是独立脚本。如果独立脚本更改var sheet=SpreadsheetApp.openById(“IDofSpreadsheet”);抱歉var sheet=SpreadsheetApp.openById(“IDofSpreadsheet”).getSheetByName(“图纸名称”);谢谢您的帮助!我有一个类似的要求,但是,在我的情况下,data.length可以达到数千,并且我需要在脚本中搜索相同范围内的许多字符串。是否有任何方法可以使其更快,并且可能以更少的处理负载运行?我想测试一下,因为我希望以最快的方式实现这一点使用indexOf不是最快的方法,而公认的解决方案是两种方法中最快的方法。我认为这里的问题在于,您需要通过映射或减少数据列,将其转换为一维数组,就像您之前在这里做的那样你可以使用indexOf,我相信这会破坏使用indexOf来查找搜索值所在的行号的目的。indexOf不是只得到第一个实例吗?
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
}
  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());
  }