如何在Google Apps Script中将段落HTML字符串转为无标签纯文本
你代码存在的核心问题
- 使用
XmlService.parse()处理非严格规范的HTML:该方法仅支持符合XML语法的内容,Workday返回的HTML通常存在未闭合标签、未转义特殊字符(如&、<)等问题,直接解析会抛出异常 <br>替换逻辑错误:你直接把<br>替换为空字符串,会导致原有段落换行丢失,最终文本挤成一团不符合格式要求- 冗余无效代码:遍历数据时
data[i][0];、data[i][1];两行无任何实际作用 - 文本提取逻辑冗余:你先格式化XML再用正则删标签的流程多此一举,直接提取XML节点的文本内容即可,无需额外正则处理
修正后的代码
首先替换你的toStringFromHtml函数,同时优化主逻辑的冗余部分:
function pullDataFromWorkday() { var url = 'https://services1.myworkday.com/ccx/service/customreport2/[company name]/[owner\'s email]/[Report Name]?format=csv'; var b64 = 'asdfghjklkjhgfdfghj=='; var response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Basic '+ b64 } }); if (response.getResponseCode() >= 200 && response.getResponseCode() < 300) { var blob = response.getBlob(); var string = blob.getDataAsString(); var data = Utilities.parseCsv(string, ","); // 遍历处理HTML列,跳过表头行 for(let i=1;i<data.length;i++) { data[i][2] = toStringFromHtml(data[i][2]); data[i][3] = toStringFromHtml(data[i][3]); data[i][4] = toStringFromHtml(data[i][4]); data[i][5] = toStringFromHtml(data[i][5]); } var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName('Sheet1'); sheet.clear(); sheet.getRange(1,1,data.length,data[0].length).setValues(data); } else { return; } } function toStringFromHtml(html) { if(!html) return ""; // 预处理HTML:替换br为换行符,转义特殊字符,补全不规范标签 html = html.replace(/<br\s*\/?>/gi, '\n') .replace(/&(?!amp;|lt;|gt;|quot;|apos;)/g, '&'); try { // 包裹为根节点保证XML结构合法 const root = XmlService.parse(`<div>${html}</div>`).getRootElement(); // 递归提取所有节点的文本内容 const getText = (element) => { let text = element.getText(); element.getChildren().forEach(child => { text += getText(child); }); return text; }; return getText(root).trim(); } catch(e) { // 解析失败时降级用正则直接提取文本,兼容极端不规范HTML return html.replace(/<[^>]+>/g, '').trim(); } }
额外注意点
- 如果你返回的HTML包含
<p>标签,上述代码会自动保留段落内的内容,同时保留换行格式,和你需要的样例效果一致 - 解析失败的降级逻辑可以保证即使HTML语法完全不规范,也能提取出纯文本内容,不会导致整个脚本中断
内容的提问来源于stack exchange,提问作者Nadila
相关产品推荐
相关产品推荐

