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

2024-10-03 19:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经搜索、复制和修改过代码,并试图分解其他人所做的,但我仍然不能正确地完成这项工作。在

我有一个电子商务网站的电子邮件收据,在那里我试图从每封电子邮件中获取特定的细节,并保存到带有脚本的电子表格中。在

这是我现在的全部脚本。在

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 付款方式:支票付款-汇票
总计:570.97美元

注:我的网站订购456。客户询问这个和那个。。。等等

原始代码regex被设计用来获取内容,遵循keystr值,这些值很容易在它们自己的行中找到。所以这是有道理的:

^{pr2}$

这很好,但结果是,行中包含更多数据,如下所示:通过Priority Mail®,42.66美元。在

我的数据比较混合,我只想取数字,或者数字和小数。所以我用这个在regex101.com上验证

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

仅表达式[\$]?[\d]+[.]?\d+$很好用,但我还是每行都“不匹配”。在

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


Tags: 数据代码脚本for网站电子邮件varfunction
1条回答
网友
1楼 · 发布于 2024-10-03 19:23:35

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

所以像这样的正则表达式

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

需要这样逃走:

^{pr2}$

下面的代码是从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()">
和13;
和13;

希望有帮助

相关问题 更多 >