【问题标题】:Change Gmail label once attachment is uploaded to drive将附件上传到云端硬盘后更改 Gmail 标签
【发布时间】:2020-03-06 05:25:46
【问题描述】:

如何删除现有标签“全球酒精”并使用以下代码向已将附件上传到 Google 云端硬盘的电子邮件添加“全球已处理”标签?我必须感谢 Cooper,他回答了我的第一个问题并帮助我完成了上传工作。

function saveAttachmentInFolder(){
  var folder = DriveApp.getFolderById('xxxxxxxxxxxxx');
  var userId = "myemail@gmail.com";
  var query = "label:Global Alcohol";
  var res = Gmail.Users.Messages.list(userId, {q: query});//I assumed that this works
  res.messages.forEach(function(m){
    var attA=GmailApp.getMessageById(m.id).getAttachments();
    attA.forEach(function(a){
      var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "yyMMddHHmmss");
      folder.createFile(a.copyBlob()).setName(a.getName()+ts);
    });
  });
}

我已阅读 API 文档 & 可以看到您需要使用以下代码来修改标签。但是我不知道如何将它集成到上面的函数中。

function modifyMessage(userId, messageId, labelsToAdd, labelsToRemove, callback) {
  var request = gapi.client.gmail.users.messages.modify({
    'userId': userId,
    'id': messageId,
    'addLabelIds': labelsToAdd,
    'removeLabelIds': labelsToRemove
  });
  request.execute(callback);
}

【问题讨论】:

    标签: google-apps-script gmail-api


    【解决方案1】:

    您在修改调用方面走在了正确的轨道上,但格式略有偏差。这里的诀窍是您需要使用标签 ID,因此我编写了一个新函数 getLabelsByName(),它允许您执行该查找。

    function saveAttachmentInFolder(){
      var folder = DriveApp.getFolderById('xxxxxxxxxxxxx');
      var userId = "myemail@gmail.com";
      var query = "label:Global Alcohol";
      var labels = getLabelsByName(userId, ["Global Alcohol", "Global Processed"]);
      var res = Gmail.Users.Messages.list(userId, {q: query});//I assumed that this works  
      res.messages.forEach(function(m){
        var attA=GmailApp.getMessageById(m.id).getAttachments();
        attA.forEach(function(a){
          var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "yyMMddHHmmss");
          folder.createFile(a.copyBlob()).setName(a.getName()+ts);
        });
    
        // Remove the old label & add the new one
        Gmail.Users.Messages.modify({
          addLabelIds: [labels["Global Processed"].id],
          removeLabelIds: [labels["Global Alcohol"].id]
        }, userId, m.id);
      });
    }
    
    /**
     * Lookup any number of labels by their name using the advanced Gmail service.
     * @param {String} userId - The user's email address or "me" to get your own
     * @param {String[]} labelNames - An array of labels names to search for
     * @returns {Label{}} - Map of labels identified by label name
     * https://developers.google.com/gmail/api/v1/reference/users/labels
     */
    function getLabelsByName(userId, labelNames) {
      var response = Gmail.Users.Labels.list(userId);
      var selectedLabels = {};
      for (var i = 0; i < response.labels.length; i++) {
        var label = response.labels[i];
        if (labelNames.indexOf(label.name) != -1) {
          selectedLabels[label.name] = label;
        }
      }
      return selectedLabels;
    }
    

    【讨论】:

    • 您好 Diego,感谢您的解释和帮助。唯一的问题是,使用“message.getThread() 方法更改标签会导致来自同一发件人的不需要的电子邮件在不同的标签中被处理。Gmail 认为它们是线程的一部分。因此,更改标签的方法标签需要通过消息 ID,而不是线程 - 据我所知。有什么想法吗?
    • @BradLegassick 明白了。在这种情况下,您可以继续使用高级 gmail 服务。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多