JavaScript for...of遍历对象数组多执行一次触发catch报错问题
问题原因
- 你的
objArr是稀疏数组:数组的length属性为6,但索引为5的位置是空位,for...of遍历稀疏数组时空位会被解析为undefined,所以会多执行一次循环,当尝试读取undefined的sender属性时就会触发报错。 - 出现稀疏数组的常见场景:数组在赋值时跳过了某个索引、上游接口返回的原始数据异常、手动修改过数组
length属性等。
解决方案
快速修复:过滤无效元素
遍历数组前先过滤掉空值,直接跳过不存在的元素即可解决报错:
// 修改遍历逻辑,过滤掉undefined、null等无效项 for(let obj of objArr.filter(Boolean)) { // 原有写入逻辑不变 }
如果不想修改遍历逻辑,也可以在循环内加判断:
for(let obj of objArr) { // 遇到空项直接跳过本轮循环 if (!obj) continue; // 原有写入逻辑不变 }
优化方案:批量写入提升性能
你当前的代码每次循环都调用getRange和setValue,属于单单元格逐个写入,在Google Apps Script中执行效率极低,还容易触发接口配额限制。建议先把所有数据拼接为二维数组,一次性写入表格:
// 过滤空项后批量构建写入数据 const writeData = objArr.filter(Boolean).map(obj => { return keys.map(key => obj[key]) }) // 一次性写入整个范围:第2行第1列开始,共writeData.length行,keys.length列 activeSheet.getRange(2, 1, writeData.length, keys.length).setValues(writeData)
该方案不仅能避免空项报错,还能将写入速度提升数十倍,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者R Greenstreet
相关产品推荐
相关产品推荐

