将带有特定 Gmail 标签的电子邮件复制到电子表格,不要重复
Copy emails with a specific Gmail label to Spreadsheet, without duplicates
我正在尝试制作一个脚本,将特定标签内的电子邮件放入 Google 表格中。我现在正在使用这个功能:
function getMessagesWithLabel() {
var destArray = new Array();
var threads = GmailApp.getUserLabelByName('Facebook').getThreads(0,10);
for(var n in threads){
var msg = threads[n].getMessages();
var destArrayRow = new Array();
destArrayRow.push('thread has '+threads[n].getMessageCount()+' messages');
for(var m in msg){
destArrayRow.push(msg[m].getSubject());
}
destArray.push(destArrayRow);
}
Logger.log(destArray);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
if(ss.getLastRow()==0){sh.getRange(1,1).setValue('getMessagesWithLabel() RESULTS')};
sh.getRange(ss.getLastRow()+1,1,destArray.length,destArray[0].length).setValues(destArray)
}
这可以抓取 'Facebook' 标签中的所有电子邮件,但每次都会抓取所有电子邮件,每次运行时都会创建副本。我希望它在每次将新行放入 'Facebook' 标签时创建一个新行。
四个想法供您探索。
- 使用
GmailMessage.getDate()
to filter out messages you've already handled. Store the time that the script runs in ScriptProperties
并在下次重新加载它作为您的阈值。
- 每条消息都有自己唯一的 ID,因此将其与正文一起记录下来将为您提供一个查找键。我认为这会比第一个选项慢,但如果您将键值存储在
ScriptProperties
. 中可能会快得多
使用 search()
匹配标签和时间,再次跟踪脚本何时在 ScriptProperties
.
中包含 运行
var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');
这将为 线程 提供在给定日期之后添加的任何消息,但线程也会有该日期之前的消息。您可能仍然需要使用较早的选项之一来过滤掉它们。 (除非,正如您在评论中指出的那样,您的主题将没有回复,因此只有一条消息。)
处理线程后,删除您用于对其进行分类的标签。
var oldLabel = GmailApp.getUserLabelByName('Facebook');
var newLabel = GmailApp.getUserLabelByName('Facebook-processed');
var threads = oldLabel.getThreads(0,10);
for(var n in threads){
...
threads[n].removeLabel(oldLabel).addLabel(newLabel);
}
我正在尝试制作一个脚本,将特定标签内的电子邮件放入 Google 表格中。我现在正在使用这个功能:
function getMessagesWithLabel() {
var destArray = new Array();
var threads = GmailApp.getUserLabelByName('Facebook').getThreads(0,10);
for(var n in threads){
var msg = threads[n].getMessages();
var destArrayRow = new Array();
destArrayRow.push('thread has '+threads[n].getMessageCount()+' messages');
for(var m in msg){
destArrayRow.push(msg[m].getSubject());
}
destArray.push(destArrayRow);
}
Logger.log(destArray);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
if(ss.getLastRow()==0){sh.getRange(1,1).setValue('getMessagesWithLabel() RESULTS')};
sh.getRange(ss.getLastRow()+1,1,destArray.length,destArray[0].length).setValues(destArray)
}
这可以抓取 'Facebook' 标签中的所有电子邮件,但每次都会抓取所有电子邮件,每次运行时都会创建副本。我希望它在每次将新行放入 'Facebook' 标签时创建一个新行。
四个想法供您探索。
- 使用
GmailMessage.getDate()
to filter out messages you've already handled. Store the time that the script runs inScriptProperties
并在下次重新加载它作为您的阈值。 - 每条消息都有自己唯一的 ID,因此将其与正文一起记录下来将为您提供一个查找键。我认为这会比第一个选项慢,但如果您将键值存储在
ScriptProperties
. 中可能会快得多
使用
中包含 运行search()
匹配标签和时间,再次跟踪脚本何时在ScriptProperties
.var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');
这将为 线程 提供在给定日期之后添加的任何消息,但线程也会有该日期之前的消息。您可能仍然需要使用较早的选项之一来过滤掉它们。 (除非,正如您在评论中指出的那样,您的主题将没有回复,因此只有一条消息。)
处理线程后,删除您用于对其进行分类的标签。
var oldLabel = GmailApp.getUserLabelByName('Facebook'); var newLabel = GmailApp.getUserLabelByName('Facebook-processed'); var threads = oldLabel.getThreads(0,10); for(var n in threads){ ... threads[n].removeLabel(oldLabel).addLabel(newLabel); }