将电子邮件正文的子串提取到Google电子表格
我正在使用谷歌应用程序脚本将电子邮件数据提取到Google电子表格中。我正在尝试修改下面的工作代码。我敢肯定有一个更聪明的方式......但现在这个工程将电子邮件正文的子串提取到Google电子表格
function emf() {
var ss = SpreadsheetApp.getActiveSheet();
var label = GmailApp.getUserLabelByName("tkh_emf");
var threads = label.getThreads();
for (var i=0; i<threads.length; i++)
{
var messages = threads[i].getMessages();
for (var j=0; j<messages.length; j++)
{
var name = messages[j].getPlainBody().split("Name*:")[1].split("\n")[0];
var email = messages[j].getPlainBody().split("E-mail*:")[1].split("\n")[0];
var phone = messages[j].getPlainBody().split("Phone:")[1].split("\n")[0];
var addr = messages[j].getPlainBody().split("Street Address:")[1].split("\n")[0];
var city = messages[j].getPlainBody().split("City*:")[1].split("\n")[0];
var find = messages[j].getPlainBody().split("hear about us?*:")[1].split("\n")[0];
var sub = messages[j].getSubject().split("Feedback via the ")[1].split("[")[0];
var num = messages[j].getSubject().split("Feedback via the ")[1].split("[")[1].split("]")[0];
var dat = messages[j].getDate();
var referrer = messages[j].getPlainBody().split("Referer URL:")[1].split("\n")[0];
ss.appendRow([name, email, phone, addr, city, find, sub, num, dat, referrer])
}
threads[i].removeLabel(label);
}
}
我的电子邮件看起来是这样的:
名称*:名
电子邮件*: [email protected]
电话:
街道地址:3704第17届圣
城市*:城市
你是怎么知道我们的?*:搜索引擎结果
工作的简要说明要求*:在这里工作
所以我的代码的每个提取相应的琴弦除了不需要的'电话'和'地址'字段之外的字段。如果这些字段未填写,则电子邮件中没有“电话”或“街道地址”字样,因此var phone
和var addr
的行会失败,因为您无法拆分空值。有没有办法插入如果字符串'手机'和'街道地址'存在,然后执行上述?谢谢。
你说得对,你需要使用正则表达式来完成这项工作(或者它肯定会使它更容易)。 I've written a simple script in Codepen that'll show you how to use the regex.
在我的脚本中,我将主体数据拆分为换行符,然后遍历所生成的行数组。我将每一行管道化为一个捕获并返回所需文本的函数。您不需要在其他任何地方输入任何内容 - 它会根据您当前的格式检测字段名称,并适当地使用它。
在自己的代码,你就必须做以下msg
把它变成电子表格之前:
var msg = messages[j].getPlainBody();
var sub = messages[j].getSubject();
var dat = messages[j].getDate();
var bodyLines = msg.split("\n");
var fields = [];
for (var k = 0; k < bodyLines.length; k++) {
fields.push(getText(bodyLines[k]));
}
// do something with the resulting array of fields here
这里的getText(str)
功能(也可以在Codepen找到):
function getText(str) {
var fieldRe = new RegExp("(.+)\:", "g");
var fieldGroups = fieldRe.exec(str);
var fieldName = fieldGroups[1].split("*")[0];
fieldName = (fieldName == null) ? fieldGroups[1] : fieldName;
fieldName = fieldName.replace(/[\!\@\#\$\%\^\&\*\(\)\-\_\+\=\`\~\[\]\{\}\\\/\|\:\;\'\"\<\>\,\.\?]/g, function transformIllegal(x) {
return "\\" + x;
});
var re = new RegExp(`${fieldName}\\*?\\:\\s+(.*)`, "g");
var groups = re.exec(str);
var out = (groups == null) ? "" : groups[1];
return out;
}
谷歌应用程序脚本调试器不断给我错误。 – testing123
@ user5753132它给你什么错误?是否用于您在问题中编辑过的新代码,或者之前的代码?另外,如果你正在寻找一种更简单的方法来做到这一点,我所写的内容至少可以简化你的消息纯体的细分,然后你可以使用结果数组中的每个项代替'name ','email','phone','addr','city'和'find'。我不确定您的主题和引荐来源的格式是什么,所以我不知道我写的方法是否有助于这些。虽然可能值得一试。 – jmindel
以下是我的结局。不复杂但有效。
function emf() {
var ss = SpreadsheetApp.getActiveSheet();
var label = GmailApp.getUserLabelByName("tkh_emf");
var threads = label.getThreads();
for (var i=0; i<threads.length; i++)
{
var messages = threads[i].getMessages();
for (var j=0; j<messages.length; j++)
{
var name = messages[j].getPlainBody().split("Name*:")[1].split("\n")[0];
var email = messages[j].getPlainBody().split("E-mail*:")[1].split("\n")[0];
try {var phone = messages[j].getPlainBody().split("Phone:")[1].split("\n")[0];}
catch(e){var phone = "-";}
try {var addr = messages[j].getPlainBody().split("Street Address:")[1].split("\n")[0];}
catch(e){var addr = "-";}
var city = messages[j].getPlainBody().split("City*:")[1].split("\n")[0];
var find = messages[j].getPlainBody().split("hear about us?*:")[1].split("\n")[0];
try {var referrer = messages[j].getPlainBody().split("Referrer Name:")[1].split("\n")[0];}
catch(e){var referrer = "-";}
var sub = messages[j].getSubject().split("Feedback via the ")[1].split("[")[0];
var num = messages[j].getSubject().split("Feedback via the ")[1].split("[")[1].split("]")[0];
var dat = messages[j].getDate();
ss.appendRow([name, email, phone, addr, city, find, referrer, sub, num, dat])
}
threads[i].removeLabel(label);
}
}
您是否有兴趣也能够验证电子邮件或地址的格式,还是仅仅希望将数据分离出来? – jmindel
只需要将数据分离出来。 – testing123
您是否考虑过或尝试将每个手机放在自己的try {}块中,并且忽略分割错误? –