google-apps-script - 保存在 Google Drive 中的 HTML 文件将被解析为电子表格
问题描述
我有一个来自银行的 HTML 格式的文件。他们在交易发生时发送此文件,我有一个 appscript 将附件保存到 Drive 文件夹。我想解析 HTML 并将表格复制到底部附加的电子表格中。
我已经创建了这段代码,但是 HTML 的 XML 解析对我来说是一个谜,所以它不起作用
function parseTablesFromHTML() {
var folderId = "1NrgsTgB3q573wav3cQsse4sAT8poeI77";
var folder = DriveApp.getFolderById(folderId);
var htmls = folder.getFilesByType(MimeType.HTML);
var sheetId = "https://docs.google.com/spreadsheets/d/1B-mjEUqvy49Wvct13XrWi6TU1dw1VPwesfYJRKJ5T6s/edit#gid=0";
//Set up spreadsheet
var ss = SpreadsheetApp.openByUrl(sheetId);
SpreadsheetApp.setActiveSpreadsheet(ss);
Logger.log('File name: ' + ss.getName());
var sheet = ss.getSheetByName("test");
var range = sheet.getRange(sheet.getLastRow(),sheet.getLastColumn());
while (htmls.hasNext()) {
var html = htmls.next().getId();
var response = DriveApp.getFileById(html).getBlob().getDataAsString();
var xmlDoc = XmlService.parse(response);
var b = xmlDoc.getElement().getElement("body");
var table = b.getElement("div").getElement("div").getElement("div").getElements("div")[1].getElement("table");
var rows = [];
var trs = table.getElements("tr");
for (var r=0,rlength=trs.length; r<rlength; r++) {
var tds = trs[r].getElements("td");
var row = [];
for (var c=0,clength=tds.length; c<clength; c++) {
row.push(tds[c].getText());
}
rows.push(row);
}
Logger.log(Utilities.jsonStringify(rows));
}
}
html代码看起来像这样
<table bordercolor="black" cellspacing="0" cellpadding="4" width="100%" class="style0" BORDER="1" FRAME="BOX" RULES="NONE">
<tr>
<td class="td-header" align="center" width="15%">Process date</td>
<td class="td-header" align="center" width="5%">Reference</td>
<td class="td-header" align="center" width="10%">Value date</td>
<td class="td-header" align="right" width="5%">Amount</td>
<td class="td-header" align="center" width="5%">Type</td>
<td class="td-header" align="left" width="40%">Description</td>
<td class="td-header" align="center" width="25%">details BISERA</td>
</tr>
<tr>
<td colspan="7">
<hr size="1" />
</td>
</tr>
<tr>
<td nowrap="nowrap" align="center">02.10.2020 16:13:22</td>
<td nowrap="nowrap" align="right">
<font color="blue">286B2P12027600HM</font>
</td>
<td nowrap="nowrap" align="center">02.10.2020</td>
<td nowrap="nowrap" align="right">317.63</td>
<td nowrap="nowrap" align="center">CT</td>
<td nowrap="nowrap" align="left">Получен междубанков превод<br /><br />PO F 303<br />.</td>
<td align="center">
<table>
<tr>
<td align="right" nowrap="nowrap">test iban</td>
</tr>
<tr>
<td align="right" nowrap="nowrap">test</td>
</tr>
</table>
解决方案
注意事项
.getElement()
不是函数。我认为这是您问题的根本原因,因为您将无法调用不存在的方法。
这是 XmlService 的文档类文档,请在调整此答案中的示例以适应您的解决方案时参考它。
代码片段
这是获取第一行单元格文本的方法:(表格标题)
var html = 'the html code you posted in the question';
var parsed = XmlService.parse(html);
Logger.log(
parsed.getRootElement()
.getChildren('tr')[0] // Gets the first row (headers)
.getChildren('td')
.map(cell => cell.getText())
); //[Process date, Reference, Value date, Amount, Type, Description, details BISERA]
参考
推荐阅读
- web-scraping - 使用文本模块进行 PDF 抓取
- c - c 语法的问题 - const * const * 定义
- html - 如何选择所需表单的元素,同时在初始框中显示选择元素的名称(仅限 HTML)?
- node.js - 在 mocha 测试之间重新导入模块
- bash - Bash 脚本自动化:涉及将文件从源复制到目标,在目标执行脚本并将结果从目标复制到源
- javascript - 使用 exec() 在 cmd 行中的电子 js 上执行命令“ADB 设备”
- node.js - 基于环回自定义角色的 ACL 不起作用
- java - 使用相同接口的对象并锁定执行工作的队列
- java - Solace JMS 消费者在重新连接后停止
- c# - 如何强制 c# NewtonSoft 反序列化器使用已创建的对象进行反序列化