如何修改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); }
修复说明
- 键唯一性处理:对From和To列的值做
trim()操作,消除前后空格,避免因隐形空格导致相同内容被识别为不同键,进而生成重复行 - 空值处理:初始化合并行时将拼接列转为字符串并处理空值,拼接前判断单元格是否有值,避免出现多余的分号或空内容拼接
- 类型兼容:将单元格值转为字符串,避免数字、日期等非字符串类型拼接时出现异常
内容的提问来源于stack exchange,提问作者xyz333
相关产品推荐
相关产品推荐

