首页 > 解决方案 > 将附件上传到云端硬盘后更改 Gmail 标签

问题描述

如何删除现有标签“全球酒精”并使用以下代码向已将附件上传到 Google Drive 的电子邮件添加“全球处理”标签?我必须感谢 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-scriptgmail-api

解决方案


您在修改调用上走在了正确的轨道上,但格式略有偏差。这里的诀窍是您需要使用标签 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;
}

推荐阅读