使用GAS从Gmail邮件中提取数据

时间:2015-08-18 21:10:05

标签: regex email google-apps-script google-sheets gmail

我一直在努力从自动Gmail邮件中自动提取数据。每天有多个电子邮件使用相同的标签,因此理想情况下我想循环浏览每封电子邮件,并提取一些数据。我已经将它设置为使用一些正则表达式来获取数据,它适用于第一封电子邮件。但是,它无法正确循环以查找带有标签的下一封电子邮件。这是我到目前为止的代码:

BeforeRightClick

第一次正确循环,然后给我一个错误:TypeError:无法调用未定义的方法“getPlainBody”。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您看到该错误,因为您应该在for循环中使用k变量来获取该标签的每条消息。请查看以下这一行:

threads[i].getMessages()[k].getPlainBody()

尝试在for循环中更改此行,并为我工作。

希望有所帮助!

答案 1 :(得分:0)

在简化我的代码之后,我能够让脚本通过我的电子邮件正确循环。这是对我有用的代码:

function processInboxToSheet() {

// Have to get data separate to avoid google app script limit!

//var start = 0;
var label = GmailApp.getUserLabelByName("Bounce");
var threads = label.getThreads();
var sheet = SpreadsheetApp.getActiveSheet();
var result = [];
var newLabel = GmailApp.getUserLabelByName("Done");
var oldLabel = GmailApp.getUserLabelByName("Bounce");


for (var i = 0; i < threads.length; i++) {
  var messages = threads[i].getMessages();

  var content = messages[0].getPlainBody();

  // implement your own parsing rule inside
 if (content) {
    var tmp;
    tmp = content.match(/[\n\r].*First Name\s*:\s*([^\n\r]*)/);
        var firstname = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

        tmp = content.match(/[\n\r].*Last Name\s*:\s*([^\n\r]*)/);
        var lastname = (tmp && tmp[1]) ? tmp[1].trim() : 'No Lastname';

        tmp = content.match(/[\n\r].*Customer ID\s*:\s*([^\n\r]*)/);
        var customerID = (tmp) ? tmp[1].trim() : 'No CustomerID';

        tmp = content.match(/[\n\r].*Invoice\s*:\s*([^\n\r]*)/);
        var invoice = (tmp) ? tmp[1].trim() : 'No Invoice';

        sheet.appendRow([firstname, lastname, customerID, invoice]);
      } 

    Utilities.sleep(500);
    threads[i].addLabel(newLabel).removeLabel(oldLabel).refresh();
  }
};