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

GmailApp.sendEmail是否支持定时发信?Google Sheets邮件合并咨询

解答

GmailApp.sendEmail 不支持设置指定发送日期,你在官方文档里没找到对应参数是正常的——该方法被调用后会立即触发邮件投递,没有内置定时发送能力。

基于Google Sheets + Apps Script实现按表格列定时发信,有两种成熟方案:


方案1:时间驱动触发器轮询(适配现有代码,改造成本最低)

这个方案不需要额外开通服务,只需要小改你现有的邮件合并代码,配合Apps Script自带的定时触发器即可实现:

  • 首先在代码开头的常量区新增定时列的定义:
const SCHEDULED_TIME_COL = "Scheduled time";
  • 在读取表头后,新增定时列的索引获取逻辑:
// 原有代码
const heads = data.shift(); 
const emailSentColIdx = heads.indexOf(EMAIL_SENT_COL);
// 新增这行
const scheduledTimeColIdx = heads.indexOf(SCHEDULED_TIME_COL);
  • 修改遍历行的判断逻辑,只有到了设定时间的未发送邮件才会被投递:
obj.forEach(function(row, rowIdx){
  if (row[EMAIL_SENT_COL] == ''){
    // 解析表格里的定时时间
    const targetSendTime = new Date(row[SCHEDULED_TIME_COL]);
    const currentTime = new Date();
    // 未到发送时间直接跳过,留空状态
    if (targetSendTime > currentTime) {
      out.push([""]);
      return;
    }
    // 到点了就执行原有发信逻辑,不需要改动下面的try/catch块
    try {
      const msgObj = fillInTemplateFromObject_(emailTemplate.message, row);
      GmailApp.sendEmail(row[RECIPIENT_COL], msgObj.subject, msgObj.text, {
        htmlBody: msgObj.html,
        from: 'sender@gmail.com',
        name: 'name of the sender',
        attachments: emailTemplate.attachments,
        inlineImages: emailTemplate.inlineImages
      });
      out.push([new Date()]);
    } catch(e) {
      out.push([e.message]);
    }
  } else {
    out.push([row[EMAIL_SENT_COL]]);
  }
});
  • 配置自动运行触发器:打开Apps Script编辑器,左侧边栏选择「触发器」,新建触发器,选择执行sendEmails函数,触发源选择「时间驱动」,触发类型选「分钟计时器」,间隔设置为5-15分钟即可。触发器会按你设置的间隔自动扫描表格,给到点的未发邮件执行发信操作。

方案2:调用Gmail高级API实现原生定时(发送时间精准,无轮询延迟)

如果你需要发送时间完全精准、不想等轮询间隔,可以开启Gmail高级服务,直接调用Gmail原生的定时发信能力,不需要依赖脚本持续轮询:

  • 在Apps Script编辑器左侧边栏选择「服务」,添加「Gmail」服务,版本选择v1。
  • 替换原来的GmailApp.sendEmail调用逻辑,创建草稿时直接传入scheduledTime参数(要求是UTC毫秒级时间戳),Gmail服务器会在指定时间自动发送邮件,不需要脚本后续运行。核心调用示例:
/**
 * 创建定时发送邮件
 * @param {string} to 收件人邮箱
 * @param {string} subject 邮件主题
 * @param {string} htmlContent html正文
 * @param {Date} sendTime 定时发送时间
 */
function createScheduledDraft(to, subject, htmlContent, sendTime) {
  // 拼接符合MIME规范的邮件内容
  const mimeContent = [
    `To: ${to}`,
    `Subject: =?UTF-8?B?${Utilities.base64Encode(subject, Utilities.Charset.UTF_8)}?=`,
    'MIME-Version: 1.0',
    'Content-Type: text/html; charset=UTF-8',
    'Content-Transfer-Encoding: 8bit',
    '',
    htmlContent
  ].join('\r\n');

  const rawMsg = Utilities.base64EncodeWebSafe(mimeContent);
  // 调用API创建定时草稿
  Gmail.Users.Drafts.create({
    message: { raw: rawMsg }
  }, 'me', { scheduledTime: sendTime.getTime() });
}

这个方案的定时完全由Gmail服务端控制,精度到秒,但是如果要带附件、内联图片的话需要额外拼接MIME结构,改造成本比第一种方案高。


注意事项

  • 请确保Apps Script项目的时区和你Google表格的时区设置一致,否则会出现时间判断偏差,时区设置可以在脚本编辑器的项目设置页调整。
  • 普通Gmail账号每日发信配额约100封,Google Workspace账号配额更高,发信时注意不要超过对应配额避免触发限制。
  • 第一种轮询方案如果要取消某封邮件的发送,只需要清空对应行的定时时间,或者在Email Sent列填入任意非空内容即可;第二种API方案如果要取消发送,需要到Gmail的「已定时」草稿箱删除对应草稿。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:54:31