基于Apps Script合并共享两列值的不同工作表行
实现Google Sheets中玩具提案与安全评估数据的合并(Apps Script方案)
核心思路
以玩具/物种作为匹配标识,将"玩具提案"表与"安全评估回复"表的对应数据关联,合并到同一行中,最终输出到新建的"合并结果"工作表。
完整实现代码
function mergeToyData() { // 获取当前工作簿实例 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 读取两个数据源工作表 const proposalSheet = ss.getSheetByName("玩具提案"); const safetySheet = ss.getSheetByName("安全评估回复"); // 获取所有数据(包含表头行) const proposalData = proposalSheet.getDataRange().getValues(); const safetyData = safetySheet.getDataRange().getValues(); // 构建安全评估数据的映射表:以物种为键,存储对应评估数据 const safetyMap = {}; // 跳过表头,从第二行开始遍历安全评估数据 for (let i = 1; i < safetyData.length; i++) { const species = safetyData[i][0]; // 假设物种列在表格第一列(索引从0开始) // 存储当前行除物种外的所有评估字段 safetyMap[species] = safetyData[i].slice(1); } // 组装合并后的数据 const mergedData = []; // 生成合并表头:提案表头 + 评估表头(移除重复的物种列) const proposalHeaders = proposalData[0]; const safetyHeaders = safetyData[0].slice(1); mergedData.push([...proposalHeaders, ...safetyHeaders]); // 遍历提案数据,匹配对应评估信息 for (let i = 1; i < proposalData.length; i++) { const currentProposalRow = proposalData[i]; const species = currentProposalRow[0]; // 同样假设物种在提案表第一列 // 获取对应物种的评估数据,无匹配则用空值填充 const matchedSafetyData = safetyMap[species] || Array(safetyHeaders.length).fill(""); // 合并当前提案行与评估数据 mergedData.push([...currentProposalRow, ...matchedSafetyData]); } // 创建或获取"合并结果"工作表 let mergedSheet = ss.getSheetByName("合并结果"); if (!mergedSheet) { mergedSheet = ss.insertSheet("合并结果"); } // 清空目标表原有内容并写入合并后的数据 mergedSheet.clearContents(); mergedSheet.getRange(1, 1, mergedData.length, mergedData[0].length).setValues(mergedData); // 弹出完成提示 SpreadsheetApp.getUi().alert("数据合并完成!"); }
代码说明与使用步骤
适配你的表格结构:
- 如果你的工作表名称不是"玩具提案"或"安全评估回复",修改代码中
getSheetByName的参数 - 如果物种列不在表格第一列,调整代码中
safetyData[i][0]和currentProposalRow[0]的索引值(注意表格列索引从0开始)
- 如果你的工作表名称不是"玩具提案"或"安全评估回复",修改代码中
运行脚本:
- 打开你的Google Sheet,点击「扩展程序」→「Apps 脚本」
- 将上述代码粘贴到脚本编辑器,保存并命名项目
- 点击运行按钮,首次运行需要完成授权流程(按照提示允许脚本访问你的表格数据)
查看结果:
运行完成后,表格会自动生成"合并结果"工作表,其中每一行包含对应物种的提案信息与安全评估数据。
注意事项
- 确保匹配列(物种)的内容完全一致(包括大小写、空格、特殊字符),否则会出现匹配失败的情况
- 如果同一物种有多条安全评估记录,当前代码会保留最后一条记录;若需要合并多条记录,可以修改
safetyMap的存储逻辑,将值改为数组后再拼接 - 如需定期自动合并数据,可在脚本编辑器的「触发器」菜单中设置时间驱动触发器
内容的提问来源于stack exchange,提问作者Mandy F
相关产品推荐
相关产品推荐

