如何修复基于筛选向所有Google Sheets动态传输数据的代码错误
报错原因
- 当某只股票对应的工作表在History1表中没有匹配到对应行数据时,存储匹配结果的数组
oA为空,此时调用oA[0].length读取数组元素属性会触发未定义错误 - 如果你没有预先实现
getColumnHeight自定义函数,也会额外触发函数未找到的报错
修正后完整代码
// 拆分History1数据到对应股票工作表 function split_history() { const ss = SpreadsheetApp.getActive(); const hsh = ss.getSheetByName("History1"); // 先判断History1是否有有效数据 if(hsh.getLastRow() < 2) return; const hvs = hsh.getRange(2,1,hsh.getLastRow() -1,9).getValues(); const shts = ss.getSheets(); const excl = ["Summary","History1","Main Menu"]; shts.forEach(s => { let oA = []; if(!~excl.indexOf(s.getName())) { hvs.forEach(r => { if(s.getName() == r[0]) { oA.push(r.slice(0,8)); } }); // 仅当匹配到数据时执行写入 if(oA.length > 0) { s.getRange(getColumnHeight(1,s,ss) + 1,1,oA.length,oA[0].length).setValues(oA); } } }); } // 补充getColumnHeight工具函数实现,你如果已有该函数可删除这段 function getColumnHeight(col, sheet, ss) { const range = sheet.getRange(sheet.getLastRow(), col); if(range.getValue() !== "") return sheet.getLastRow(); const values = sheet.getRange(1, col, sheet.getLastRow()).getValues(); for(let i = values.length - 1; i >= 0; i--) { if(values[i][0] !== "") return i + 1; } return 0; }
修改说明
- 新增
oA非空校验,只有匹配到对应数据时才触发写入操作,彻底解决空数组访问报错问题 - 新增History1表有效数据校验,当表中只有表头没有录入数据时直接终止运行,避免范围取值报错
- 补充了
getColumnHeight工具函数的完整实现,如果你之前已经定义过该函数可以直接删除对应代码段
内容的提问来源于stack exchange,提问作者Ali Ahmer Rahil
相关产品推荐
相关产品推荐

