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
相关产品推荐
相关产品推荐

