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

如何解析脚本内包含合并单元格的HTML表格表头

问题原因

你原有脚本的核心问题出在HTML结构提取逻辑上:

  • 用split('document')[2]加正则匹配的方式,直接把所有标签拼接进了同一行,完全丢失了原本4行的表头结构
  • 解析时只提取了单元格文本,没有处理rowspan/colspan属性对应的占位逻辑,自然无法识别合并区域
修正后的解决方案

以下是适配需求的完整脚本,逻辑是先正确提取完整表头结构,再通过占位标记处理合并单元格:

function getHeaders(url) {
  // 1. 拉取JS内容并提取完整的thead HTML
  var source = UrlFetchApp.fetch(url).getContentText();
  var theadMatch = source.match(/<thead>[\s\S]*?<\/thead>/)[0];
  // 拼接成合法的完整表格,处理HTML实体和换行
  var tableHtml = `<table>${theadMatch}</table>`
    .replace(/&ecirc;/g, 'ê')
    .replace(/&uacute;/g, 'ú')
    .replace(/<br>/g, '\n')
    .replace(/&lt;/g, '<').replace(/&gt;/g, '>'); // 补全实体转义

  // 2. 解析XML结构
  var doc = XmlService.parse(tableHtml);
  var root = doc.getRootElement();
  var thead = root.getChild('thead');
  var rows = thead.getChildren('tr');

  // 3. 初始化变量处理合并单元格
  var headers = [];
  // 占位数组,记录每一列需要向下占位的剩余行数
  var rowSpanHold = [];

  for (var r = 0; r < rows.length; r++) {
    var currentRow = [];
    var cells = rows[r].getChildren('th');
    var cellIdx = 0;

    // 先填充上一行遗留的rowspan占位
    for (var c = 0; c < rowSpanHold.length; c++) {
      if (rowSpanHold[c] > 0) {
        currentRow.push(headers[r-1][c]); // 复用上方合并单元格的内容
        rowSpanHold[c]--;
      } else {
        // 处理当前行的单元格
        if (cellIdx < cells.length) {
          var cell = cells[cellIdx];
          var content = cell.getText().trim();
          var colspan = parseInt(cell.getAttribute('colspan')?.getValue() || 1);
          var rowspan = parseInt(cell.getAttribute('rowspan')?.getValue() || 1);
          
          // 按colspan填充当前行
          for (var k = 0; k < colspan; k++) {
            currentRow.push(content);
            // 记录需要向下占位的行数
            rowSpanHold[c + k] = rowspan - 1;
          }
          cellIdx++;
        }
      }
    }

    // 处理第一行新增的列,初始化占位数组
    while (cellIdx < cells.length) {
      var cell = cells[cellIdx];
      var content = cell.getText().trim();
      var colspan = parseInt(cell.getAttribute('colspan')?.getValue() || 1);
      var rowspan = parseInt(cell.getAttribute('rowspan')?.getValue() || 1);
      
      for (var k = 0; k < colspan; k++) {
        currentRow.push(content);
        rowSpanHold.push(rowspan - 1);
      }
      cellIdx++;
    }

    headers.push(currentRow);
  }

  return headers;
}
输出说明

该脚本返回的是展开合并单元格后的二维数组,你给出的示例表头解析后结果如下:

[
  ["Mês de\nReferência", "Taxas - %", "Taxas - %", "Taxas - %", "Taxas - %", "Taxas - %", "Taxas - %", "Taxas - %"],
  ["Mês de\nReferência", "Mensal", "Anualizada", "Anualizada", "Anualizada", "Anualizada", "Acumulada", "Acumulada"],
  ["Mês de\nReferência", "Mensal", "Ano de\n252 dias\núteis", "Ano de\n252 dias\núteis", "Ano de\n365/366 dias\ncorridos", "Ano de\n365/366 dias\ncorridos", "No ano", "Em \n12 meses"],
  ["Mês de\nReferência", "Mensal", "Dias", "Taxa", "Dias", "Taxa", "No ano", "Em \n12 meses"]
]

如果需要保留合并属性的原始结构而非展开,可以调整逻辑在返回结果中附加每个单元格的rowspan、colspan属性值即可。

内容的提问来源于stack exchange,提问作者Mike Steelson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:48:03