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

如何修改Google Sheets脚本实现重复行合并与多列内容拼接

Google Sheets合并重复行并多列内容拼接问题解决

问题说明

需在Google Sheets数组中合并重复行,拼接多列单元格内容。现有单列拼接的Google Apps Script可基于From和To列识别重复行并正确拼接Transaction列,但修改为支持Transaction和Description多列拼接时,出现重复输出行的问题。

数据情况

  • 原始数据:包含From、To、Transaction、Description四列,存在From和To完全相同的重复行,例如From=A、To=B对应两行数据,分别为Transaction="转账1"、Description="工资"和Transaction="转账2"、Description="奖金"
  • 错误输出:相同From/To组合的合并行重复出现,拼接内容混乱或重复
  • 期望输出:相同From/To组合的行合并为一行,Transaction列拼接所有对应内容(格式如转账1;转账2),Description列拼接所有对应内容(格式如工资;奖金)

原始单列拼接脚本

function mergeDuplicates() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data.shift();
  const merged = {};

  data.forEach(row => {
    const key = `${row[0]}|${row[1]}`; // 以From和To为唯一标识键
    if (!merged[key]) {
      merged[key] = [...row];
    } else {
      merged[key][2] += `; ${row[2]}`; // 仅拼接Transaction列(索引2)
    }
  });

  const output = [headers, ...Object.values(merged)];
  sheet.clearContents();
  sheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}

修改后出现问题的多列拼接脚本

function mergeDuplicatesMultiCol() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data.shift();
  const merged = {};

  data.forEach(row => {
    const key = `${row[0]}|${row[1]}`;
    if (!merged[key]) {
      merged[key] = [...row];
    } else {
      // 尝试拼接Transaction和Description列
      merged[key][2] += `; ${row[2]}`;
      merged[key][3] += `; ${row[3]}`;
    }
  });

  const output = [headers, ...Object.values(merged)];
  sheet.clearContents();
  sheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}

修复后的多列拼接脚本

function mergeDuplicatesMultiColFixed() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data.shift();
  const merged = {};

  data.forEach(row => {
    // 去除From、To列前后空格,避免因空格导致标识键不唯一
    const from = row[0].toString().trim();
    const to = row[1].toString().trim();
    const key = `${from}|${to}`;
    
    if (!merged[key]) {
      // 初始化合并行,复制当前行所有内容
      merged[key] = [...row];
      // 确保拼接列初始为字符串,处理空值情况
      merged[key][2] = merged[key][2]?.toString() || '';
      merged[key][3] = merged[key][3]?.toString() || '';
    } else {
      // 拼接Transaction列,跳过空单元格
      if (row[2]) {
        merged[key][2] += `; ${row[2].toString().trim()}`;
      }
      // 拼接Description列,跳过空单元格
      if (row[3]) {
        merged[key][3] += `; ${row[3].toString().trim()}`;
      }
    }
  });

  const output = [headers, ...Object.values(merged)];
  sheet.clearContents();
  sheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}

修复说明

  1. 键唯一性处理:对From和To列的值做trim()操作,消除前后空格,避免因隐形空格导致相同内容被识别为不同键,进而生成重复行
  2. 空值处理:初始化合并行时将拼接列转为字符串并处理空值,拼接前判断单元格是否有值,避免出现多余的分号或空内容拼接
  3. 类型兼容:将单元格值转为字符串,避免数字、日期等非字符串类型拼接时出现异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:35