我已经搜索,复制和修改了代码,并试图分解其他人所做的事情,但我仍然无法正确理解。
我有一个电子商务网络网络的电子邮件收据,我正在尝试从每个电子邮件中收集特定的详细信息,并用脚本保存到电子表格中。
这是我现在的整个脚本。
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()">
希望有帮助