如何在电子邮件进入收件箱后触发 Google Apps 脚本?
How to trigger a Google Apps Script once an email get in the inbox?
我创建了一个 Google Apps 脚本来检查电子邮件是否有附件,然后将其发送到另一个电子邮件地址。
工作正常,但我想创建一个触发器,一旦新电子邮件到达收件箱就会启动脚本。
我已经能够创建一个每小时启动脚本的触发器,但这不是我想要的
经过一些研究和其他 google-apps-script 开发人员的帮助,最好的解决方案是结合使用 Gmail 过滤系统和时间驱动触发器。
所以对于一个普通的 Gmail 帐户来说,基本上有 1 hour/day 计算时间,如前所述 in the documentation。
所以我所做的是设置一个过滤器,为需要处理的传入电子邮件添加标签和星标。
在我的脚本中,我将标签添加到一个数组中,循环遍历标签数组,以便我只处理所需的电子邮件,而不是整个收件箱。
处理后,脚本会从已处理的电子邮件中删除星号。
这样您就不会浪费宝贵的计算时间,也不会达到每日限制。
然后我设置了一个每 10 分钟运行一次的时间驱动触发器。
您还可以设置时间驱动的触发器,每天向您发送“失败摘要”,这样您就可以看到您的脚本出了什么问题,并修复必须修复的问题。
你可能最好 运行 像下面这样的东西,它并不完美,可能需要修补,但这就是我实现它的方式:
function YourAutoEmailReplier() {
var ureadMsgsCount = GmailApp.getInboxUnreadCount();
if (ureadMsgsCount > 0) {
var threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
for (var i = 0; i < threads.length; i++) {
var message = threads[i].getMessages()[0];
//this 0 above means it only replies to the first email message in reply chain
//You can adjust this get the latest if you like
var email = message.getFrom();
var body = message.getPlainBody();
var subject = message.getSubject();
var date = message.getDate();
date = date.toString();
var fulldate = date.split(' ');
var day = fulldate[0];
var month = fulldate[1];
var numday = fulldate[2];
if (numday.charAt(0) === '0') {
numday = numday.slice(1);
}
var year = fulldate[3];
var time = fulldate[4];
var brokentime = time.split(':');
var hour = brokentime[0].replace(/^0+/, '');
var minute = brokentime[1];
var second = brokentime[2];
if (subject.indexOf('RE:') > -1) {
var subject = subject;
} else {
var subject = "RE: " + subject;
}
var fulldetails = email.split(' ');
var firstname = fulldetails[0];
var surname = fulldetails[1];
var replyBody = "Hello there " + firstname + "!,\nThank you ever so much for your email at " + hour + " on " + day + " the " + numday + " of " + month + ". I will be sure to get back to you as soon as possible.\nKind Regards\n\n";
GmailApp.sendEmail(email, subject, replyBody);
message.markRead();
}
}
}
然后转到触发器 -> 添加触发器 -> 将您的事件源设置为时间驱动 -> select 分钟计时器并选择您的帐户可用的最少分钟数
此答案改编自 @AziCode 的答案,但包含代码。
解决方案的组成部分:
- 无代码 Gmail filter 可捕获符合所需条件的电子邮件;对于操作,选择“加星标”和“应用标签”(输入您想要的标签)
- A trigger 配置为 运行 经常;此触发器循环遍历您的电子邮件,捕获已加星标并带有标签的邮件,对它们执行您想要的操作,然后删除星号。
这是您的 Google Apps 脚本项目中的代码(您必须授予脚本访问 GMail 收件箱的权限):
// Configure this trigger to run often
// (*how* often depends on the desired response time *and* how willing you are to risk hitting Google Apps Script’s rate limits;
// 10 minutes is probably good)
function triggerScriptForEmail() {
const threads = GmailApp.search('is:starred label:"<your desired label>"');
for (const thread of threads) {
const messages = thread.getMessages()
for (const message of messages) {
// we know the thread *has* starred messages, but not *all* messages are necessarily starred
if (message.isStarred()) {
// THE CODE SPECIFIC TO YOUR CASE GOES HERE
// THEN...
message.unstar()
}
}
}
}
我创建了一个 Google Apps 脚本来检查电子邮件是否有附件,然后将其发送到另一个电子邮件地址。
工作正常,但我想创建一个触发器,一旦新电子邮件到达收件箱就会启动脚本。
我已经能够创建一个每小时启动脚本的触发器,但这不是我想要的
经过一些研究和其他 google-apps-script 开发人员的帮助,最好的解决方案是结合使用 Gmail 过滤系统和时间驱动触发器。
所以对于一个普通的 Gmail 帐户来说,基本上有 1 hour/day 计算时间,如前所述 in the documentation。
所以我所做的是设置一个过滤器,为需要处理的传入电子邮件添加标签和星标。
在我的脚本中,我将标签添加到一个数组中,循环遍历标签数组,以便我只处理所需的电子邮件,而不是整个收件箱。
处理后,脚本会从已处理的电子邮件中删除星号。
这样您就不会浪费宝贵的计算时间,也不会达到每日限制。
然后我设置了一个每 10 分钟运行一次的时间驱动触发器。
您还可以设置时间驱动的触发器,每天向您发送“失败摘要”,这样您就可以看到您的脚本出了什么问题,并修复必须修复的问题。
你可能最好 运行 像下面这样的东西,它并不完美,可能需要修补,但这就是我实现它的方式:
function YourAutoEmailReplier() {
var ureadMsgsCount = GmailApp.getInboxUnreadCount();
if (ureadMsgsCount > 0) {
var threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
for (var i = 0; i < threads.length; i++) {
var message = threads[i].getMessages()[0];
//this 0 above means it only replies to the first email message in reply chain
//You can adjust this get the latest if you like
var email = message.getFrom();
var body = message.getPlainBody();
var subject = message.getSubject();
var date = message.getDate();
date = date.toString();
var fulldate = date.split(' ');
var day = fulldate[0];
var month = fulldate[1];
var numday = fulldate[2];
if (numday.charAt(0) === '0') {
numday = numday.slice(1);
}
var year = fulldate[3];
var time = fulldate[4];
var brokentime = time.split(':');
var hour = brokentime[0].replace(/^0+/, '');
var minute = brokentime[1];
var second = brokentime[2];
if (subject.indexOf('RE:') > -1) {
var subject = subject;
} else {
var subject = "RE: " + subject;
}
var fulldetails = email.split(' ');
var firstname = fulldetails[0];
var surname = fulldetails[1];
var replyBody = "Hello there " + firstname + "!,\nThank you ever so much for your email at " + hour + " on " + day + " the " + numday + " of " + month + ". I will be sure to get back to you as soon as possible.\nKind Regards\n\n";
GmailApp.sendEmail(email, subject, replyBody);
message.markRead();
}
}
}
然后转到触发器 -> 添加触发器 -> 将您的事件源设置为时间驱动 -> select 分钟计时器并选择您的帐户可用的最少分钟数
此答案改编自 @AziCode 的答案,但包含代码。
解决方案的组成部分:
- 无代码 Gmail filter 可捕获符合所需条件的电子邮件;对于操作,选择“加星标”和“应用标签”(输入您想要的标签)
- A trigger 配置为 运行 经常;此触发器循环遍历您的电子邮件,捕获已加星标并带有标签的邮件,对它们执行您想要的操作,然后删除星号。
这是您的 Google Apps 脚本项目中的代码(您必须授予脚本访问 GMail 收件箱的权限):
// Configure this trigger to run often
// (*how* often depends on the desired response time *and* how willing you are to risk hitting Google Apps Script’s rate limits;
// 10 minutes is probably good)
function triggerScriptForEmail() {
const threads = GmailApp.search('is:starred label:"<your desired label>"');
for (const thread of threads) {
const messages = thread.getMessages()
for (const message of messages) {
// we know the thread *has* starred messages, but not *all* messages are necessarily starred
if (message.isStarred()) {
// THE CODE SPECIFIC TO YOUR CASE GOES HERE
// THEN...
message.unstar()
}
}
}
}