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

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列

现有代码问题分析

  1. 范围获取错误:PROsheet.getRange(5, 2, PROsheet.getLastRow())会从第5行开始取getLastRow()行数据,实际应该取到最后一行,正确范围是5, 2, PROsheet.getLastRow() - 4(因为从第5行开始,总行数减前面4行)
  2. 二维数组查找失效:projnameCO.indexOf(r[1])无法在二维数组中找到值,需要先将projnameCO转为一维数组
  3. 缺失核心复制逻辑:仅做了日志输出,未实现匹配后的数据复制与写入

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:59:58