将电子邮件正文的子串提取到Google电子表格

将电子邮件正文的子串提取到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 phonevar addr的行会失败,因为您无法拆分空值。有没有办法插入如果字符串'手机'和'街道地址'存在,然后执行上述?谢谢。

+0

您是否有兴趣也能够验证电子邮件或地址的格式,还是仅仅希望将数据分离出来? – jmindel

+0

只需要将数据分离出来。 – testing123

+0

您是否考虑过或尝试将每个手机放在自己的try {}块中,并且忽略分割错误? –

你说得对,你需要使用正则表达式来完成这项工作(或者它肯定会使它更容易)。 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; 
} 
+0

谷歌应用程序脚本调试器不断给我错误。 – testing123

+0

@ 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); 
    } 
}