脚本正在从收件箱中提取所需的信息,但是我不需要将 RE 或 FWD 电子邮件填充到工作表上。
该脚本也只运行 1 次,我需要它至少每 30 分钟到一小时将新收到的电子邮件填充到工作表中。
由于脚本仅运行一次,当我单击运行时,它会生成重复项,因为它将整个标签拉到工作表上。如何让脚本只生成新数据?
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 过滤器应用标签,然后在记录后使用脚本将其删除。
您收到重复项的原因是您正在搜索线程并返回这些线程中的消息。
即使您从线程中删除标签,如果收到新消息并添加标签,则线程中的每条消息都会再次处理。
对于您的用例,搜索和处理消息而不是线程可能更有意义。
我为你重新调整了最近的脚本。它将批量更新消息以及电子表格更新。 IE。它将一次写入一批的所有新行,而不是在处理每条消息时都这样做。
install_trigger()
函数将为脚本创建一个基于时间的触发器。它设置为 15 分钟,但您可以通过更改 everyMinutes(15)
中的值来调整您认为合适的时间
/**
* +-------------------------------+
* | Log Gmail Messages By Label |
* +-------------------------------+
*
* 2024-05-04
* https://stackoverflow.com/questions/78427215
*
*/
const label = "Label1";
const maxPerBatch = 250;
const maxBatchesPerRun = 4;
const zone = "America/New_York"
const dateFormat = "MMMM dd, yyyy HH:mm:ss";
function logMessagesByLabel() {
const ss = SpreadsheetApp.getActiveSheet();
const labels = Gmail.Users.Labels.list('me').labels;
let labelId = "";
labels.forEach(l => (l.name == label) && (labelId = l.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: [labelId], 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),zone,dateFormat),,hdrs[2-os].value]);
}
ss.getRange(last + 1,1,values.length, values[0].length).setValues(values);
Gmail.Users.Messages.batchModify({"ids": ids, "removeLabelIds": labelId}, "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("findEmptyMsgBodies").timeBased().everyMinutes(15).create();
}
function delete_triggers(){
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
}