You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Google App Script合并重复数据并解决单元格合并错误

问题分析

你的脚本出现合并错位、读取数据错误是以下几个核心问题导致的:

  • 行偏移计算不匹配:你通过const [,,,,,,...values]跳过了前6行数据,但后续合并单元格时用的偏移量是+2,两个数值不对应,直接导致合并的行位置完全错位。
  • 列配置冗余:const columns = [3, 3]重复定义了第3列,属于无效配置,修改为你实际需要合并的列号即可。
  • 边界逻辑缺失:遍历到列的最后一行时,col[j + 1]为undefined,最后一组连续重复的单元格不会触发合并,会出现遗漏。
  • 临时存储逻辑错误:用单元格值作为temp对象的key,当同一列不同位置出现相同值时,会触发错误的合并判断。
修改后可用代码
function mergepkw() {
  // 配置项,根据你自己的表格调整
  const columns = [3]; // 要合并的列号,从1开始数,多列就写[3,4,5]
  const sheetName = "Sheet1"; 
  const skipHeaderRows = 6; // 要跳过的表头行数,你之前写的6个逗号对应跳6行,不对就改

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const allValues = sheet.getDataRange().getValues();
  // 跳过表头,取需要处理的行
  const values = allValues.slice(skipHeaderRows);

  // 转置表格,按列处理
  values[0]
  .map((_, i) => values.map(e => e[i]))
  .forEach((col, colIndex) => {
    // 只处理配置的列
    if (!columns.includes(colIndex + 1)) return;
    let startRow = 0;
    // 遍历列的每一行
    for (let rowIndex = 1; rowIndex <= col.length; rowIndex++) {
      // 到最后一行或者当前行和下一行值不同时触发合并
      if (rowIndex === col.length || col[rowIndex] !== col[startRow]) {
        const mergeRowCount = rowIndex - startRow;
        // 连续超过1行相同才合并
        if (mergeRowCount > 1) {
          // 计算实际表格中的行号:跳过的表头行数 + 起始行 + 1(因为sheet行号从1开始)
          const actualStartRow = skipHeaderRows + startRow + 1;
          sheet.getRange(actualStartRow, colIndex + 1, mergeRowCount, 1).merge();
        }
        startRow = rowIndex;
      }
    }
  });
}
使用注意事项
  • 运行前先备份表格数据,避免合并错误无法回滚
  • 调整skipHeaderRows数值为你实际要跳过的表头行数,比如表头只有1行就填1
  • columns里填你需要合并的列号,列号从左到右从1开始数,比如C列对应3,D列对应4
  • 运行脚本前取消表格的筛选、隐藏行,避免合并位置错位

内容的提问来源于stack exchange,提问作者shohel rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:54:02