Google Apps Script 触发器完全指南:onEdit、onFormSubmit 与定时触发的底层逻辑
发布时间:2025年12月28日 · 预计阅读时间:20 分钟 · 作者:DAPHNETXG
大多数 Google Apps Script 的系统,不是写坏的,而是触发方式选错后慢慢烂掉的。
如果你曾经遇到以下情况:
- 同一个 Sheet,有时算得对,有时算不对
- 助理说「我只是改了一个选项,价格就乱了」
- 你 Run 没问题,但自动跑就出事
- 你不知道该不该用 onEdit,但又“好像只能用它”
那问题通常不在你的公式,也不在你的算法,而在于:
你把不该交给 Trigger 的事情,交给了 Trigger。
目录
- Trigger 到底是什么?
- onEdit:最方便,也是最危险的 Trigger
- onFormSubmit:为什么它更适合业务系统
- Time-driven:你低估了它的价值
- 三种 Trigger 的系统级对比
- 最常见的 Trigger 误用场景
- 一个稳定系统该怎么设计 Trigger
- FAQ:Trigger 常见问题
一、Trigger 到底是什么?
很多人把 Trigger 理解成「自动跑代码的东西」,但这不够准确。
更准确的说法是:
Trigger = 你把“什么时候执行”的控制权,交给 Google
一旦用了 Trigger,你就失去了三个控制点:
- 什么时候执行
- 执行顺序
- 是否被重复触发
所以,Trigger 本身不是问题,不该被 Trigger 控制的事情才是问题。
二、onEdit:最方便,也是最危险的 Trigger
onEdit 是最多人使用、也是最多人后悔的 Trigger。
因为它:
- 不需要额外设置
- 看起来“很即时”
- 和用户操作绑定
但问题是——
- 一次拖拽 = 多次 edit
- 公式自动回写 = edit
- 脚本 setValue = edit
也就是说,onEdit 并不知道你“有没有真的改东西”。
系统级结论:
onEdit 只能用来做「轻量 UI 反应」,不能承载业务计算
三、onFormSubmit:为什么它更适合业务系统
onFormSubmit 的关键优势只有一个:
每一次触发,都是一笔“已确认的输入”
它适合:
- 订单创建
- 报价生成
- Invoice 生成
- 首次写入核心数据
因为:
- 不会被拖拽触发
- 不会被脚本反复触发
- 事件来源清晰
如果你在做「真实收费系统」,onFormSubmit 应该是主干,而不是 onEdit。
四、Time-driven:你低估了它的价值
很多人只在「定时发邮件」时想到 time-driven。
但在系统设计里,它的真正价值是:
把“非即时、但重要”的事情,从用户操作中剥离
适合 time-driven 的事情包括:
- 批量 recalculation
- 状态对账
- 补发失败任务
- 系统自检
一句话判断法:
如果这件事「晚 5 分钟也没关系」,它就不该绑在 onEdit
五、三种 Trigger 的系统级对比
- onEdit:即时,但不可控
- onFormSubmit:稳定,但只发生一次
- Time-driven:可靠,但非即时
稳定系统的共通点是:
核心计算不依赖 onEdit
六、最常见的 Trigger 误用场景
- 用 onEdit 算总价
- 用 onEdit 控制状态流转
- 在 onEdit 里写复杂逻辑
- 多个 Trigger 同时改同一行
这些问题不会马上炸,但一定会在业务变复杂时炸。
七、一个稳定系统该怎么设计 Trigger?
一个经过实战验证的结构是:
- onFormSubmit:创建记录
- onEdit:只监听「按钮 / checkbox」
- Time-driven:兜底与修复
所有真正重要的计算:
必须是“可重复、可重跑、与触发无关”的函数。
FAQ:Google Apps Script Trigger 常见问题
为什么我 onEdit 会触发多次?
因为拖拽、公式回写、脚本写入都会触发。
可以完全不用 onEdit 吗?
可以,而且很多稳定系统就是这么做的。
Time-driven 会不会不准时?
会有延迟,但适合非即时任务。