下面的脚本使用特定标签记录 Gmail 邮件的日期和主题,然后从线程中删除该标签。我不需要记录任何回复“RE:”或转发消息“FWD:”。
我有几个问题:
function myFunction() {
var ss = SpreadsheetApp.getActiveSheet();
var label = GmailApp.getUserLabelByName("Label1");
var threads = label.getThreads();
for (var i=0; i<threads.length; i++)
{
var messages = threads[i].getMessages();
for (var j=0; j<messages.length; j++)
{
var sub = messages[j].getSubject();
var dat = messages[j].getDate();
ss.appendRow([dat, ,sub])
}
threads[i].removeLabel(label);
}
}
我假设您正在使用 Gmail 过滤器应用标签,然后在记录后使用脚本将其删除。
您收到重复项的原因是您正在搜索线程并返回这些线程中的消息。
即使您从线程中删除标签,如果收到新消息并添加标签,则线程中的每条消息都会再次处理。
对于您的用例,搜索和处理 messages 而不是 threads 可能更有意义。
我为你重新调整了最近的脚本。它将批量更新消息以及电子表格更新。 IE。它将一次写入一批的所有新行,而不是在处理每条消息时都这样做。
install_trigger()
函数将为脚本创建一个基于时间的触发器。它设置为 15 分钟,但您可以通过更改 everyMinutes(15)
中的值来调整您认为合适的时间
logMessagesByLabel
来测试脚本。install_trigger
以设置基于时间的触发器。/**
* +-------------------------------+
* | Log Gmail Messages By label |
* +-------------------------------+
*
* 2024-05-04
* https://stackoverflow.com/questions/78427215
*
*/
const searchLabel = "_logme"; // Will find messages with this label then remove after processing.
const addLabel = "_alreadylogged"; // Will add this label to processed messages
const setTimeZone = "PST"
const dateFormat = "MMMM dd, yyyy HH:mm:ss";
const maxPerBatch = 250; // Maximum messages to return per search (do not exceed 500)
const maxBatchesPerRun = 4; // Maximum searches to perform each time script is run
function logMessagesByLabel() {
const ss = SpreadsheetApp.getActiveSheet();
const labels = Gmail.Users.Labels.list('me').labels;
const names = []; labels.forEach(l => names.push(l.name));
const searchId = labels[names.indexOf(searchLabel)].id;
const addId = labels[names.indexOf(addLabel)].id;
let batch = 0;
listMessages();
function listMessages(token) {
batch += 1;
console.log("Batch", batch, "starting (max " + maxBatchesPerRun + ")");
const list = Gmail.Users.Messages.list("me", {labelIds: [searchId], pageToken: token, maxResults: maxPerBatch });
token = list.nextPageToken;
const messages = list.messages;
const ids = [], values = [];
if (messages) {
let counter = 0;
const last = ss.getLastRow();
for (let i = 0; i < messages.length; i++) {
counter +=1;
let id = messages[i].id;
ids.push(id);
let hdrs = Gmail.Users.Messages.get("me", id, {format: "metadata", metadataHeaders: ["Date", "Subject"]}).payload.headers;
let os = ((hdrs[0].name == "Date") && 1) || 2;
values.push([Utilities.formatDate(new Date(hdrs[-1+os].value),setTimeZone,dateFormat),,hdrs[2-os].value]);
}
ss.getRange(last + 1,1,values.length, values[0].length).setValues(values);
Gmail.Users.Messages.batchModify({"ids": ids, "removeLabelIds": searchId, "addLabelIds": addId }, "me");
console.log("Batch", batch, "finished.", counter, "messages processed." );
} else {
console.log("Batch", batch, "finished. No messages found." )
}
while ((token) && (batch < maxBatchesPerRun)) listMessages(token);
}
}
function install_trigger(){
delete_triggers() // avoids duplicates
ScriptApp.newTrigger("logMessagesByLabel").timeBased().everyMinutes(15).create();
}
function delete_triggers(){
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
}```