1

我正在尝试从 Gmail 中的电子邮件正文中获取 HTML 表格到 Google 表格中,并且在 XmlService.parse 方法上出现错误。我在这里阅读了一些问题,问题似乎是电子邮件在 Html 中,而 XmlService 正试图将其解析为 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>

我得到的错误是:

例外:第 19 行错误:实体“lrm”已被引用,但未声明。

4

1 回答 1

2

我相信你现在的情况和你的目标如下。

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

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

修改后的脚本:

在使用此脚本之前,请在 Advanced Google services 中启用 Sheets API

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

参考:

于 2021-04-09T01:13:12.227 回答