You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script解析银行HTML交易表并导入Google Sheets问题排查

解决HTML银行交易表格解析并导入Google Sheets的问题

我来帮你搞定这个银行HTML交易表解析的问题!你的代码卡壳主要在XML解析的严格性、DOM路径硬编码这些地方,我给你调整了一版更健壮的代码,还补上了Sheets数据追加的逻辑,一起来看看:

问题分析

你的原代码踩了几个常见坑:

  • XML解析的严格性:XmlService.parse()要求完全符合XML规范,但银行发来的HTML往往有未闭合标签(比如<br>)、大小写不统一的标签,直接解析会报错。
  • 硬编码DOM路径:你通过多层getElement("div")定位表格,一旦HTML结构微调(比如多了个div层级),代码直接崩掉,应该直接定位目标table元素。
  • 嵌套表格处理:交易详情列里有子表格,原代码会把所有子单元格的文本混在一起,导致数据格式混乱。
  • 缺失Sheets写入逻辑:解析完数据后没有把内容追加到Google Sheets的底部,等于做了无用功。

修改后的完整代码

function parseTablesFromHTML() { 
  var folderId = "1NrgsTgB3q573wav3cQsse4sAT8poeI77"; 
  var folder = DriveApp.getFolderById(folderId); 
  var htmlFiles = folder.getFilesByType(MimeType.HTML); 
  var sheetId = "1B-mjEUqvy49Wvct13XrWi6TU1dw1VPwesfYJRKJ5T6s"; 
  
  // 初始化表格
  var ss = SpreadsheetApp.openById(sheetId); // 用ID比URL更可靠
  var sheet = ss.getSheetByName("test"); 
  if (!sheet) {
    sheet = ss.insertSheet("test"); // 防止目标sheet不存在
  }

  while (htmlFiles.hasNext()) { 
    var htmlFile = htmlFiles.next();
    Logger.log('正在处理文件: ' + htmlFile.getName());
    
    // 读取并预处理HTML,转成合法XML格式
    var htmlContent = htmlFile.getBlob().getDataAsString();
    var cleanedHtml = htmlContent
      .replace(/<br>/g, "<br/>") // 闭合未结束的br标签
      .replace(/<hr size="1" />/g, "<hr size=\"1\"/>")
      .replace(/<([a-z]+)/g, (match, tag) => "<" + tag.toUpperCase()) // 标签统一转大写
      .replace(/<\/([a-z]+)/g, (match, tag) => "</" + tag.toUpperCase());

    try {
      var xmlDoc = XmlService.parse(cleanedHtml); 
      var root = xmlDoc.getRootElement();
      
      // 递归查找所有table元素,避免硬编码DOM路径
      var tables = findElementsByTagName(root, "TABLE");
      if (tables.length === 0) {
        Logger.log('文件中未找到表格: ' + htmlFile.getName());
        continue;
      }

      // 根据表格class筛选目标交易表(更准确)
      var targetTable = tables.find(table => {
        var classAttr = table.getAttribute("CLASS");
        return classAttr && classAttr.getValue() === "style0";
      });

      if (!targetTable) {
        Logger.log('未找到目标交易表格: ' + htmlFile.getName());
        continue;
      }

      var rows = [];
      var trs = targetTable.getElements("TR"); 
      
      for (var r = 0; r < trs.length; r++) { 
        var tds = trs[r].getElements("TD"); 
        if (tds.length !== 7) continue; // 跳过带hr的分隔行
        
        var row = [];
        for (var c = 0; c < tds.length; c++) { 
          var cellContent = tds[c].getText().trim();
          // 处理嵌套表格:把子表格内容拼接成易读的文本
          var subTables = findElementsByTagName(tds[c], "TABLE");
          if (subTables.length > 0) {
            var subTexts = [];
            subTables.forEach(subTable => {
              subTable.getElements("TR").forEach(subTr => {
                subTr.getElements("TD").forEach(subTd => {
                  subTexts.push(subTd.getText().trim());
                });
              });
            });
            cellContent = subTexts.join("\n");
          }
          // 替换多余换行符,保持单元格内容整洁
          cellContent = cellContent.replace(/\n+/g, " ").trim();
          row.push(cellContent);
        }
        rows.push(row);
      }

      // 跳过表头,把交易数据追加到表格底部
      if (rows.length > 1) {
        var dataToAppend = rows.slice(1); // 移除第一行表头
        sheet.getRange(
          sheet.getLastRow() + 1, 
          1, 
          dataToAppend.length, 
          dataToAppend[0].length
        ).setValues(dataToAppend);
        Logger.log('成功追加 ' + dataToAppend.length + ' 行数据');
      }

    } catch (e) {
      Logger.log('处理文件出错: ' + htmlFile.getName() + ',错误信息: ' + e.message);
    }
  }
}

// 递归查找指定标签名的元素(兼容XML的大小写要求)
function findElementsByTagName(element, tagName) {
  var result = [];
  if (element.getName() === tagName) {
    result.push(element);
  }
  var children = element.getChildren();
  for (var i = 0; i < children.length; i++) {
    result = result.concat(findElementsByTagName(children[i], tagName));
  }
  return result;
}

关键修改说明

  • HTML预处理:修复未闭合标签、统一标签大小写,确保能被XmlService正常解析。
  • 动态定位表格:用递归函数查找所有table元素,再通过class="style0"筛选目标交易表,不再依赖固定DOM结构,代码更健壮。
  • 嵌套表格处理:自动识别单元格内的子表格,把所有子内容拼接成一行文本,避免数据混乱。
  • 错误处理:添加try-catch捕获解析或处理中的错误,避免整个脚本崩溃,同时打印日志方便排查问题。
  • Sheets写入优化:自动跳过表头行,把交易数据追加到表格底部,还处理了目标sheet不存在的情况。

内容的提问来源于stack exchange,提问作者Dimitar C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:37:52