Gmail 至不重复的工作表

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

脚本正在从收件箱中提取所需的信息,但是我不需要将 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);
  }
}
javascript google-sheets google-apps-script gmail polling
1个回答
0
投票

我假设您正在使用 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));
}

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