You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script 从垂直范围获取行索引返回-1解决方法

问题背景

需要实现从指定垂直范围获取匹配值对应行号的功能,参考水平范围示例修改代码后,匹配结果始终返回错误值-1,初步判断问题出在范围取值和索引查找的代码段。

原问题代码
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
}

function onEdit(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ITEMS"); 
  var activeCell = ss.getActiveCell();

  if(activeCell.getColumn() == 2 && activeCell.getRow() > 1){
    var makes = datass.getRange( 2, 2, datass.getLastRow(), 1).getValues();
    var makeIndex = makes[0].indexOf(activeCell.getValue());

    Logger.log(activeCell.getValues());
    Logger.log(makes[0]);
    Logger.log(makeIndex);

    ss.getRange("E10").setValue(makeIndex);
  }
}
错误原因

问题定位准确,错误来自对getValues()返回数组结构的认知偏差:

  • getValues()始终返回二维数组,结构为[行索引][列索引],索引从0开始计数
  • 你选取的是B列从第2行开始的单列垂直范围,返回的数组结构是[[B2单元格值], [B3单元格值], [B4单元格值], ...],每个子数组对应单独一行的单列数据
  • 代码中makes[0]仅取到范围第一行(即B2单元格)对应的单元素数组,遍历范围只覆盖B2一个单元格,匹配不到其他行内容时自然返回-1。
修复方法

先把垂直单列的二维数组拍平为一维数组,再做值匹配即可。注意匹配返回的索引从0开始计数,要得到工作表内的实际行号,需要给索引值加2(取值范围从第2行起始)。
修复后的核心代码段:

// 取B列从第2行到最后一行的范围,将二维单列数组转为一维数组
var makes = datass.getRange(2, 2, datass.getLastRow() - 1, 1).getValues().flat();
// 查找匹配值的索引
var makeIndex = makes.indexOf(activeCell.getValue());
// 若需获取工作表实际行号,使用 makeIndex + 2 即可

注意:如果取值范围内存在重复匹配值,indexOf只会返回第一个匹配项的索引。


内容的提问来源于stack exchange,提问作者mr.dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:36:18