如何在电子邮件进入收件箱后触发 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()
      }
    }
  }
}