Google Apps 脚本 - 如何阻止新消息进入旧线程?
Google Apps Script - How to stop new messages from going into old threads?
我有一个 Google Apps 脚本,它通过带有标签“传入”的线程进行解析,将它们触发到 webhook,然后将它们标记为“已发送”。
function send() {
var label = GmailApp.getUserLabelByName('incoming');
var sentlabel = GmailApp.getUserLabelByName('sent');
var messages = [];
var threads = label.getThreads();
for (var i = 0; i < threads.length; i++) {
messages = messages.concat(threads[i].getMessages())
}
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
Logger.log(message);
var payload = {
"from": message.getFrom(),
"to": message.getTo(),
"cc": message.getCc(),
"date": message.getDate(),
"subject": message.getSubject(),
"txtbody": message.getPlainBody()
};
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload),
};
var webhookUrl = '<redacted>';
UrlFetchApp.fetch(webhookUrl, options);
}
// remove the label from these threads so we don't send them to
// slack again next time the script is run
label.removeFromThreads(threads);
Utilities.sleep(200);
sentlabel.addToThreads(threads);
for (var i = 0; i < threads.length; i++) {
threads[i].moveToArchive();
}
}
问题是,因为这些电子邮件是由服务生成的,所以它们具有相似的主题 - 有时是相同的主题(我无法在服务中更改)
假设主题是“X1 上的更新”。
当收到“更新 X1”的电子邮件时 - 脚本工作正常,请放心发送。
但是,如果有新的“X1 上的更新”出现,它会同时发送新的和旧的,因为 Gmail 会标记整个线程。
这会导致大量重复。我该如何解决这个问题?
我想阐明 Gmail 上的线程标签。
截至目前(以及可预见的未来),一个线程将具有来自其消息的所有标签。
这对您仍然有帮助,因为您可以快速隔离哪些线程包含带有 "incoming" 标签的消息。
如果您指的不是 'incoming' 而是收件箱中的消息(收到的消息),那么您可以查找标签 'INBOX',如 here.
所示
有了这个消息子列表,您就可以用 thread.getMessages()
. Then you can use the Advanced Google services for Gmail in order to call the Users.messages.get
to retrieve the Message
表示来处理包含的消息,包括它的标签列表 labelIds[]
。
然后您可以操作每封邮件并在发送邮件时为其添加标签。
备选方案
另一种解决方案是使用某种形式的存储来存储已处理的 messageId
s,然后在将它们发送给您 webhook 之前检查它们。
您可以使用 JDBC connection on Apps Script, Firebase Realtime Database 甚至您自己的 DIY Google 文档解决方案来做到这一点。
这不是必需的,但如果您希望存储邮件以便在 Gmail 外部进行长期查询,这会很有用。
我有一个 Google Apps 脚本,它通过带有标签“传入”的线程进行解析,将它们触发到 webhook,然后将它们标记为“已发送”。
function send() {
var label = GmailApp.getUserLabelByName('incoming');
var sentlabel = GmailApp.getUserLabelByName('sent');
var messages = [];
var threads = label.getThreads();
for (var i = 0; i < threads.length; i++) {
messages = messages.concat(threads[i].getMessages())
}
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
Logger.log(message);
var payload = {
"from": message.getFrom(),
"to": message.getTo(),
"cc": message.getCc(),
"date": message.getDate(),
"subject": message.getSubject(),
"txtbody": message.getPlainBody()
};
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload),
};
var webhookUrl = '<redacted>';
UrlFetchApp.fetch(webhookUrl, options);
}
// remove the label from these threads so we don't send them to
// slack again next time the script is run
label.removeFromThreads(threads);
Utilities.sleep(200);
sentlabel.addToThreads(threads);
for (var i = 0; i < threads.length; i++) {
threads[i].moveToArchive();
}
}
问题是,因为这些电子邮件是由服务生成的,所以它们具有相似的主题 - 有时是相同的主题(我无法在服务中更改)
假设主题是“X1 上的更新”。
当收到“更新 X1”的电子邮件时 - 脚本工作正常,请放心发送。
但是,如果有新的“X1 上的更新”出现,它会同时发送新的和旧的,因为 Gmail 会标记整个线程。
这会导致大量重复。我该如何解决这个问题?
我想阐明 Gmail 上的线程标签。
截至目前(以及可预见的未来),一个线程将具有来自其消息的所有标签。
这对您仍然有帮助,因为您可以快速隔离哪些线程包含带有 "incoming" 标签的消息。
如果您指的不是 'incoming' 而是收件箱中的消息(收到的消息),那么您可以查找标签 'INBOX',如 here.
所示有了这个消息子列表,您就可以用 thread.getMessages()
. Then you can use the Advanced Google services for Gmail in order to call the Users.messages.get
to retrieve the Message
表示来处理包含的消息,包括它的标签列表 labelIds[]
。
然后您可以操作每封邮件并在发送邮件时为其添加标签。
备选方案
另一种解决方案是使用某种形式的存储来存储已处理的 messageId
s,然后在将它们发送给您 webhook 之前检查它们。
您可以使用 JDBC connection on Apps Script, Firebase Realtime Database 甚至您自己的 DIY Google 文档解决方案来做到这一点。
这不是必需的,但如果您希望存储邮件以便在 Gmail 外部进行长期查询,这会很有用。