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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:13:11