首页 > 解决方案 > 保存在 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>

标签: google-apps-scriptgoogle-workspace

解决方案


注意事项

.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]

参考

xml服务文档

xml服务


推荐阅读