Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用GAS从Gmail消息中提取数据_Regex_Email_Google Apps Script_Google Sheets_Gmail - Fatal编程技术网

Regex 用GAS从Gmail消息中提取数据

Regex 用GAS从Gmail消息中提取数据,regex,email,google-apps-script,google-sheets,gmail,Regex,Email,Google Apps Script,Google Sheets,Gmail,我一直在努力从自动Gmail邮件中自动提取数据。每天都有多封带有同一标签的电子邮件,所以理想情况下,我希望循环浏览每封电子邮件,并提取一些数据。我已经将它设置为使用一些正则表达式来获取数据,并且它适用于第一封电子邮件。但是,它不会正确循环以查找下一封带有标签的电子邮件。以下是我目前掌握的代码: function parseEmailMessages (start) { var label = GmailApp.getUserLabelByName("Bounce"); var threads =

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

function parseEmailMessages (start) {
var label = GmailApp.getUserLabelByName("Bounce");
var threads = label.getThreads();
var sheet = SpreadsheetApp.getActiveSheet();
var tmp = [];
var messages = GmailApp.getMessagesForThreads(threads);
var bodies = [];

for (var i =0; i < threads.length; i++) {
  var bodies = [];
   for(k in threads[i].getMessages()) {
   bodies.push(threads[i].getMessages()[i].getPlainBody());


    var content = bodies.toString();
    if (content) {
        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]);
        Logger.log([firstname,lastname, customerID, invoice]);
      } 

       }


}

};
函数解析电子邮件(开始){
var label=GmailApp.getUserLabelByName(“Bounce”);
var threads=label.getThreads();
var sheet=SpreadsheetApp.getActiveSheet();
var tmp=[];
var messages=GmailApp.getMessagesForThreads(线程);
var主体=[];
对于(var i=0;i
它第一次正确地循环,然后给了我一个错误:TypeError:cannotcallmethod“getPlainBody”of undefined


任何帮助都将不胜感激

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

threads[i].getMessages()[k].getPlainBody()
尝试在for循环中更改此行,它对我有效


希望有帮助

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

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();
  }
};
函数processInboxToSheet(){
//必须单独获取数据以避免谷歌应用程序脚本限制!
//var start=0;
var label=GmailApp.getUserLabelByName(“Bounce”);
var threads=label.getThreads();
var sheet=SpreadsheetApp.getActiveSheet();
var结果=[];
var newLabel=GmailApp.getUserLabelByName(“完成”);
var oldlab=GmailApp.getUserLabelByName(“Bounce”);
对于(var i=0;i
谢谢你的提示,它确实消除了错误。但是,循环找不到带有该标签的第二封电子邮件。在我的收件箱里,我有两封标签为“Bounce”的电子邮件。但是,我的电子表格填充了两行相同的数据。有什么想法吗?