我正在尝试使用Google Apps脚本从我的Gmail邮件中提取下面列出的数字。
2,495.00
1,594
3,777.23
642.00
这是代码:
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var threads = GmailApp.search('subject:(Transaction) after:2016/7/31 before:2016/8/10');
for (var i=0; i<threads.length; i++)
{
var messages = threads[i].getMessages();
var tmp;
for (var j=0; j<messages.length; j++)
{
var content = messages[j].getBody();
var subject = messages[j].getSubject();
var date = messages[j].getDate();
Logger.log(content);
if (content)
{
tmp = content.match(/\d+(,\d+)*(\.\d+(e\d+)?)?/);
var number = (tmp && tmp[j]) ? tmp[j] : 'No number';
sheet.appendRow([number, subject, date]);
}
else
{
sheet.appendRow([content, subject, date]);
}
}
}
}
我的结果好坏参半。对于某些消息,这可以按预期工作,但对于某些消息,它会完全跳过消息中的数字。我是JS / GAS的新手,我认为这个问题出现在正则表达式中,但我不确定。任何帮助都将不胜感激。
答案 0 :(得分:0)
1,594
的数字,则不应该找到像642.00
这样的数字。 。不过你可以使用Shekhar Khairnar在评论或类似内容中提出的正则表达式(最后g
很重要,因为你的邮件中有多个号码。)
第二个问题出在var number = (tmp && tmp[j]) ? tmp[j] : 'No number';
行。为什么这一行有j
变量? j
是对for循环的引用 - &gt;消息数量,与消息中出现的消息无关
我能为你提出的建议就是这样:
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var threads = GmailApp.search('test');
var re = /(?:\d{1,3}[,])*\d{1,3}\.{0,1}\d{1,3}/g;
for (var i=0; i<threads.length && i<5; i++) // added a condition because I didn't wanted to have too many results
{
var messages = threads[i].getMessages();
var tmp;
for (var j=0; j<messages.length; j++)
{
var content = messages[j].getPlainBody(); //.getBody();
var subject = messages[j].getSubject();
var date = messages[j].getDate();
//Logger.log(content);
if (content)
{
tmp = content.match(re); // /\d+(,\d+)*(\.\d+(e\d+)?)?/);
var number = tmp || ['No number']; // result of tmp is either null or an array --> if it's null then it will take the value 'no number'
Logger.log(number);
sheet.appendRow([number.join(" | "), subject, date]);
}
else
{
sheet.appendRow([content, subject, date]);
}
}
}
}