在AppsScript中提取二维数组字符串时遭遇TypeError问题求助
问题分析与修复方案
错误根源
报错TypeError: Cannot read properties of undefined (reading 'length')的直接原因是循环起始索引越界:
在dropRowsFromLeadSheet函数中,循环写为for(var j = values.length; j>=0; j--),但数组的有效索引范围是0到values.length - 1。当j等于values.length时,values[j]返回undefined,此时访问undefined.length就会触发该错误。
修复步骤
- 修正循环起始索引:将循环起始值改为
values.length - 1,确保只访问数组内的有效索引。 - 规范变量声明:所有未声明的变量(如
id、values)添加var/let/const,避免全局变量冲突。 - 简化行号处理:
sheet.getLastRow()直接返回整数,无需转字符串再替换,直接使用即可。 - 修正空值判断逻辑:将
typeof array !== null改为array != null,因为typeof null的结果是object,原判断无法识别null或undefined。
修正后的完整代码
function CheckDNCList(string){ const id = 'SHEET2_ID'; const ss = SpreadsheetApp.openById(id); const sheet = ss.getSheets()[0]; const num_rows = sheet.getLastRow(); let ret_val = false; for (let i = 1; i < 3; i++){ const values = sheet.getRange(1, i, num_rows, 1).getValues(); for(let j = 0; j < values.length; j++){ if (values[j].includes(string)){ ret_val = true; } } } return ret_val; } function dropRowsFromLeadSheet(){ const ls_id = 'SHEET1_ID'; const ss = SpreadsheetApp.openById(ls_id); const sheet = ss.getSheets()[0]; const num_rows = sheet.getLastRow(); for (let i = 5; i < 7; i++){ const values = sheet.getRange(1, i, num_rows, 1).getValues(); // 修正循环起始索引为length-1 for(let j = values.length - 1; j >= 0; j--){ const array = values[j]; // 修正空值判断 if(array != null){ if(array.length === 1) { const string = array[0]; if(CheckDNCList(string)){ sheet.deleteRow(j + 1); // 表格行号从1开始,数组索引从0开始,需+1匹配正确行 } } } } } }
额外注意点
- 表格行号从1开始,而数组索引从0开始,删除行时要将数组索引
j加1,避免删除错误行。 - 使用
const声明无需修改的变量(如表格ID、表格对象),let声明需要修改的变量(如ret_val),提升代码可读性和安全性。
内容的提问来源于stack exchange,提问作者Patrick McGavick
相关产品推荐
相关产品推荐

