使用Google Apps脚本从Gmail邮件中提取数字

时间:2016-08-30 04:51:35

标签: javascript regex google-apps-script

我正在尝试使用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的新手,我认为这个问题出现在正则表达式中,但我不确定。任何帮助都将不胜感激。

1 个答案:

答案 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]);
      }

    }
  }
}