Google Apps Script中getValues()获取数据indexOf匹配日期返回-1
问题描述
调用工作表getRange().getValues()方法获取指定范围数据时,日志输出的处理后数据没有方括号[]包裹,只有手动创建的数组能正常操作。需要使用indexOf方法定位特定日期,实际业务中待匹配的日期也从工作表提取。
测试代码如下:
function testArray() { var rowTwoDates = playgroundSheet.getRange(2, 59, 1, 5).getValues(); var strippedRowTwoDates = rowTwoDates[0].map(stripTime); Logger.log('array: ' + strippedRowTwoDates); Logger.log('indexOf: ' + strippedRowTwoDates[0].indexOf("06/09/2022")); var scores = [10, 20, 30, 10, 40, 20]; Logger.log(scores); Logger.log(scores.indexOf(30)); }
运行日志:
9:38:23 AM Notice Execution started 9:38:24 AM Info array: 06/07/2022,06/08/2022,06/09/2022,06/10/2022,06/11/2022 9:38:24 AM Info indexOf: -1 9:38:24 AM Info [10.0, 20.0, 30.0, 10.0, 40.0, 20.0] 9:38:24 AM Info 2.0 9:38:24 AM Notice Execution completed
原因分析
- 日志无方括号不代表返回值不是标准数组:使用
'array: ' + strippedRowTwoDates的写法做日志输出时,JS会自动调用数组的toString()方法,将数组元素按逗号拼接为纯字符串,不会保留方括号格式。手动创建的scores数组是直接传入Logger.log(),日志方法会序列化输出完整数组结构,二者只是打印逻辑不同,和数组本身结构无关。 indexOf返回-1是数组层级取值错误:getValues()返回的是二维数组,结构为[[单元格1值, 单元格2值, ...]],执行rowTwoDates[0].map(stripTime)后得到的strippedRowTwoDates已经是存储所有日期字符串的一维数组。后续代码写strippedRowTwoDates[0].indexOf(),实际是取出数组第一个元素(即字符串"06/07/2022"),在这个单个字符串里查找"06/09/2022"子串,自然匹配失败返回-1。
修复方法
删除indexOf调用前多余的[0]取值,直接对处理好的一维日期数组调用方法即可:
function testArray() { var rowTwoDates = playgroundSheet.getRange(2, 59, 1, 5).getValues(); var strippedRowTwoDates = rowTwoDates[0].map(stripTime); Logger.log('array: ' + strippedRowTwoDates); // 修正层级,直接对一维数组调用indexOf Logger.log('indexOf: ' + strippedRowTwoDates.indexOf("06/09/2022")); var scores = [10, 20, 30, 10, 40, 20]; Logger.log(scores); Logger.log(scores.indexOf(30)); }
排查提示:不确定数组结构时,直接将数组变量传入Logger.log(),不要做字符串拼接,即可看到完整的数组结构、元素类型,避免层级判断错误。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

