Google Apps Script:如何用indexOf()纵向搜索数组查找用户许可组合?
问题:Google Apps Script二维数组查找失败的解决方案
我用Google表格做数据库,A4单元格通过公式统计条目数量。之前用嵌套for循环搜索数据速度太慢,于是尝试把第12列的所有数据存入数组,想用indexOf()查找用户邮箱与所选选项组合的key,但一直返回-1搜索失败。查资料得知indexOf()仅适用于一维数组,调试后仍未解决,求可行方案。
原代码:
// get the data var spreadsheet = SpreadsheetApp.openByUrl("SHEETURL"); var permitssheet = spreadsheet.getSheetByName('permits'); var int_uptally = permitssheet.getRange("A4").getValue(); var ar_permitsdatablock = permitssheet.getRange(4,12,int_uptally,1).getValues(); // prepare the response codestring = "Add permit - checking for an existing permit - "; // do the search var key = e.parameter.selecteduseremail + "~" + e.parameter.selectedoption; var permitkeyfound = ar_permitsdatablock[1].indexOf(key); // send the result back codestring = codestring + "Block [0]"; codestring = codestring + ar_permitsdatablock[0]; codestring = codestring + "<br>"; codestring = codestring + "Block [1]"; codestring = codestring + ar_permitsdatablock[1]; codestring = codestring + "<br>"; codestring = codestring + key; codestring = codestring + " - key found at = "; codestring = codestring + permitkeyfound; codestring = codestring + "<br>";
解决方案:
1. 将二维数组转为一维数组(最直接)
getValues()返回的是二维数组(每一行对应一个子数组,哪怕是单列),所以先把数组扁平化:
// 修改数组获取行,添加.flat() var ar_permitsdatablock = permitssheet.getRange(4,12,int_uptally,1).getValues().flat(); // 之后直接在一维数组上查找 var permitkeyfound = ar_permitsdatablock.indexOf(key);
扁平化后数组就变成了[value1, value2, value3...],indexOf()就能正常工作。
2. 用findIndex()遍历二维数组
如果不想转一维数组,直接用数组方法遍历每行的元素:
var permitkeyfound = ar_permitsdatablock.findIndex(row => row[0] === key);
这个方法会遍历二维数组的每一行,对比每行的第一个元素(因为你取的是单列)和目标key,找到返回对应行索引,没找到返回-1。
3. 优化行数获取(可选)
依赖A4单元格的统计数容易出错,建议直接用表格的有效行数计算:
// 从第4行开始,所以总行数减3 var int_uptally = permitssheet.getLastRow() - 3;
这样不需要依赖单元格公式,数据更可靠。
原代码问题说明
你之前的ar_permitsdatablock[1].indexOf(key)只在第二行的子数组里查找,而不是整个列的所有行。而且二维数组的每个元素都是长度为1的子数组,直接用indexOf()在二维数组上无法匹配到目标值,必须先处理成一维结构或者遍历每行元素。
内容的提问来源于stack exchange,提问作者Jukebox Jory
相关产品推荐
相关产品推荐

