【问题标题】:Google Apps Script - Parsing Data from Gmail Body Text with Identical Subject LineGoogle Apps 脚本 - 从具有相同主题行的 Gmail 正文文本中解析数据
【发布时间】:2017-05-24 10:31:06
【问题描述】:

我正在使用此 Google Apps 脚本从 gmail 邮件的正文中提取和解析数据字段。我已经修改了脚本,使其适用于我电子邮件中的字段。但是,我发现它仅在电子邮件具有不同主题行时才有效。例如,如果我有五封不同主题行的电子邮件,脚本将在 Google 电子表格中创建 5 行,每封电子邮件一行。但是,如果我有 5 封电子邮件都具有相同的主题行,那么收件箱中最旧的电子邮件只会得到一行。有谁知道我可以如何修改此脚本,以便所有电子邮件的主题行都相同?谢谢!

/* Based on https://gist.github.com/Ferrari/9678772 */

function parseEmailMessages(start) {

start = start || 0;

var threads = GmailApp.getInboxThreads(start, 100);
var sheet = SpreadsheetApp.getActiveSheet();

for (var i = 0; i < threads.length; i++) {

// Get the first email message of a threads
var tmp,
  message = threads[i].getMessages()[0],
  subject = message.getSubject(),
  content = message.getPlainBody();

// Get the plain text body of the email message
// You may also use getRawContent() for parsing HTML

// Implement Parsing rules using regular expressions
if (content) {

  tmp = content.match(/Name:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var username = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/Title:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var title = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/Organization:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var organization = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/City:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var city = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/State:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var state = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/country:\s*([A-Za-z0-9.\s]+)(\r?\n)/);
  var country = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';

  tmp = content.match(/E-mail:\s*([\s\S]+)/);
  var email = (tmp && tmp[1]) ? tmp[1] : 'No comment';

  sheet.appendRow([username, title, organization, city, state, country, email]);

} // End if

  } // End for loop
}

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    这一行:message = threads[i].getMessages()[0] 仅检索线程中的第一条(最旧的)消息,即线程数组的索引 0。您想遍历线程中的每条消息,因此您需要将整个线程检索到一个新数组中。简而言之,在getMessages() 调用后丢失数组索引。
    试试这个逻辑:

    threads = GmailApp.getInboxThreads(start, 100)
    for (i = 0; i < threads.length; i++)
      messages = threads[i].getMessages()
      for (j = 0; j < thread.length; j++)
        subject = messages[j].getSubject()
        content = messages[j].getPlainBody()
        etc...
    

    【讨论】:

    • 我仍然只得到一行数据。
    • 很奇怪!我已经运行了你的代码和我的更新作为测试,每个实现都有不同的行数。您的主题相同的电子邮件是否显示为线程?如果您将电子邮件主题与其他输出一起记录下来,您会看到什么?仅检索前 100 个线程对您所看到的内容有贡献吗?
    • 好吧,我决定只更改发送在线表单数据的 php 文件中的代码,以便每个主题行都是唯一的(我将用户提交的电子邮件地址添加到每个主题行电子邮件。)这解决了问题,我现在将每封电子邮件放在自己的行中。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多