如何解析脚本内包含合并单元格的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(/ê/g, 'ê') .replace(/ú/g, 'ú') .replace(/<br>/g, '\n') .replace(/</g, '<').replace(/>/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
相关产品推荐
相关产品推荐

