从gmail中提取数据添加到电子表格 - Google apps脚本

时间:2017-04-24 18:04:27

标签: python regex google-apps-script gmail

我搜索,复制和修改了代码,试图打破其他人所做的事情,但我仍然无法做到这一点。

我有一个电子商务网站的电子邮件收据,我试图从每封电子邮件中收集特定的详细信息并保存到带有脚本的电子表格中。

这是我现在的整个脚本。

function menu(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('programs')
      .addItem('parse mail', 'grabreceipt')
      .addToUi();
}

function grabreceipt() {

  var ss = SpreadsheetApp.getActiveSheet();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Sheet1");
  var threads = GmailApp.search("(subject:order receipt) and (after:2016/12/01)");
  var a=[];
  for (var i = 0; i<threads.length; i++)
  {
    var messages = threads[i].getMessages();

    for (var j=0; j<messages.length; j++)
    {
    var messages = GmailApp.getMessagesForThread(threads[i]);
    for (var j = 0; j < messages.length; j++) {
      a[j]=parseMail(messages[j].getPlainBody());
    }
  }
  var nextRow=s.getDataRange().getLastRow()+1;
  var numRows=a.length;
  var numCols=a[0].length;
  s.getRange(nextRow,1,numRows,numCols).setValues(a);
}

function parseMail(body) {
  var a=[];
  var keystr="Order #,Subtotal:,Shipping:,Total:";
  var keys=keystr.split(",");
  var i,p,r;
  for (i in keys)  {
    //p=keys[i]+(/-?\d+(,\d+)*(\.\d+(e\d+)?)?/);
    p=keys[i]+"[\r\n]*([^\r^\n]*)[\r\n]";
    //p=keys[i]+"[\$]?[\d]+[\.]?[\d]+$";
    r=new RegExp(p,"m");
    try {a[i]=body.match(p)[1];}
    catch (err) {a[i]="no match";}
  }
  return a;
}
}

所以要采摘的电子邮件数据仅作为文本出现:

订单#89076
(正文内容,略)
小计:528.31美元 运费:42.66美元通过PriorityMail®
付款方式:支票付款 - 汇票
总计:570.97美元

注意:mywebsite订单456.客户询问了这个以及......等等。

原始代码正则表达式旨在获取内容,遵循可在自己的行中轻松找到的keystr值。所以这是有道理的:

p=keys[i]+"[\r\n]*([^\r^\n]*)[\r\n]";

这样可行,但结果显示这些行包含更多数据,如下所示:通过PriorityMail®获得$ 42.66。

我的数据更加混合,我只希望获取数字或数字和小数。所以我有这个而不是在regex101.com上验证

p=keys[i]+"[\$]?[\d]+[\.]?\d+$";

仅表达式,[\ $]?[\ d] + [。]?\ d + $效果很好,但每行仍然“不匹配”。

此外,在此搜索中,返回了22个主题,并在电子表格中填充了39行。我无法弄清楚为什么39?

1 个答案:

答案 0 :(得分:0)

正则表达式不能正常工作的原因应该是因为您没有将用于create the regex的字符串中的“\”转义为

这样的正则表达式

"\s?\$?(\d+\.?\d+)"

需要像这样转义:

"\\s?\\$?(\\d+\\.?\\d+)"

以下代码只是从您的parseEmail()修改为此处的代码段。如果将其复制到您的应用脚本代码中,请删除document.getElementById()行。

您可以在下面的代码段中尝试您的示例,它只会为您提供数字。

function parseMail(body) {
 if(body == "" || body == undefined){
  var body = document.getElementById("input").value
  }
  var a=[];
  var keystr="Order #,Subtotal:,Shipping:,Total:";
  var keys=keystr.split(",");
  var i,p,r;
  for (i in keys)  {
    p=keys[i]+"\\s?\\$?(\\d+\\.?\\d+)";
    r=new RegExp(p,"m");
    try {a[i]=body.match(p)[1];}
    catch (err) {a[i]="no match";}
  }
  document.getElementById("output").innerHTML = a.join(";")
  return a;
}
<textarea id ="input"></textarea>
<div id= "output"></div>
<input type = "button" value = "Parse" onclick = "parseMail()">

希望有所帮助