如何用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
相关产品推荐
相关产品推荐

