Google Sheets脚本优化:新增行时自动合并列值并重置格式
解决Google Sheets新增行后N列合并单元格异常问题
原有脚本存在多个关键问题导致新增行后合并异常,包括未清除旧合并、工作表定位错误、数据范围计算不准以及缺少水平线格式化逻辑。以下是修正后的完整解决方案:
修正后的脚本
function mergePeriodCells() { const sheetName = "BANQUE"; const startRow = 28; const targetCol = 14; // N列对应列索引 // 定位目标工作表 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (!sheet) return; // 获取有效数据行范围,提前取消所有旧合并 const lastRow = sheet.getLastRow(); if (lastRow < startRow) return; sheet.getRange(startRow, targetCol, lastRow - startRow + 1, 1).unmerge(); // 提取N列非空数据(仅保留连续有效行) const data = sheet.getRange(startRow, targetCol, lastRow - startRow + 1, 1) .getValues() .map(row => row[0]) .filter(val => val !== ""); if (data.length === 0) return; // 分组统计连续相同值的行数 const mergeGroups = []; let currentVal = data[0]; let count = 1; for (let i = 1; i < data.length; i++) { if (data[i] === currentVal) { count++; } else { mergeGroups.push({ value: currentVal, rowCount: count }); currentVal = data[i]; count = 1; } } mergeGroups.push({ value: currentVal, rowCount: count }); // 执行合并并添加水平线 let currentRow = startRow; mergeGroups.forEach(group => { // 合并单元格并垂直居中 const mergeRange = sheet.getRange(currentRow, targetCol, group.rowCount, 1); mergeRange.merge().setVerticalAlignment("middle"); // 在合并块底部添加水平线 const bottomRow = currentRow + group.rowCount - 1; sheet.getRange(bottomRow, targetCol, 1, 1) .setBorder(null, null, true, null, null, null, "#000000", SpreadsheetApp.BorderStyle.SOLID); currentRow += group.rowCount; }); }
关键修改说明
- 精准定位工作表:直接通过名称锁定BANQUE标签页,避免切换标签时出错
- 先清除旧合并:新增行前强制取消N列所有原有合并,消除新旧合并范围冲突
- 连续值分组合并:改用循环遍历统计连续相同值的行数,彻底解决原有脚本将非连续相同值错误合并的问题
- 自动添加水平线:在每个合并块的最后一行添加底部实线边框,匹配对账单的视觉分隔需求
- 优化数据范围:仅处理从起始行到最后一行的有效数据,避免无效空行干扰
使用方式
- 替换原有
myFunction为上述脚本,可保留或修改函数名 - 配置自动触发:打开「扩展程序」→「Apps脚本」,进入触发器页面,添加
onChange类型触发器绑定该函数,新增行时会自动执行合并操作 - 手动测试:直接在脚本编辑器中运行函数,验证合并效果
内容的提问来源于stack exchange,提问作者Mozart75
相关产品推荐
相关产品推荐

