从 (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">$ ‎30.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎39.00</td>
<td style="padding:8px">$ ‎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">$ ‎28.50</td>
<td style="padding:8px">$ ‎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">$ ‎30.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎39.00</td>
<td style="padding:8px">$ ‎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">$ ‎28.50</td>
<td style="padding:8px">$ ‎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);
}
参考文献:
我试图从 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">$ ‎30.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎39.00</td>
<td style="padding:8px">$ ‎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">$ ‎28.50</td>
<td style="padding:8px">$ ‎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">$ ‎30.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎24.00</td>
<td style="padding:8px">$ ‎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">$ ‎39.00</td>
<td style="padding:8px">$ ‎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">$ ‎28.50</td>
<td style="padding:8px">$ ‎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); }