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

Google Sheets脚本实现跨表数据增量更新与追加功能求助

Google Sheets 跨表增量同步脚本实现方案

直接用Google Sheets原生绑定的Apps Script开发即可,无需额外搭建服务,支持绑定按钮手动触发,完全匹配你的需求。

前置配置

  • 打开目标工作表,点击顶部「扩展程序」→「Apps Script」进入脚本编辑器,清空默认的空函数占位代码。
  • 提前确认两张表的基础结构,按需调整代码里的列对应关系:
    • Data Collection 表默认按A列存姓名、B列存所属Section、C列存完成Units设计,表头占第1行,有效数据从第2行开始
    • Section Data 表默认A列存姓名,第1行B列及以后为各Section表头,和录入的Section名称一一对应即可,无需手动提前建人员行

可直接使用的核心代码

function syncDataToSection() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const collectSheet = ss.getSheetByName("Data Collection");
  const sectionSheet = ss.getSheetByName("Section Data");

  // 读取录入页有效数据,无有效数据直接终止运行
  const collectLastRow = collectSheet.getLastRow();
  if (collectLastRow < 2) return;
  const collectData = collectSheet.getRange(2, 1, collectLastRow - 1, 3).getValues();

  // 预建映射表,避免循环查找拖慢运行速度
  const sectionLastRow = sectionSheet.getLastRow();
  const sectionLastCol = sectionSheet.getLastColumn();
  // 建立Section名称到列号的映射
  const sectionColMap = {};
  if (sectionLastCol >= 2) {
    const sectionHeaders = sectionSheet.getRange(1, 2, 1, sectionLastCol - 1).getValues()[0];
    sectionHeaders.forEach((secName, idx) => {
      const trimedName = secName.toString().trim();
      if (trimedName) sectionColMap[trimedName] = idx + 2;
    });
  }
  // 建立已存在人员姓名到行号的映射
  const nameRowMap = {};
  if (sectionLastRow >= 2) {
    const existedNames = sectionSheet.getRange(2, 1, sectionLastRow - 1, 1).getValues();
    existedNames.forEach((row, idx) => {
      const trimedName = row[0].toString().trim();
      if (trimedName) nameRowMap[trimedName] = idx + 2;
    });
  }

  // 逐行处理录入数据
  collectData.forEach(row => {
    const name = row[0]?.toString().trim();
    const section = row[1]?.toString().trim();
    const units = Number(row[2]) || 0;
    // 空行、无效数据直接跳过
    if (!name || !section || units <= 0) return;
    const targetCol = sectionColMap[section];
    if (!targetCol) return;

    if (nameRowMap.hasOwnProperty(name)) {
      // 人员已存在,对应Section数值累加
      const targetRow = nameRowMap[name];
      const oldValue = Number(sectionSheet.getRange(targetRow, targetCol).getValue()) || 0;
      sectionSheet.getRange(targetRow, targetCol).setValue(oldValue + units);
    } else {
      // 人员不存在,在表尾新增行
      const newRow = sectionSheet.getLastRow() + 1;
      sectionSheet.getRange(newRow, 1).setValue(name);
      sectionSheet.getRange(newRow, targetCol).setValue(units);
      nameRowMap[name] = newRow;
    }
  })

  // 同步完成后清空录入页Units列,留待下次录入
  collectSheet.getRange(2, 3, collectLastRow - 1, 1).clearContent();
}

手动触发按钮设置

  • 回到Data Collection表页,点击顶部「插入」→「绘图」,绘制带“同步数据”提示的按钮图形,保存后插入到页面合适位置。
  • 选中插入的按钮,点击右上角三点菜单,选择「指定脚本」,输入函数名syncDataToSection保存即可,后续点击按钮就能直接运行同步逻辑。

适配调整提示

  • 如果你的表列顺序和默认预设不一致,只需要修改代码里对应的列号参数即可:比如Units列在D列,就把读取录入数据范围的列数、清空内容的列号从3改成4。
  • 代码自动匹配Section表头,只要Data Collection里填的Section名和Section Data表头文字完全一致(注意不要带多余空格),不需要手动修改代码里的Section列对应关系。
  • 如果需要留存每次的原始录入记录,把最后一行清空Units列的代码注释掉,改成给已同步行加“已同步”标记即可。

内容的提问来源于stack exchange,提问作者Lightvayne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:42:36