当前位置: 首页 > 知识库问答 >
问题:

谷歌应用程序脚本-从具有相同主题行的Gmail正文文本解析数据

夏侯承恩
2023-03-14

我正在使用这个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
}

共有1个答案

巫马阳飙
2023-03-14

这一行:message=threads[i].getMessages()[0]只检索线程中第一个(最早的)消息,即threads数组的索引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...
 类似资料:
  • 使用谷歌应用脚本Gmail库,当我使用函数,API似乎将过去的一个段落拆分为多个段落,可能会使用字符限制。例如,我的电子邮件中有一段写道: 但当我在电子邮件中调用此功能时,它变成: 而且,当我在一个新的行定界符上拆分电子邮件文本,并进行一些清理,以使用我的输出创建一个数组时,我最终得到: 我查看了这篇Reddit帖子,它似乎处理了类似的问题。但是,我尝试了提出问题的人提出的解决方案: 但它并没有满

  • 我使用一个简单的脚本来删除1天后所有标有“摄像头”的电子邮件。这已经奏效好几个月了。我没有改变它,但它突然停止工作。 该脚本仍有在我的Gmail上运行的权限,但已停止。 感谢任何建议。 脚本是; 谢了山姆

  • 我按照脚本以任何方式发布,在每周的特定时间发送Gmail自动回复?。然而,根据我目前的测试,我的Gmail账户在下班时间没有回复任何消息。 我做错了什么或不完整吗? 我所做的: 通过复制和粘贴在https://script.google.com/上创建了一个脚本。 保存脚本并测试它。它工作正常。在这里输入图像描述 任何提示都将不胜感激! 更新:我想知道为什么下面的脚本本身会导致“脚本函数未找到:m

  • 我有一个谷歌电子表格,我用它创建了一个谷歌表单。电子表格有两张表:一张有表单响应,另一张有配置数据。电子表格附带了一个表单响应触发的应用程序脚本,该脚本使用配置数据进行API调用。这个脚本运行完全符合我的要求。 我已经编写了电子表格更改触发脚本,试图更新表单问题之一的选项。但是,使用FormApp。openById或FormApp。openByUrl因“您无权调用…”而失败。 是否有某种方法可以将

  • 在继续使用GoogleApps脚本构建Google电子表格的过程中,我已经完成了获取Bittrex和Poloniex余额的工作,但无法使用Cryptopia。 下面是我与Bittrex将JSON对象数组映射到字符串的斗争的链接 以下是官方API链接:https://www.cryptopia.co.nz/Forum/Thread/256 以下是一些例子: https://www.cryptopia

  • 我想为某些参数设置一个gmail自带的过滤器。 基本上,我经常使用谷歌别名功能(电子邮件后的符号)。我想自动化创建一个过滤器的过程,该过滤器读取“to”行,然后查找一个“”。如果找到a“”,它将为“”后面的内容制作一个标签。然后,它将创建一个专用/本机过滤器,该过滤器将:跳过收件箱并应用“”后面的标签。 我已经浏览了gmail脚本,但还没有找到制作原生过滤器的方法。我知道这个功能可能刚刚实现。 任