【问题标题】:How to parse Gmail messages to extract data to Google Sheets如何解析 Gmail 邮件以将数据提取到 Google 表格
【发布时间】:2017-09-03 15:52:31
【问题描述】:

我正在从事一个研发项目,我在该项目中使用 Linux 命令收集服务器端统计信息并将其输出到我的邮件中。现在我的计划是读取和parse Gmail 内容,其中包含我的服务器数据(如下)并将其提取到Google Sheets。我的 Gmail 内容如下所示,其中包含行和列中的数据。

Date&Time JVM PID CPU MEM FGC
03-09-2017-09-08-PM abc01_xzy01 12345 1.2% 2.75 3
03-09-2017-09-08-PM abc01_xzy01 12345 3.5% 2.71 4
03-09-2017-09-08-PM abc01_xzy01 12345 4.6% 2.79 5

我的想法是将完全相同的方式拉入Google Sheet。我正在使用下面的代码,但它无法读取内容。我在想它是否与使用的 RegExp 有关。您能否告诉我在if 语句中必须如何准确地编写代码。

function parseEmailMessages(start) {

  start = start || 0;

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

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

    var tmp,
      message = threads[i].getMessages()[0],
     // subject = message.getSubject(),
     subject = "SERVER TEST REPORT",
      content = message.getPlainBody();

    if (content) {

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

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

      sheet.appendRow([username, email, subject, comment]);

    } 

  } 
}

我的输出只是在 Google 表格中打印 No Date &amp; TimeNo JVM。我想打印邮件中给出的列和行中的名称和数据。有人可以帮我解决这个问题并告诉我错误是什么以及如何按预期提取数据。提前致谢。

【问题讨论】:

    标签: parsing google-apps-script google-sheets gmail


    【解决方案1】:

    如果您的电子邮件中的所有内容都是您在上面发布的内容,那么这会将其放入您的电子表格中。更改电子邮件主题和工作表名称以满足您的需要。

    function getGmail() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var threads = GmailApp.search('IMPORTANT1', 0, 10);
    
      for (var i = 0; i < threads.length; i++) {
        var messages = GmailApp.getMessagesForThread(threads[i]);
      for (var j = 0; j < messages.length; j++) {
        var msg=messages[j].getPlainBody();
        var msg=msg.trim()
      }
    }
     result1(msg)
      }
    function result1(range) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet1 = ss.getSheetByName("Sheet1")
      var lr=sheet1.getLastRow()
      var output=[]
      var line=range.split("\n")
      for(j=0;j<line.length;j++){
         output.push(line[j].split(" "))
      }
      sheet1.getRange(lr+1, 1, output.length, output[0].length).setValues(output)
     }
    

    【讨论】:

    • 感谢您的建议 Ed。我有几个疑问。你能澄清一下吗?我在哪里可以提及主题名称,以便它可以直接查找相应的主题并提取邮件内容。此外,在执行代码后,我观察到所有数据都被粘贴在一行中,而不是在第一行结束后进入新行。你能帮忙吗
    • 我附上了一个共享电子表格,您可以复制并尝试。它有一个带有说明的注释表。当您复制它时,您将成为所有者,它会获取您的 Gmail。至于单排。该脚本在行尾查找 /n 换行符以了解将它们拆分的位置。您的电子邮件不得包含换行符。最简单的方法是将它们添加到您的 Linux 提要中。要进行测试,您可以向自己发送一封电子邮件,一次复制一行,然后在每行后按回车键。 docs.google.com/spreadsheets/d/…
    • 谢谢埃德。这很有帮助。
    • Ed,我遇到了一个问题,请你帮我解决这个问题。当我尝试从触发器运行代码时,我收到错误Cannot convert [object Object] to (class). (line 6, file "Code")。请告诉我如何纠正这个问题。
    猜你喜欢
    • 2018-07-30
    • 2021-07-04
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2021-07-24
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多