我有一个相当大的脚本,运行几个函数,用于自动化我的结算过程。脚本的一个方面是对发送和接收的电子邮件消息应用每分钟计算一次,以估计花费的时间。这适用于单个电子邮件消息。然而,回复引发了这个问题。如果在一个帖子中有几十个回复/消息,当我尝试处理的实际电子邮件是一个句子时,我最终会收到一条5,000+字的消息。
目前我用来尝试隔离新方法似乎非常笨拙。我将整个邮件正文作为字符串抓取,然后将其传递给我粘贴在下面的函数。然后我使用正则表达式尝试根据我收到的电子邮件结尾处或附近常见的文本和标记来查找第一条消息的结尾。然后我尝试清理格式以获得最新消息的准确字数。
这是我使用的脚本:
/////////////////////////////////////////////////
// EMAILS -- ISOLATE THE NEW MESSAGE &
// IGNORE INCLUDED FORWARDS
/////////////////////////////////////////////////
function email_IsolateNewMessage(messageString) {
var bodyCleaned = [],
bodyTRIM, length, newMessage;
var minMsgLength = 10;
var regex = /<div\sclass\=\"gmail\_quote\"\>|On .*20[0-9]{2}.*@.*\..*wrote\:|-\s?Original\sMessage\s?-|<div\slang="EN-US"[^>]*?>|Confidentiality Notice<\/span>|\"signature image\"/ig; // changed slightly to be "non-greedy" to try to avoid timeouts.
bodyTRIM = messageString.split(regex);
length = bodyTRIM.length;
for (var i=0; i < bodyTRIM.length; ++i){
//remove line breaks
bodyTRIM[i] = bodyTRIM[i].replace(/\n/g,"");
//remove html
bodyTRIM[i] = bodyTRIM[i].replace(/<\/?\s?(div|br|span|strong|em|img|p|u|b|font)[^>]*>/ig," ");
}
for (var i=0; i < bodyTRIM.length; ++i){
if (bodyTRIM[i].length > minMsgLength){
newMessage = bodyTRIM[i];
break;
}
}
if (typeof newMessage == 'undefined') {
var newMessage = "";
var nml = newMessage.split(" ").length;
}
return newMessage;
}
正则表达式完全是命中注定。显然,没有标准的电子邮件签名格式,有时人们根本不使用签名。
我很好奇是否有其他人对此有任何想法? Gmail似乎有一个相当不错的方法来执行此操作,因为回复的邮件被&#34;显示剪裁的内容隐藏了#34;点。然而,尽管谷歌用了很长时间的谷歌搜索,我只能找到人们尝试方法让Gmail到IGNORE重复的内容,而不是模仿这种行为。 Gmail似乎没有在&#34;修剪内容&#34;中将任何内容插入到邮件本身中。位置,所以我的想法是它必须从消息格式中提取某些东西 ......就像我说的......这对我来说是一个死胡同。
所以,我的问题:有没有人对我的脚本有更好的方法或改进的想法,可能会让它更可靠地找到最新的消息文本?感谢。
编辑:我想出了以下但仍然不理想,但似乎工作得更好一点。基本上,它不是一次查看一条消息,而是通过线程比较以前的消息。如果前一个消息的前200个字符位于当前消息的正文中,则会在该点切断当前消息。这有效,但仍然感到非常笨拙......(忽略wordCount的东西,这就是垃圾)。
function email_IsolateNewMessage2(threadId) {
var msgs = GmailApp.getMessagesForThread(GmailApp.getThreadById(threadId));
var arr = [];
var wordCount = 0;
for (var i=0; i!=msgs.length; ++i){
var msgDate = msgs[i].getDate();
var msgBody = msgs[i].getBody();
var length = msgBody.length;
var thisMsgLength = length-wordCount;
var wordCount = wordCount + length;
arr.push([msgDate, msgBody, length, thisMsgLength]);
var newArrLength = arr.length
for (var j=0; j!=arr.length; ++j){
var source = arr[j][1];
var compare = arr[i][1];
if (arr[j][1].indexOf(arr[j][1].slice(0,200)) > -1 && arr[j] != arr[i]){
var cutLocation = arr[i][1].indexOf(arr[j][1].slice(0,200));
arr[i][1] = arr[i][1].slice(0,cutLocation);
arr[i][4] = arr[i][1].length;
}
}
}
debugger;
return arr;
}