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

