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

时间:2017-07-31 22:21:35

标签: javascript google-sheets text-extraction

我正在使用谷歌应用程序脚本将电子邮件数据提取到谷歌电子表格中。我有以下工作代码,我试图修改。我确信这是一种更聪明的方式......但是现在这种方法有效了

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@gmail.com

     

电话:

     

街道地址:3704 17th St.

     

城市*:城市

     

您是如何得知我们的?*:搜索引擎结果

     

所要求工作的简要描述*:在这里工作

因此,我的代码会为每个字段提取相应的字符串,但“电话”和“地址”字段除外,这些字段不是必需的。如果未填写这些字段,则电子邮件中没有“电话”或“街道地址”字样,因此var phonevar addr的行会因为您无法拆分空而失败。有没有办法插入if字符串'Phone'和'Street Address'然后执行上面的操作?感谢。

2 个答案:

答案 0 :(得分:0)

你是正确的,你需要正则表达式来完成这项工作(或者它肯定会让它变得更容易)。 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;
}

答案 1 :(得分:0)

这就是我要结束的。不复杂但有效。

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