使用splice移除二维数组指定元素时遇ReferenceError错误求助
问题解决:ReferenceError: array1 is not defined 及代码优化
错误根源
array1未定义的核心原因是工作表获取失败:你同时用openByUrl打开目标表格,又用getActiveSpreadsheet()去获取工作表,若当前激活的表格不是目标表格,sheet会返回null,后续sheet.getRange()执行出错,导致array1无法初始化。
除此之外代码还有几个隐性问题:
- 数组索引越界:
currentCellRowIndex是电子表格行号(从1开始),但数组索引从0开始,array1[currentCellRowIndex]会直接访问不存在的位置。 splice会修改原数组,无法生成你需要的副本。getRange参数逻辑错误:getRange(6,2,currentCellRowIndex,6)会从第6行开始取currentCellRowIndex行数据,当当前行小于6时,取数范围无效。
修复后的代码
/** * @customfunction */ function custom_function5() { // 直接用目标表格对象获取工作表,避免上下文冲突 var spreadSheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/16li86UxKwDl4LUzgEdpfWdbZuDYcZ0t-adNJN56-bzQ/edit?pli=1#gid=0'); var sheet = spreadSheet.getSheetByName("Scratch Pad"); // 提前检查工作表是否存在 if (!sheet) { throw new Error("找不到名为 'Scratch Pad' 的工作表"); } var currentRow = SpreadsheetApp.getCurrentCell().getRow(); var currentCol = SpreadsheetApp.getCurrentCell().getColumn(); // 修正取数范围:从第6行到当前行,最多取currentRow-5行(若currentRow<6则取1行) var rowCount = Math.max(currentRow - 6 + 1, 1); var array1 = sheet.getRange(6, 2, rowCount, 6).getValues(); Logger.log("原始数组: " + JSON.stringify(array1)); // 转换为数组索引(从第6行开始,所以减6) var targetArrayRow = currentRow - 6; // 边界处理:当前行不在取数范围内时直接返回原数组 if (targetArrayRow < 0 || targetArrayRow >= array1.length) { Logger.log("当前行不在数据范围内"); return array1; } // 创建目标行的副本,避免修改原数组 var processedRow = [...array1[targetArrayRow]]; // splice从指定索引移除到末尾,省略第二个参数即可 processedRow.splice(currentCol - 1); // 创建整个数组的副本并替换处理后的行 var array2 = [...array1]; array2[targetArrayRow] = processedRow; Logger.log("处理后数组: " + JSON.stringify(array2)); return array2; }
核心修复说明
- 统一表格上下文:用
openByUrl获取的表格对象来获取工作表,避免activeSpreadsheet的上下文问题导致工作表获取失败。 - 索引转换:将电子表格行号转换为数组索引(
currentRow - 6),解决越界问题。 - 副本创建:用扩展运算符(
...)复制数组,确保splice只修改副本,不影响原数组。 - 范围有效性:修正
getRange的行计数逻辑,确保取数范围始终有效。 - 错误提前拦截:增加工作表存在性检查,抛出明确错误便于排查。
内容的提问来源于stack exchange,提问作者Drew254
相关产品推荐
相关产品推荐

