簡體   English   中英

使用Google Apps腳本從Gmail郵件中提取數字

[英]Extracting numbers from Gmail messages using 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的新手,我認為問題出在正則表達式中,但我不確定。 任何幫助,將不勝感激。

您在這里面臨兩個麻煩:
您正在使用的正則表達式看起來沒有經過優化(但是您所尋找的內容也不是很清楚,如果您還要查看看起來像642.00數字,則不應找到類似1,594數字)。 不過,您可以使用諸如Shekhar Khairnar在評論中建議的正則表達式或類似的東西(末尾的g很重要,因為您的郵件中有多個數字)。
第二個麻煩是在行var number = (tmp && tmp[j]) ? tmp[j] : 'No number'; var number = (tmp && tmp[j]) ? tmp[j] : 'No number'; 為什么在此行中有一個j var? j引用了for循環->消息的數量,與消息中的出現無關。
我可以向您建議的是這樣的:

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

    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM