从 (Gmail) 电子邮件正文中解析 HTML table 并粘贴到 Google 表格

Parse HTML table from (Gmail) email body and paste to Google Sheets

我试图从 Gmail 中的电子邮件正文中获取 HTML table 到 Google Sheet 中,但我在XmlService.parse 方法。我在这里阅读了一些问题,问题似乎是电子邮件在 Html 中并且 Xml 服务正在尝试将其解析为 Xml.

这是脚本:

function myFunction() {
  var ss = SpreadsheetApp.openById('idhere');
  var updateSheet = ss.getSheetByName('Affiliate bookings');
  var threads = GmailApp.search("Daily report (affiliate bookings)");
  var message = threads[0].getMessages()[0];
  var body = message.getBody();
  
      console.log(body);

  var xml = XmlService.parse(body);

  updateSheet.getRange(1, 1, xml.length, xml[0].length).setValues(xml);
} 

这是 console.log(body)

<!-- sales_list -->
<table style="border:0 none;border-spacing:0;border-collapse: collapse;word-break:normal;">
    <tr style="background-color: #d1d1d1">
        <th style="padding:8px">ID</th>
        <th style="padding:8px">Commission</th>
        <th style="padding:8px">Total Cost</th>
        <th style="padding:8px">Order ID</th>
        <th style="padding:8px">Product ID</th>
        <th style="padding:8px">Created</th>
        <th style="padding:8px">Campaign name</th>
        <th style="padding:8px">Type</th>        
        <th style="padding:8px">Status</th>
        <th style="padding:8px">Paid</th>
        <th style="padding:8px">Affiliate</th>
        <th style="padding:8px">Channel</th>
    </tr>
            <tr>
            <td style="padding:8px">ny9kq352</td> 
            <td style="padding:8px">$ &lrm;30.00</td>
            <td style="padding:8px">$ &lrm;500.00</td>
            <td style="padding:8px">554683</td>
            <td style="padding:8px">Thursday, April 08, 2021 :: Half Day Trip (PM) @Size Matters Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">declined</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Cathy  Sheehan</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">h4tdux7d</td> 
            <td style="padding:8px">$ &lrm;24.00</td>
            <td style="padding:8px">$ &lrm;400.00</td>
            <td style="padding:8px">553921</td>
            <td style="padding:8px">Friday, April 09, 2021 :: 4 Hour Trip (AM) @R&R Fishing Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">declined</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Joanne Bergstrom</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">qj9cfp0g</td> 
            <td style="padding:8px">$ &lrm;24.00</td>
            <td style="padding:8px">$ &lrm;400.00</td>
            <td style="padding:8px">553921</td>
            <td style="padding:8px">Friday, April 09, 2021 :: 4 Hour Trip (AM) @R&R Fishing Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Joanne Bergstrom</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">wujm6buw</td> 
            <td style="padding:8px">$ &lrm;39.00</td>
            <td style="padding:8px">$ &lrm;650.00</td>
            <td style="padding:8px">554032</td>
            <td style="padding:8px">Tuesday, July 27, 2021 :: Half Day Trip (PM) @All Hanns On Deck</td>
            <td style="padding:8px">04/06/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">eric matechak</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">ixonoun4</td> 
            <td style="padding:8px">$ &lrm;28.50</td>
            <td style="padding:8px">$ &lrm;475.00</td>
            <td style="padding:8px">554003</td>
            <td style="padding:8px">Saturday, May 29, 2021 :: 4 Hour Trip (AM) @Fins Up Adventure Charters</td>
            <td style="padding:8px">04/06/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">eric matechak</td>
            <td style="padding:8px"></td>                                 
        </tr>
    </table>

我得到的错误是:

Exception: Error on line 19: The entity "lrm" was referenced, but not declared.

我相信你的现状和你的目标如下。

  • var body = message.getBody()body 的值是 and here's the console.log(body) 部分显示的值。
    • var body = message.getBody()的HTMLtable肯定是<!-- sales_list --></table>的值。
  • 您想将 HTML table 放入电子表格。

在这种情况下,我想建议使用表格API。当使用 Sheets API 时,可以自动解析 HTML table 并将其放入 Google 电子表格。当这反映到您的脚本中时,它会变成如下。

修改后的脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google services

function myFunction() {
  var spreadsheetId = "###"; // Please set the Spreadsheet ID.
  var sheetName = "###"; // Please set the sheet name.

  var ss = SpreadsheetApp.openById(spreadsheetId);
  var updateSheet = ss.getSheetByName(sheetName);
  var body = `<!-- sales_list -->
<table style="border:0 none;border-spacing:0;border-collapse: collapse;word-break:normal;">
    <tr style="background-color: #d1d1d1">
        <th style="padding:8px">ID</th>
        <th style="padding:8px">Commission</th>
        <th style="padding:8px">Total Cost</th>
        <th style="padding:8px">Order ID</th>
        <th style="padding:8px">Product ID</th>
        <th style="padding:8px">Created</th>
        <th style="padding:8px">Campaign name</th>
        <th style="padding:8px">Type</th>        
        <th style="padding:8px">Status</th>
        <th style="padding:8px">Paid</th>
        <th style="padding:8px">Affiliate</th>
        <th style="padding:8px">Channel</th>
    </tr>
            <tr>
            <td style="padding:8px">ny9kq352</td> 
            <td style="padding:8px">$ &lrm;30.00</td>
            <td style="padding:8px">$ &lrm;500.00</td>
            <td style="padding:8px">554683</td>
            <td style="padding:8px">Thursday, April 08, 2021 :: Half Day Trip (PM) @Size Matters Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">declined</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Cathy  Sheehan</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">h4tdux7d</td> 
            <td style="padding:8px">$ &lrm;24.00</td>
            <td style="padding:8px">$ &lrm;400.00</td>
            <td style="padding:8px">553921</td>
            <td style="padding:8px">Friday, April 09, 2021 :: 4 Hour Trip (AM) @R&R Fishing Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">declined</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Joanne Bergstrom</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">qj9cfp0g</td> 
            <td style="padding:8px">$ &lrm;24.00</td>
            <td style="padding:8px">$ &lrm;400.00</td>
            <td style="padding:8px">553921</td>
            <td style="padding:8px">Friday, April 09, 2021 :: 4 Hour Trip (AM) @R&R Fishing Charters</td>
            <td style="padding:8px">04/07/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">Joanne Bergstrom</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">wujm6buw</td> 
            <td style="padding:8px">$ &lrm;39.00</td>
            <td style="padding:8px">$ &lrm;650.00</td>
            <td style="padding:8px">554032</td>
            <td style="padding:8px">Tuesday, July 27, 2021 :: Half Day Trip (PM) @All Hanns On Deck</td>
            <td style="padding:8px">04/06/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">eric matechak</td>
            <td style="padding:8px"></td>                                 
        </tr>
            <tr>
            <td style="padding:8px">ixonoun4</td> 
            <td style="padding:8px">$ &lrm;28.50</td>
            <td style="padding:8px">$ &lrm;475.00</td>
            <td style="padding:8px">554003</td>
            <td style="padding:8px">Saturday, May 29, 2021 :: 4 Hour Trip (AM) @Fins Up Adventure Charters</td>
            <td style="padding:8px">04/06/2021</td>
            <td style="padding:8px">Direct Links for Approved Affiliates</td>
            <td style="padding:8px">Sales</td>            
            <td style="padding:8px">Pending</td>
            <td style="padding:8px">Unpaid</td>
            <td style="padding:8px">eric matechak</td>
            <td style="padding:8px"></td>                                 
        </tr>
    </table>`;
  console.log(body);
  Sheets.Spreadsheets.batchUpdate({ requests: { pasteData: { html: true, data: body, coordinate: { sheetId: updateSheet.getSheetId(), rowIndex: 0, columnIndex: 0 } } } }, spreadsheetId);
}

注:

  • 在上面修改的脚本中,直接使用了问题中显示的 body 的值。当你想使用var body = message.getBody()时,请使用下面的脚本。如果以下脚本不起作用,您的示例值可能与以下脚本中的实际 body 不同。届时能否提供body的样本值来复现问题?借此,我想确认一下。

      function myFunction() {
        var spreadsheetId = "###"; // Please set the Spreadsheet ID.
        var sheetName = "###"; // Please set the sheet name.
    
        var ss = SpreadsheetApp.openById(spreadsheetId);
        var updateSheet = ss.getSheetByName(sheetName);
        var threads = GmailApp.search("Daily report (affiliate bookings)");
        var message = threads[0].getMessages()[0];
        var body = message.getBody();
        console.log(body);
        Sheets.Spreadsheets.batchUpdate({ requests: { pasteData: { html: true, data: body, coordinate: { sheetId: updateSheet.getSheetId(), rowIndex: 0, columnIndex: 0 } } } }, spreadsheetId);
      }
    

参考文献: