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

Google Form提交后延迟1小时自动发送邮件问题咨询

需求可行性与解决办法

这个需求完全可行,但不能直接用同步延迟(如Utilities.sleep())实现——因为Google Apps Script免费版单次执行时长上限仅约6分钟,超过会被强制终止,这就是你添加1小时延迟后失败的核心原因。正确的做法是使用时间驱动触发器来实现延迟执行,以下是具体方案:

解决步骤

1. 替换同步延迟为时间驱动触发器

当表单提交时,不直接调用邮件发送函数,而是创建一个延迟1小时的触发器,同时存储提交数据供后续触发时使用。示例代码如下:

// 表单提交触发的函数(需绑定为表单的提交触发器)
function onFormSubmit(e) {
  const response = e.response;
  const responseId = response.getId();
  
  // 存储提交数据到脚本属性(避免触发器执行时丢失上下文)
  PropertiesService.getScriptProperties().setProperty(`resp_${responseId}`, JSON.stringify({
    recipient: response.getRespondentEmail(),
    answers: response.getItemResponses().map(item => `${item.getItem().getTitle()}: ${item.getResponse()}`).join("\n")
  }));

  // 创建1小时后的时间驱动触发器
  ScriptApp.newTrigger("sendDelayedEmail")
    .timeBased()
    .after(3600000) // 1小时 = 3600*1000毫秒
    .create();
}

// 延迟执行的邮件发送函数
function sendDelayedEmail() {
  const props = PropertiesService.getScriptProperties();
  const responseKeys = props.getKeys().filter(key => key.startsWith("resp_"));

  responseKeys.forEach(key => {
    const data = JSON.parse(props.getProperty(key));
    // 发送邮件
    MailApp.sendEmail(
      data.recipient,
      "延迟表单提交通知",
      `你的表单提交已收到,内容如下:\n\n${data.answers}`
    );
    // 发送后删除存储的数据,避免重复发送
    props.deleteProperty(key);
  });
}

2. 关键配置与注意事项

  • 绑定表单触发器:在脚本编辑器中,点击「编辑」→「当前项目的触发器」,添加一个新触发器,选择onFormSubmit函数,触发事件选「表单提交」,关联你的Google Form。
  • 权限授权:第一次运行脚本时,需要授权脚本访问邮件服务、触发器服务和属性存储服务,按照提示完成授权即可。
  • 触发器数量限制:每个Google账号的单脚本项目最多可创建20个时间驱动触发器,若表单提交量较大,可优化逻辑(比如批量处理触发器,或用Google Sheet存储数据后定时批量发送)。
  • 数据存储替代:如果表单字段过多,PropertiesService的存储上限(单属性9KB,总存储500KB)不够用,可将提交数据写入关联的Google Sheet,延迟函数中通过响应ID从Sheet读取数据。

为什么直接sleep会失败?

Google Apps Script免费版的单次执行时长被限制在6分钟以内,Utilities.sleep(3600000)会让脚本持续等待1小时,远远超过上限,脚本会被系统强制终止,自然无法执行后续的邮件发送逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:22:36