Google Apps Script列表匹配与指定列数据复制实现求助
Google Apps Script 列表匹配与数据复制实现方案
需求明确
- 创建两个列表:从
0_LISTE PROJETS表(列表01)和TEST_PROJETS表(列表02)中提取项目名称 - 对比两个列表,找到项目名称匹配的行
- 匹配成功时,将列表01对应行的第1、3、4、20、21、22、23列数据,复制到列表02对应行的第1、3、4、28、29、30、31列
现有代码问题分析
- 范围获取错误:
PROsheet.getRange(5, 2, PROsheet.getLastRow())会从第5行开始取getLastRow()行数据,实际应该取到最后一行,正确范围是5, 2, PROsheet.getLastRow() - 4(因为从第5行开始,总行数减前面4行) - 二维数组查找失效:
projnameCO.indexOf(r[1])无法在二维数组中找到值,需要先将projnameCO转为一维数组 - 缺失核心复制逻辑:仅做了日志输出,未实现匹配后的数据复制与写入
修正后的完整代码
function REA_PROJET_002() { // 获取工作表对象 const ss = SpreadsheetApp.getActiveSpreadsheet(); const REA_PROJsheet = ss.getSheetByName("TEST_PROJETS"); const PROsheet = ss.getSheetByName("0_LISTE PROJETS"); // 获取列表01(PROsheet)的完整数据:从第5行开始到最后一行,所有列 const proData = PROsheet.getRange(5, 1, PROsheet.getLastRow() - 4, PROsheet.getLastColumn()).getValues(); // 获取列表02(REA_PROJsheet)的完整数据:从第2行开始到最后一行,所有列 const reaData = REA_PROJsheet.getRange(2, 1, REA_PROJsheet.getLastRow() - 1, REA_PROJsheet.getLastColumn()).getValues(); // 创建项目名到PROsheet行数据的映射(用第2列的值作为键) const proMap = new Map(); proData.forEach(row => { const projectName = row[1]; // 第2列是项目名(索引从0开始) if (projectName) { // 跳过空项目名的行 proMap.set(projectName, row); } }); // 遍历REA_PROJsheet的数据,匹配并复制指定列 const updatedReaData = reaData.map(row => { const projectName = row[1]; // REA_PROJsheet的第2列是项目名 const matchedProRow = proMap.get(projectName); if (matchedProRow) { // 复制指定列:注意列索引从0开始 // PROsheet的列(原需求第1/3/4/20/21/22/23列)对应索引0/2/3/19/20/21/22 // REA_PROJsheet的目标列(第1/3/4/28/29/30/31列)对应索引0/2/3/27/28/29/30 row[0] = matchedProRow[0]; row[2] = matchedProRow[2]; row[3] = matchedProRow[3]; row[27] = matchedProRow[19]; row[28] = matchedProRow[20]; row[29] = matchedProRow[21]; row[30] = matchedProRow[22]; } return row; }); // 批量写入更新后的数据到REA_PROJsheet REA_PROJsheet.getRange(2, 1, updatedReaData.length, updatedReaData[0].length).setValues(updatedReaData); }
代码关键说明
- 批量操作优化:一次性获取所有数据、处理后一次性写入,避免多次读写工作表,提升执行效率
- 映射表查找:用
Map存储项目名与对应行数据的关系,将匹配时间复杂度从O(n²)降到O(n) - 列索引对应:注意Google Sheets的列号从1开始,而数组索引从0开始,需做对应转换(比如原需求第1列对应数组索引0)
- 空值过滤:跳过项目名为空的行,避免无效匹配
内容的提问来源于stack exchange,提问作者antho2B
相关产品推荐
相关产品推荐

