使用Google Apps脚本标记Gmail邮件(而不是整个帖子)

时间:2017-03-28 12:14:52

标签: google-apps-script gmail

是否可以搜索带有“Apps script queue”标签的邮件,并仅为这些特定邮件(而非整个帖子)添加新标签?

当我使用GmailApp.search('label:Apps脚本队列')时,我收到了请求的消息,但是当我为这些消息分配新标签时,该线程的所有其他消息(在邮箱中的其他位置)将获得相同的标签。这不是我想要的。

3 个答案:

答案 0 :(得分:1)

在向线程中的特定消息添加标签时,此代码不会返回错误,如果使用线程列表方法,您将看到它仅放置在特定的messageID中(单独处理)。但是,一旦您的用户界面(Gmail网站)处于对话模式,它就可以在两个标签中查看。

function searchMail(){
  var threads = GmailApp.search("SOME SEARCH");
  Logger.log(threads.length);
  listLabel('me');
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    Logger.log(messages.length);

    for (var j = 0; j < messages.length; j++){
      if (messages[j].isInInbox()){
        Logger.log('me' + 'id msg: ' + messages[j].getId());
        //Add label to the first reply
        addLabel('me',messages[1].getId());
      }
      else{
       Logger.log('me' + 'id msg: ' + messages[j].getId() +" not in inbox");
      }
    }
  }
}

function addLabel(userId, messageId){

  var resource = {addLabelIds: ["Label_6"]}

  Gmail.Users.Messages.modify(resource, userId, messageId);

}

答案 1 :(得分:0)

在Gmail中,标签会应用于某个帖子,并且不能应用于某个帖子的单个电子邮件。

然而,您可以将星星/颜色应用于单个邮件。

答案 2 :(得分:0)

这是一个老话题,但是对于像我这样阅读的任何人,也许这可以为您节省一些时间:

function getLabelMap() {
  var allLabels = Gmail.Users.Labels.list('me');
  var labelMap = [];

  for (var label of allLabels.labels) {
    labelMap[label.name] = label.id;
  }
  
  return labelMap;
}

var labelMap = getLabelMap();

function getLabel(labelName) {
  return labelMap[labelName];
}

function labelMessage(messageID, labelName) {
  var labelID = getLabel(labelName);
  var labelRequest = {addLabelIds: [labelID]};
  var subject = GmailApp.getMessageById(messageID).getSubject();

  if (labelID != null) {
    Logger.log("Labelling as %s: %s", labelName, subject);
    Gmail.Users.Messages.modify(labelRequest, 'me', messageID);
  } else {
    Logger.log("Label not found: %s", labelName);
  }
}

function unlabelMessage(messageID, labelName) {
  var labelID = getLabel(labelName);
  var labelRequest = {removeLabelIds: [labelID]};
  var subject = GmailApp.getMessageById(messageID).getSubject();

  if (labelID != null) {
    Logger.log("Removing label %s: %s", labelName, subject);
    Gmail.Users.Messages.modify(labelRequest, 'me', messageID);
  } else {
    Logger.log("Label not found: %s", labelName);
  }
}

function reLabel () {

  var messagesToRelabel = Gmail.Users.Messages.list('me', {'q':'label:Apps-script-queue'}).messages || [];

  // Loop through each message (not by thread), using the Advanced Gmail Service (full GMail API in a Google Script).
  messagesToRelabel.forEach(function (messageToRelabel){
    unlabelMessage(messageToRelabel.id, "Apps script queue");
    labelMessage(messageToRelabel.id, "New label");
  });

}

OP并没有要求,但可能对其他尝试使用GMail API进行“高级过滤/标记”的人有所帮助:

function getMessageHeader(messageID, headerField) {
  var messageInfo = Gmail.Users.Messages.get('me', messageID, {'format':'METADATA', 'metadataHeaders':[headerField]});

  if (messageInfo.payload.headers) {
    return messageInfo.payload.headers[0].value;
  } else {
    return null;
  }
}

以上内容可让您过滤标题信息,例如我用它来检查X-Uniform-Type-Identifier是否等于com.apple.mail-note,以自动将旧的Apple Notes标记为删除。