将带标签的消息记录到表格中会产生重复项

问题描述 投票:0回答:1

下面的脚本使用特定标签记录 Gmail 邮件的日期和主题,然后从线程中删除该标签。我不需要记录任何回复“RE:”或转发消息“FWD:”。

我有几个问题:

  1. 该脚本手动运行,但我希望它每 30 分钟到一个小时自动运行一次。
  2. 脚本每次将带标签的消息拉到工作表时都会生成重复项。如何让脚本只生成新数据?
  3. 我希望脚本在删除旧标签后添加一个新标签,以便我可以看到哪些消息已被处理。

脚本

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);
  }
}
javascript google-sheets google-apps-script gmail
1个回答
0
投票

我假设您正在使用 Gmail 过滤器应用标签,然后在记录后使用脚本将其删除。

您收到重复项的原因是您正在搜索线程并返回这些线程中的消息。

即使您从线程中删除标签,如果收到新消息并添加标签,则线程中的每条消息都会再次处理。

对于您的用例,搜索和处理 messages 而不是 threads 可能更有意义。

我为你重新调整了最近的脚本。它将批量更新消息以及电子表格更新。 IE。它将一次写入一批的所有新行,而不是在处理每条消息时都这样做。

install_trigger()
函数将为脚本创建一个基于时间的触发器。它设置为 15 分钟,但您可以通过更改
everyMinutes(15)

中的值来调整您认为合适的时间

使用说明

  1. 在您想要记录日志的位置创建并命名一个单表电子表格。
  2. 单击扩展菜单,然后单击应用程序脚本
  3. 粘贴以下代码并保存。
  4. 单击左侧菜单中的服务,然后向下滚动并选择GMAIL
  5. 通过从编辑器运行
    logMessagesByLabel
    来测试脚本。
  6. 如果有任何错误,请确保用户标签存在。
  7. 如果运行正常,请从编辑器运行
    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));
}```


© www.soinside.com 2019 - 2024. All rights reserved.