如何在收到新邮件时触发Google Apps Script自动运行
为Google Apps Script添加新邮件触发的自动运行触发器
问题与原代码
我写了一个Google Apps Script,用来检查邮件主题,匹配后提取正文并转发到指定邮箱。手动运行完全正常,但想加个触发器,让它收到主题匹配的新邮件时自动运行。原代码如下:
function getInbox(){ const q = GmailApp.search('subject:SendEmailInboundReport', 0,1 ); var qmsg = q[0].getMessages(); var msg = qmsg[0].getPlainBody(); var attachments = qmsg[0].getAttachments(); title = qmsg[0].getPlainBody().match(/w\d{4}.+?c\d{4}/); var tite1 = (title && title[0]) ? title[0] : 'No title'; tmp = msg.replace(tite1, '').replace(/\s/g, ''); GmailApp.sendEmail('',tite1,'',{ attachments: [attachments[0]], bcc: tmp }) }
解决方案
1. 添加自动触发器的步骤
- 打开Google Apps Script编辑器,点击左侧工具栏的闹钟图标(触发器)
- 点击右下角添加触发器按钮
- 在配置面板中设置以下选项:
- 选择要运行的函数:
getInbox - 部署类型:
- 若要实时触发:选基于事件的触发器,事件源选「Gmail」,事件类型选「收到新邮件时」
- 若要避免频繁触发:选时间驱动,比如设置每5分钟运行一次(可根据需求调整间隔)
- 点击「保存」,完成权限授权即可
- 选择要运行的函数:
2. 优化代码避免重复处理
原代码存在只处理单封邮件、可能重复处理的问题,建议添加标签标记已处理邮件,优化后的代码如下:
function getInbox(){ // 搜索未处理的目标邮件,排除已标记的线程 const threads = GmailApp.search('subject:SendEmailInboundReport -label:ProcessedReport', 0, 50 ); // 遍历所有匹配的邮件线程 threads.forEach(thread => { const messages = thread.getMessages(); // 取线程内最新收到的邮件 const latestMsg = messages[messages.length - 1]; const attachments = latestMsg.getAttachments(); // 提取标题,修复变量声明与拼写错误 const titleMatch = latestMsg.getPlainBody().match(/w\d{4}.+?c\d{4}/); const title1 = titleMatch ? titleMatch[0] : 'No title'; let recipientBcc = latestMsg.getPlainBody().replace(title1, '').replace(/\s/g, ''); // 注意:替换为实际的收件人邮箱地址 GmailApp.sendEmail('your-target-email@example.com', title1, '', { attachments: attachments, bcc: recipientBcc }); // 创建或获取标签,标记已处理邮件 const processedLabel = GmailApp.getUserLabelByName('ProcessedReport') || GmailApp.createLabel('ProcessedReport'); thread.addLabel(processedLabel); }); }
优化点说明
- 新增
-label:ProcessedReport搜索条件,避免重复处理同一封邮件 - 遍历所有匹配的邮件线程,不再局限于单封
- 修复了变量未声明、拼写错误(
tite1→title1)的问题 - 改为处理线程内最新邮件,确保对应刚收到的消息
- 支持转发所有附件,而非仅第一个
- 明确提示填写收件人邮箱(原代码中该参数为空)
内容的提问来源于stack exchange,提问作者Bipu Shrestha
相关产品推荐
相关产品推荐

