Google Sheets中Apps Script拆分HTML标签的异常问题修复请求
问题分析与解决方案
需求说明
通过Apps Script拆分文章内容,规则如下:
- 第一列存放
<h1>标签内容 - 第二列存放第一个
<h2>标签内容,对应列存放该<h2>下所有<p>段落 - 后续
<h2>依次类推,到第7个<h2>后,剩余内容统一放入最后一列
问题排查
当前代码仅最后一行文章处理异常,原因是<p>段落中包含额外嵌套HTML标签,这些行没有以<p>开头,被误判为非<p>内容,未归入对应<p>列。
修改后的代码
function splitArticleContent() { const sheetName = "Sheet1"; // 设置工作表名称 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); const range = sheet.getRange("A3:A" + sheet.getLastRow()); const temp1 = range.getValues().map(([a]) => a.split("\n").reduce((o, e, i, arr) => { let m = e.match(/^<(.*?)>/); let tag = m ? m[1].toUpperCase() : ""; // 判断当前行是否是新的标题标签(H1/H2) const isHeadingTag = tag === "H1" || tag === "H2"; if (isHeadingTag) { // 如果正在收集P段落,先把已收集的P存入结果 if (o.temp.length > 0) { o.res.push(o.temp); o.temp = []; } // 添加标题内容 o.res.push([e]); } else { // 非标题标签,判断是否处于P段落收集状态 // 如果temp已有内容,或者当前行属于P段落的一部分(包括嵌套标签) if (o.temp.length > 0 || tag === "P") { o.temp.push(e); } // 处理最后一行,确保剩余的P内容被存入 if (i === arr.length - 1 && o.temp.length > 0) { o.res.push(o.temp); o.temp = []; } } return o; }, { res: [], temp: [] }).res ).map(e => e.map(f => f.join("\n"))); const res = temp1.map(r => { let n = 0; // 找到第7个H2的位置 const idx = r.findIndex(e => { if (e && e.toUpperCase().includes("H2")) { n++; return n === 7; } return false; }); // 拆分:前7个H2相关内容 + 剩余内容合并 if (idx > -1) { return [...r.splice(0, idx + 1), r.join("\n").trim()]; } else { return r; } }); const maxLen = Math.max(...res.map(r => r.length)); const values = res.map(r => [...r, ...Array(maxLen - r.length).fill(null)]); range.offset(0, 2, values.length, values[0].length).setValues(values); }
关键修改点
- 调整段落收集逻辑:不再仅通过行首标签判断是否为
<p>内容,而是通过「是否处于<p>收集状态」来判断——只要已经开始收集<p>段落,后续的嵌套标签行都会被归入当前段落。 - 修正第7个H2的定位:改用
findIndex更准确地找到第7个<h2>的位置,确保拆分点正确。 - 完善最后一行处理:无论最后一行是什么标签,只要有未完成的
<p>收集,都会被存入结果。
内容的提问来源于stack exchange,提问作者user8702720
相关产品推荐
相关产品推荐

