如何规避Google Apps Script中的undefined错误?非空行分组脚本求助
问题排查与脚本修改
核心问题分析
原脚本直接调用getRowGroup(i, 1).getDepth()时,若当前行未创建分组,Google Apps Script会抛出异常而非返回undefined,这导致脚本直接终止,无法执行后续的条件判断。此外原逻辑在分组范围的选取上也存在偏差,会导致分组起始行错误。
修改后的脚本
function Grouping() { const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow(); let count = 0; let firstNonEmptyRow = 0; // 遍历所有行,从第1行开始(原脚本从第2行开始会漏掉首行非空的情况) for (let i = 1; i <= lastRow; i++) { const curCellValue = sheet.getRange(i, 1).getValue(); const nextCellValue = i < lastRow ? sheet.getRange(i + 1, 1).getValue() : ""; // 用try-catch捕获无分组时的异常,判断当前行是否已分组 let isRowGrouped = false; try { const rowGroup = sheet.getRowGroup(i, 1); if (rowGroup && rowGroup.getDepth() >= 1) { isRowGrouped = true; } } catch (e) { // 无分组时会进入catch,标记为未分组 isRowGrouped = false; } // 仅处理未分组的行 if (!isRowGrouped) { // 记录连续非空行的起始行 if (curCellValue !== "" && count === 0) { firstNonEmptyRow = i; count = 1; } // 累加连续非空行的数量 else if (curCellValue !== "") { count++; } // 当遇到空行或到达最后一行,且存在连续非空行时,执行分组 if ((curCellValue === "" || i === lastRow) && count > 0) { // 分组范围:从起始行的下一行开始,到当前行的前一行(如果当前行是空行) // 若到达最后一行且当前行非空,则分组范围是起始行到当前行 const startRow = firstNonEmptyRow + 1; const groupRowsCount = i === lastRow && curCellValue !== "" ? count - 1 : count - 1; // 确保分组行数大于0再执行操作 if (groupRowsCount > 0) { sheet.getRange(startRow, 1, groupRowsCount).shiftRowGroupDepth(1); } // 重置计数器 count = 0; firstNonEmptyRow = 0; } } } }
关键修改点
- 异常处理:用
try-catch包裹getRowGroup调用,捕获无分组时的异常,避免脚本终止。 - 逻辑修正:
- 从第1行开始遍历,避免漏掉首行非空的情况;
- 调整分组范围的计算逻辑,确保分组的是连续非空行的子行(符合常规分组习惯,即首行作为组标题,下方行折叠);
- 增加边界判断,处理最后一行非空的场景。
- 性能优化:提前获取当前工作表对象,避免重复调用
getActiveSheet()或getActiveSpreadsheet(),提升脚本执行效率。
内容的提问来源于stack exchange,提问作者Vitalij Nazarenko
相关产品推荐
相关产品推荐

