google-apps-script - 将附件上传到云端硬盘后更改 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);
}
解决方案
您在修改调用上走在了正确的轨道上,但格式略有偏差。这里的诀窍是您需要使用标签 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;
}
推荐阅读
- prolog - 如何应用findall 查找多个字段 | 序言
- python - Numpy TypeError 必须是整数,而不是元组
- c - 带有 DMA 的 STM32L011K4 使用 I2C 启动条件未发生
- c# - 接收泛型类型的 API
- c - AI Thinker ESP32-CAM 卡编译错误
- c# - 如何在 webapi 中将查询字符串传递给 POST 请求
- python - Groupby 和命名聚合 | 优化 Pandas 中的数据框生成
- ios - 在没有导航控制器的情况下关闭以前的视图控制器时切换到新视图控制器:swift
- c# - 为什么我对 Google 自定义搜索 API 的调用失败并显示请求错误(无效参数)?
- android - 刷新房间数据库中的项目