【问题标题】:Extract substring of e-mail message body to google spreadsheet将电子邮件正文的子字符串提取到谷歌电子表格
【发布时间】:2018-01-07 15:11:20
【问题描述】:

我正在使用谷歌应用脚​​本将电子邮件数据提取到谷歌电子表格中。我有以下我正在尝试修改的工作代码。我敢肯定有更聪明的方法......但现在这可行

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 的行将失败,因为您无法拆分空值。有没有办法插入一个如果字符串“电话”和“街道地址”存在然后执行上面的?谢谢。

【问题讨论】:

  • 您是否有兴趣也能够验证电子邮件或地址的格式,还是只想将数据分离出来?
  • 只需要将数据分离出来即可。
  • 您是否考虑或尝试将 phone 和 address 每个放在其自己的 try {} 块中,其中 catch 忽略拆分错误?
  • 但是你的问题是肯定的,见stackoverflow.com/questions/20527670/…
  • @JeremyKahan 做到了。谢谢!

标签: javascript google-sheets text-extraction


【解决方案1】:

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

【讨论】:

  • 谷歌应用脚​​本调试器不断给我错误。
  • @user5753132 它给你什么错误?是针对您在问题中编辑的新代码还是以前的代码?此外,如果您正在寻找一种更简单的方法来做到这一点,我所写的内容至少会简化您对消息正文的分解,然后您可以使用结果数组中的每个项目来代替 @987654326 @、emailphoneaddrcityfind。我不确定你的主题和推荐人的格式是什么,所以我不知道我写的方法是否对这些有帮助。不过可能值得一试。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多