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

Google Apps Script:对比两列值,仅为匹配行更新相邻列数值

解决方案:Google Apps Script 实现跨表数量累加

核心思路

先将Sheet1的产品名称与对应数量构建成键值对映射,避免重复遍历查找;再批量处理Sheet2数据,匹配到对应产品时累加数量,最后一次性写回表格,既解决索引定位问题,又提升脚本执行效率。

完整代码示例

function updateSheet2Quantity() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Sheet1");
  const sheet2 = ss.getSheetByName("Sheet2");
  
  // 获取Sheet1的数据(假设产品名在A列,数量在B列,从第2行开始)
  const sheet1Data = sheet1.getDataRange().getValues().slice(1);
  // 构建产品名 -> 数量的映射对象
  const productQtyMap = {};
  sheet1Data.forEach(row => {
    const productName = row[0]; // A列产品名
    const qty = row[1] || 0; // B列数量,默认0避免空值
    productQtyMap[productName] = qty;
  });
  
  // 获取Sheet2的数据(假设产品名在A列,数量在B列,从第2行开始)
  const sheet2Data = sheet2.getDataRange().getValues();
  // 遍历Sheet2每一行,处理数量累加
  sheet2Data.forEach((row, index) => {
    // 跳过表头行(第1行)
    if (index === 0) return;
    const productName = row[0];
    // 如果产品在映射中存在,累加数量
    if (productName in productQtyMap) {
      // Sheet2当前数量 + Sheet1对应数量,空值则按0处理
      row[1] = (row[1] || 0) + productQtyMap[productName];
    }
  });
  
  // 一次性将处理后的数据写回Sheet2,覆盖原有内容
  sheet2.getDataRange().setValues(sheet2Data);
}

关键细节说明

  • 映射对象的作用:把Sheet1的产品和数量存在对象里,查找时间从O(n)降到O(1),大表格下性能提升明显。
  • forEach索引的正确使用:forEach((row, index) => {})中的第二个参数index就是当前行的索引,通过它可以区分表头行和数据行,也能精准定位每一行的位置。
  • 批量读写表格:避免在循环中多次调用setValue(),改用getValues()一次性读入、setValues()一次性写出,符合Google Apps Script的最佳实践,减少API调用次数。

适配你的表格结构

如果你的产品列、数量列不是A/B列,只需修改代码中对应的索引:

  • 比如产品名在Sheet1的C列,就把row[0]改成row[2](数组索引从0开始)
  • 数量在Sheet2的D列,就把row[1]改成row[3]

内容的提问来源于stack exchange,提问作者Old Hunter Draveris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:31:11