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



我已经搜索,复制和修改了代码,并试图分解其他人所做的事情,但我仍然无法正确理解。

我有一个电子商务网络网络的电子邮件收据,我正在尝试从每个电子邮件中收集特定的详细信息,并用脚本保存到电子表格中。

这是我现在的整个脚本。

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+(ed+)?)?/);
    p=keys[i]+"[rn]*([^r^n]*)[rn]";
    //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.客户询问了这一点,...等。

原始代码正则旨在捕获内容,遵循在自己的行中轻松找到的键值。所以这很有意义:

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

这可以正常工作,但是当行包含更多数据的结果中,该线路运输中的更多数据:$ 42.66通过PriorityMail®。

我的数据更加混合,我只想服用数字,数字和小数。因此,我有了在Regex101.com上验证的

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

仅表达式,[ $]?[ d] [。]? d $效果很好,但我仍然可以为每一行都"否匹配"。

此外,在此搜索中,还返回了22个线程,并且在电子表格中填充了39行。我不知道为什么39?

正等级无法正常工作的原因是因为您在创建正则forgex

的字符串中没有逃脱" ">

所以像这样的正则

"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()">

希望有帮助

最新更新