在接收电子邮件时触发的Google Gmail邮件脚本

时间:2018-04-26 00:04:43

标签: google-apps-script gmail gmail-addons

我一直在阅读gmail addons。它们具有在您打开电子邮件时触发的上下文触发器。

我收到电子邮件时是否可以触发服务?我能找到的最好的是unconditional,但只有在打开电子邮件时才会触发。

4 个答案:

答案 0 :(得分:3)

您无法为每封电子邮件创建触发器,但您可以执行类似as described in this answer的操作。

例如,你可以:

  1. 设置一个过滤器,在您要处理的传入电子邮件上添加特殊标签。

  2. 设置一个每10分钟甚至每分钟运行一次的重复出现的脚本。在脚本中,您可以提取所有具有给定标签的电子邮件,并相应地处理它们,完成后删除标签。

  3. function processEmails() {
      var label = GmailApp.getUserLabelByName("Need To Process");
      var threads = label.getThreads();  
      for (var i = threads.length - 1; i >= 0; i--) {
        //Process them in the order received
        threads[i].removeLabel(label).refresh();
      }
    }
    

    然后,您可以在time based trigger上设置此项,以使其按照您的意愿运行。

    如果您想跟踪已处理的电子邮件,可以创建另一个"已处理的电子邮件"标签,并在处理完毕后将其添加到邮件中。

答案 1 :(得分:0)

我在正确设置标签时遇到了一些麻烦,因此我包含了用于记录标签的代码。我还修改了user3312395的代码,也添加了新标签。 也感谢您的原始答案!

function emailTrigger() {

  var label = GmailApp.getUserLabelByName('Name of Label to Process');
  var newLabel = GmailApp.getUserLabelByName('New Label Name');

  if(label != null){
    var threads = label.getThreads();
    for (var i=0; i<threads.length; i++) {
      //Process them in the order received
      threads[i].removeLabel(label);
      threads[i].addLabel(newLabel);
      //run whatever else here
    }
  }

}

function getLabels(){
  var labels = GmailApp.getUserLabels();
  for(i=0; i<labels.length; i++){
    Logger.log(labels[i].getName());
  }
}

答案 2 :(得分:0)

实际上,它们具有较为复杂的发布/订阅服务,需要设置OAuth身份验证。使用此服务,您将必须能够获得推送通知。但我也认为,设置触发器以每10分钟甚至1分钟运行一次会更容易。

答案 3 :(得分:0)

是的,您可以为每封新电子邮件触发一个函数!

只需使用搜索查询 newer_than:1h。例如,让您的触发器每 10 分钟运行一次。然后,您将基本上为每封新电子邮件运行逻辑(最多延迟 10 分钟,这可能没问题)。

var TRIGGER_NAME = 'handleNewEmails'

// Maximum number of threads to process per run.
var PAGE_SIZE = 150

var INTERVAL = 10

function Install() {
    // First run 2 mins after install
    ScriptApp.newTrigger(TRIGGER_NAME)
        .timeBased()
        .at(new Date(new Date().getTime() + 1000 * 60 * 2))
        .create()

    // Run every 10 minutes there after
    ScriptApp.newTrigger(TRIGGER_NAME)
        .timeBased().everyMinutes(INTERVAL).create()
}

function Uninstall() {
    var triggers = ScriptApp.getProjectTriggers()
    for (var i = 0; i < triggers.length; i++) {
        if (triggers[i].getHandlerFunction() === TRIGGER_NAME) ScriptApp.deleteTrigger(triggers[i])
    }
}

function handleNewEmails() {
    var threads = GmailApp.search("newer_than:1h", 0, PAGE_SIZE)
    for (var i = 0; i < threads.length; i++) {
        var thread = threads[i]

        // Do something with the thread.
    }
}