将gmail消息导入电子表格,并在下一个脚本运行时仅获取新消息

时间:2015-12-13 18:41:26

标签: google-apps-script google-sheets gmail

我正在将电子邮件从特定标签导入电子表格,但在每次运行脚本时加载所有电子邮件效率不高。

我搜索过并搜索过但找不到只收到新邮件的解决方案。

我希望能采取的方法是: 使用电子邮件检查电子表格的lastrow->检查消息量。 用新消息追加行(“消息” - 最后一行)。

我希望有人能够解决这个问题,这将对我想要创建的内容产生巨大的影响!提前谢谢!

我是一个noob编码器但是创建了以下脚本来获取消息量:

function messageCount(){

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var label = ss.getRange('A1').getValue().toString();

var array = new Array();

var threads = GmailApp.search("in:" + label);

for(var n in threads){

var msg = threads[n].getMessages();
var threadCount = threads[n].getMessageCount();
array.push(threadCount);

}

var count = 0;
for(var i = 0; i < array.length; i++){

count = count + array[i];
}
var currentTransactions = count;
Logger.log(currentTransactions);

}

2 个答案:

答案 0 :(得分:0)

您可以拥有一个跟踪已处理邮件的标签(比如计数)。将标签应用于已计数的线程,并在下次运行时忽略这些。

function messageCount(){

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var label = ss.getRange('A1').getValue().toString();
  var processed = GmailApp.getUserLabelByName("Counted") || GmailApp.createLabel("Counted");
  var threads = GmailApp.search("-in:Counted in:" + label);
  var count = 0;

  for(var t in threads){    
    count += threads[t].getMessageCount();    
    threads[t].addLabel(processed);
  }

  Logger.log(count);
}

答案 1 :(得分:0)

我使用了不同的解决方案。 我不确定电子邮件ID是否具有逻辑顺序,因此我认为唯一合乎逻辑的做法是按JS时间(毫秒)对电子邮件进行排序。

我所做的是: - 获取所有电子邮件并将其转换为对象。属性键是JS时间。 - 将所有对象放在工作表中 - 在下一次运行中,检查工作表中的长度与新电子邮件批次之间是否存在差异 - 如果是这样的话:oldbatch-newbatch(长度)。 - 使用JS时间对新数组进行排序 - 将JS时间与属性键匹配,并执行一个从新收到的消息中返回mailid的对象方法

它可能效率不高,但它完成了工作。你可以在这里查看代码(abnMailMoneyFetcher()):GAS