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

如何用Apps Script的onEdit函数实现Google Sheets两表单元格双向同步

Apps Script 子表到主表反向同步onEdit实现方案

前置说明

  • 简单触发器onEdit支持Logger.log/console.log输出,日志可以在Apps Script编辑器左侧「执行」面板中查看对应触发记录的日志内容
  • 实现逻辑核心:先判断编辑的是不是符合规则的子表,再取编辑行对应的日期,匹配主表的日期列后更新对应状态列

可直接使用的完整代码

function onEdit(e) {
  // 无触发事件对象时直接返回,避免手动运行报错
  if (!e) return;
  const ss = e.source;
  const activeSheet = ss.getActiveSheet();
  const sheetName = activeSheet.getSheetName();
  const editedCell = e.range;

  // 过滤规则:编辑的不是主表「休日」,且编辑的是状态列(可根据子表实际状态列调整列号,当前和你原代码逻辑对齐设为第4列)
  if (sheetName === '休日' || editedCell.getColumn() !== 4) return;

  // 取当前编辑行的日期值:此处假设子表日期存在编辑行的第1列,可根据你实际结构调整列号
  const targetDateRaw = activeSheet.getRange(editedCell.getRow(), 1).getValue();
  if (!targetDateRaw) return;
  const targetDateStr = Utilities.formatDate(targetDateRaw, 'JST', 'yyyy/MM/dd');

  const mainSheet = ss.getSheetByName('休日');
  // 主表第1行存储所有日期,遍历第1行匹配对应日期列
  const lastCol = mainSheet.getLastColumn();
  const mainDateRow = mainSheet.getRange(1, 1, 1, lastCol).getValues()[0];

  // 匹配到对应日期后更新主表第6行的状态值
  for (let col = 0; col < lastCol; col++) {
    if (!mainDateRow[col]) continue;
    const mainDateStr = Utilities.formatDate(mainDateRow[col], 'JST', 'yyyy/MM/dd');
    if (mainDateStr === targetDateStr) {
      mainSheet.getRange(6, col + 1).setValue(e.value);
      break;
    }
  }
}

自定义调整说明

  • 如果需要限制仅匹配xxxx/x格式命名的子表,可以在过滤规则处新增正则校验:
    const sheetNameReg = /^\d{4}\/\d{1,2}$/;
    if (sheetName === '休日' || editedCell.getColumn() !==4 || !sheetNameReg.test(sheetName)) return;
    
  • 可根据子表、主表的实际列/行布局,调整代码中对应的行列号参数即可适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:04