gpt4 book ai didi

javascript - GmailApp - 为特定邮件添加标签,而不是线程

转载 作者:行者123 更新时间:2023-11-30 07:36:39 24 4
gpt4 key购买 nike

我正在构建一个脚本,每天自动将我的电子邮件从一个标签移动到下一个标签(这样存储的标记为“5 天”的邮件明天将自动标记为“4 天”,然后“3 天”之后的一天,依此类推)。

问题在于它会将标签应用于整个线程,而不仅仅是消息 - 如果您关闭了对话 View 并且将各种电子邮件分隔在不同的标签下,这就会出现问题。

这是我的脚本(有一个每日触发器):

function moveUp(previousLabel, newLabel) {
var threads = GmailApp.getUserLabelByName(previousLabel).getThreads()
var numThreads = threads.length
if (numThreads>0) {
for(var i = 0; i < numThreads; i++) {

if(GmailApp.getUserLabelByName(previousLabel).getThreads().length>0) {
var lastThread = GmailApp.getUserLabelByName(previousLabel).getThreads()[0]
GmailApp.getUserLabelByName(newLabel).addToThread(lastThread.markUnread());
GmailApp.getUserLabelByName(previousLabel).removeFromThread(lastThread)
Utilities.sleep(200)
} else {
{break;}
}
}
}
}

function myFunction() {
var threads = GmailApp.getUserLabelByName("-To Do/1 Day").getThreads()
var numThreads = threads.length
if (numThreads>0) {
for(var i = 0; i < numThreads; i++) {

if(GmailApp.getUserLabelByName("-To Do/1 Day").getThreads().length>0) {
var lastThread = GmailApp.getUserLabelByName("-To Do/1 Day").getThreads()[0]
lastThread.moveToInbox().markUnread();
GmailApp.getUserLabelByName("-To Do/1 Day").removeFromThread(lastThread)
Utilities.sleep(200)
} else {
{break;}
}
}
}
moveUp("-To Do/2 Days", "-To Do/1 Day")
moveUp("-To Do/3 Days", "-To Do/2 Days")
moveUp("-To Do/4 Days", "-To Do/3 Days")
moveUp("-To Do/5 Days", "-To Do/4 Days")
}

那么有人知道如何只将标签应用于特定消息吗?或者实现相同结果的解决方法?

谢谢

最佳答案

您可以使用 GMail API 执行此操作反而。您需要为您的项目启用 API。在编辑器中,选择 Resources > Advanced Google services,然后点击“这些服务也必须在 Google Developers Console 中启用”。在那里,启用 GMail API。

修改消息

使用示例:

modifyMessage('me', messageId, ['stack','overflow']);       // add two labels
modifyMessage('me', messageId, null, ['stack','overflow']); // remove two labels

TL;DR 完整代码可用in this gist , 以及下方隐藏的代码片段。

/**
* Modify the Labels a Message is associated with.
* Throws if unsuccessful.
* see https://developers.google.com/gmail/api/v1/reference/users/messages/modify
*
* @param {String} userId User's email address. The special value 'me'
* can be used to indicate the authenticated user.
* @param {String} messageId ID of Message to modify.
* @param {String[]} labelsToAdd Array of Label names to add.
* @param {String[]} labelsToRemove Array of Label names to remove.
*
* @returns {Object} Users.messages resource, see reference.
*/
function modifyMessage(userId, messageId, labelsToAdd, labelsToRemove) {
labelsToAdd = labelsToAdd || [];
labelsToRemove = labelsToRemove || [];
// see https://developers.google.com/gmail/api/v1/reference/users/messages/modify
var url = 'https://www.googleapis.com/gmail/v1/users/${userId}/messages/${id}/modify'
.replace("${userId}","me")
.replace("${id}", messageId );
var headers = {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
};
var addLabelIds = [];
for (var i=0; i<labelsToAdd.length; i++) {
addLabelIds[i] = getLabelId( labelsToAdd[i] );
}
var removeLabelIds = [];
for (var i=0; i<labelsToRemove.length; i++) {
removeLabelIds[i] = getLabelId( labelsToRemove[i], false );
}
var request = {
'addLabelIds': addLabelIds,
'removeLabelIds': removeLabelIds
};
var params = {
method: "post",
contentType: "application/json",
headers: headers,
payload: JSON.stringify(request),
muteHttpExceptions: true
};
//var check = UrlFetchApp.getRequest(url, params); // for debugging
var response = UrlFetchApp.fetch(url, params);

var result = response.getResponseCode();
if (result == '200') { // OK
return JSON.parse(response.getContentText());
}
else {
// This is only needed when muteHttpExceptions == true
var err = JSON.parse(response.getContentText());
throw new Error( 'Error (' + result + ") " + err.error.message );
}
}

/**
* Get the Label ID for the given LabelName. If Label isn't found, it will be created
* depending on the state of ok2Create.
* Throws if unsuccessful.
* See https://developers.google.com/gmail/api/v1/reference/users/messages/modify.
*
* @param {String} labelName Name of label to retrieve ID for.
* @param {Boolean} ok2Create (optional) Set true if a label should be created when not found.
* Default is true.
*
* @returns {String} ID of Label, or null if not found or created.
*/
function getLabelId( labelName, ok2Create ) {
if (typeof ok2Create == 'undefined') ok2Create = true;

var id = null;
// see https://developers.google.com/gmail/api/v1/reference/users/labels/list
var url = 'https://www.googleapis.com/gmail/v1/users/${userId}/labels'
.replace("${userId}","me") // The user's email address. The special value me can be used to indicate the authenticated user.
var headers = {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
};
var params = {
method: "get",
contentType: "application/json",
headers: headers,
muteHttpExceptions: true
};

//var check = UrlFetchApp.getRequest(url, params); // for debugging
var response = UrlFetchApp.fetch(url, params);

var result = response.getResponseCode();
if (result == '200') { // OK
var labels = JSON.parse(response.getContentText()).labels;
var found = false;
for (var i=0; i<labels.length & !found; i++) {
if (labels[i].name == labelName) {
found = true;
id = labels[i].id;
}
}
if (!found && ok2Create) {
id = createLabel( labelName );
}
return id;
}
else {
// This is only needed when muteHttpExceptions == true
var err = JSON.parse(response.getContentText());
throw new Error( 'Error (' + result + ") " + err.error.message );
}
}

/**
* Create Label for given `labelName`.
* Throws if unsuccessful.
* See https://developers.google.com/gmail/api/v1/reference/users/messages/modify.
*
* @param {String} labelName Name of label to create
*
* @returns {String} ID of Label.
*/
function createLabel( labelName ) {
var id = null;
// see https://developers.google.com/gmail/api/v1/reference/users/labels/create
var url = 'https://www.googleapis.com/gmail/v1/users/${userId}/labels'
.replace("${userId}","me") // The user's email address. The special value me can be used to indicate the authenticated user.
var headers = {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
};
var request = {
'name': labelName
};
var params = {
method: "post",
contentType: "application/json",
headers: headers,
payload: JSON.stringify(request),
muteHttpExceptions: true
};

//var check = UrlFetchApp.getRequest(url, params); // for debugging
var response = UrlFetchApp.fetch(url, params);

var result = response.getResponseCode();
if (result == '200') { // OK
var label = JSON.parse(response.getContentText());
id = label.id;
return id;
}
else {
// This is only needed when muteHttpExceptions == true
var err = JSON.parse(response.getContentText());
throw new Error( 'Error (' + result + ") " + err.error.message );
}
}

/**
* Modify the Labels a Message is associated with.
* Throws if unsuccessful.
* see https://developers.google.com/gmail/api/v1/reference/users/messages/modify
*
* @param {String} userId User's email address. The special value 'me'
* can be used to indicate the authenticated user.
* @param {String} messageId ID of Message to modify.
* @param {String[]} labelsToAdd Array of Label names to add.
* @param {String[]} labelsToRemove Array of Label names to remove.
*
* @returns {Object} Users.messages resource, see reference.
*/
function modifyMessage(userId, messageId, labelsToAdd, labelsToRemove) {
labelsToAdd = labelsToAdd || [];
labelsToRemove = labelsToRemove || [];
// see https://developers.google.com/gmail/api/v1/reference/users/messages/modify
var url = 'https://www.googleapis.com/gmail/v1/users/${userId}/messages/${id}/modify'
.replace("${userId}","me")
.replace("${id}", messageId );

GMail API 是一个 RESTful API,与使用内置 GMailApp 服务提供的服务相比,它可以更灵活、更详细地访问线程、消息、标签、草稿和历史记录。在我们的脚本中,我们通过 URL 访问 API - 在这里,我们首先在 modify Message 方法的基本 URL 中填写详细信息。

  var headers = {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
};

除了为我们的项目启用 API 之外,每个请求都需要用户身份验证,这是通过嵌入 Bearer Token 来完成的。在命令头中。

接下来,我们将构建其余的命令参数。

  var addLabelIds = [];
for (var i=0; i<labelsToAdd.length; i++) {
addLabelIds[i] = getLabelId( labelsToAdd[i] );
}
var removeLabelIds = [];
for (i=0; i<labelsToRemove.length; i++) {
removeLabelIds[i] = getLabelId( labelsToRemove[i], false );
}
var request = {
'addLabelIds': addLabelIds,
'removeLabelIds': removeLabelIds
};

modify 的规范调用了一个POST 操作,其负载包含标签 ID 列表。这些 ID 无法通过内置的 GMail 服务获得,因此我们也将为此使用 GMail API - getLabelId() 是另一个与此类似的函数,专门用于检索标签的 ID按名称,并根据需要创建新标签。请参阅该代码的要点或片段。

  var params = {
method: "post",
contentType: "application/json",
headers: headers,
payload: JSON.stringify(request),
muteHttpExceptions: true
};
//var check = UrlFetchApp.getRequest(url, params); // for debugging
var response = UrlFetchApp.fetch(url, params);

最后,我们为命令组装了 params 对象,其属性包含带有我们的身份验证 token 的 headers 和带有命令参数,stringify-d 用于传输。设置 muteHttpExceptions: true 会在出现故障时抑制系统生成的异常,以便我们自己处理它们。

我已经注释掉了对 UrlFetchApp.getRequest() 的调用 - 在发送之前验证命令的内容很方便。

UrlFetchApp.fetch() 的调用将我们的命令传输到在我们在顶部构建的 URL 上运行的服务。

  var result = response.getResponseCode();
if (result == '200') { // OK
return JSON.parse(response.getContentText());
}

收到响应后,我们首先检查命令的结果,其格式为HTTP Status Code。 . 200 OK 告诉我们成功了,所以我们继续并从响应中提取结果。 JSON.parse() 转换 JSON string在消息中放入一个 JavaScript 对象,我们将其返回给调用者。

  else {
// This is only needed when muteHttpExceptions == true
var err = JSON.parse(response.getContentText());
throw new Error( 'Error (' + result + ") " + err.error.message );
}
}

但是,如果遇到错误,我们会抛出自己的异常。根据命令的详细信息,我们可能希望以不同方式处理特定错误。例如,在这个 modify 命令中,如果我们提供一个不存在的标签 ID,我们将收到一个错误:

Error: Error (400) Invalid label: "Invalid-label"

关于javascript - GmailApp - 为特定邮件添加标签,而不是线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30798530/

24 4 0