Google apps script 一旦附件上传到硬盘,更改Gmail标签

Google apps script 一旦附件上传到硬盘,更改Gmail标签,google-apps-script,gmail-api,Google Apps Script,Gmail Api,如何删除现有标签“Global Alcohol”&并使用以下代码将“Global Processed”标签添加到已将附件上载到Google Drive的电子邮件中?我必须感谢库珀,他回答了我的第一个问题,帮助我完成了上传 函数saveAttachmentFolder(){ var folder=DriveApp.getFolderById('xxxxxxxxxxxx'); var userId=”myemail@gmail.com"; var query=“标签:全局酒精”; var res=

如何删除现有标签“Global Alcohol”&并使用以下代码将“Global Processed”标签添加到已将附件上载到Google Drive的电子邮件中?我必须感谢库珀,他回答了我的第一个问题,帮助我完成了上传

函数saveAttachmentFolder(){ var folder=DriveApp.getFolderById('xxxxxxxxxxxx'); var userId=”myemail@gmail.com"; var query=“标签:全局酒精”; var res=Gmail.Users.Messages.list(userId,{q:query});//我假设这是可行的 res.messages.forEach(函数(m){ var attA=GmailApp.getMessageById(m.id).getAttachments(); 附件forEach(功能(a){ var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),“yyMMddHHmmss”); folder.createFile(a.copyBlob()).setName(a.getName()+ts); }); });
}您的修改调用是正确的,但是格式有点不正确。这里的诀窍是您需要使用标签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;
}
函数saveAttachmentFolder(){ var folder=DriveApp.getFolderById('xxxxxxxxxxxx'); var userId=”myemail@gmail.com"; var query=“标签:全局酒精”; var labels=getLabelsByName(userId,[“全局酒精”,“全局处理”]); var res=Gmail.Users.Messages.list(userId,{q:query});//我假设这是可行的 res.messages.forEach(函数(m){ var attA=GmailApp.getMessageById(m.id).getAttachments(); 附件forEach(功能(a){ var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),“yyMMddHHmmss”); folder.createFile(a.copyBlob()).setName(a.getName()+ts); }); //删除旧标签并添加新标签 Gmail.Users.Messages.modify({ AddLabelId:[标签[“全局已处理”].id], removeLabelIds:[标签[“全球酒精”].id] },userId,m.id); }); } /** *使用高级Gmail服务按标签名称查找任意数量的标签。 *@param{String}userId-用户的电子邮件地址或“我”来获取您自己的电子邮件地址 *@param{String[]}labelNames-要搜索的标签名称数组 *@returns{Label{}}-由标签名标识的标签映射 * https://developers.google.com/gmail/api/v1/reference/users/labels */ 函数getLabelsByName(userId,labelNames){ var-response=Gmail.Users.Labels.list(userId); var selectedLabels={}; 对于(var i=0;i你好,迭戈,谢谢你的解释和帮助。唯一的问题是使用“message.getThread()更改标签的方法会导致来自同一发件人的不需要的电子邮件被处理,这些邮件位于不同的标签中。Gmail认为它们是线程的一部分。因此,更改标签的方法需要通过邮件id,而不是线程-据我所知。有什么想法吗?@BradLegassick理解。在这种情况下,您的思路是正确的继续使用高级gmail服务。我已经更新了答案。