Google Sheets Apps Script parseHtml函数报错,请求修复表格抓取代码
修复后的Google Apps Script代码
以下是修复后的完整代码,解决了HTML解析失败和按钮添加的问题:
function extractData() { var url = "https://www.theopenalliance.com/teams/2023/"; // 开启异常静默,避免请求失败直接报错 var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); var html = response.getContentText(); var data = parseHtml(html); var sheet = SpreadsheetApp.getActiveSheet(); sheet.clearContents(); if (data.length > 0) { // 写入表格数据 sheet.getRange(1, 1, data.length, data[0].length).setValues(data); // 为含链接的单元格添加富文本链接(替代原attachButton) for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { var cellValue = data[i][j]; if (cellValue && cellValue.indexOf("http") === 0) { var range = sheet.getRange(i + 1, j + 1); // 创建富文本,显示"Link"并绑定链接 var richText = SpreadsheetApp.newRichTextValue() .setText("Link") .setLinkUrl(cellValue) .build(); range.setRichTextValue(richText); } } } } } function parseHtml(html) { var data = []; try { // 用HtmlService解析DOM,避免字符串匹配的脆弱性 var doc = HtmlService.createHtmlOutput(html).getDocument(); // 定位页面中的目标表格(页面唯一的团队数据表格) var table = doc.querySelector("table"); if (!table) return data; // 获取所有行(包含表头) var rows = table.querySelectorAll("tr"); rows.forEach(function(row) { var rowData = []; // 获取行内所有单元格(td和th) var cells = row.querySelectorAll("td, th"); cells.forEach(function(cell) { // 检查单元格内是否有链接 var link = cell.querySelector("a"); if (link) { // 提取链接地址,处理相对链接 var href = link.getAttribute("href"); if (href.startsWith("/")) { href = "https://www.theopenalliance.com" + href; } rowData.push(href); } else { // 提取纯文本内容并去除首尾空格 rowData.push(cell.textContent.trim()); } }); if (rowData.length > 0) { data.push(rowData); } }); } catch (e) { console.error("解析HTML出错: ", e); } return data; }
修复说明
HTML解析逻辑重构
- 放弃原有的字符串匹配和分割方式,改用
HtmlService解析DOM结构,避免因HTML标签带属性(如<tbody class="xxx">)导致的匹配失败问题。 - 自动处理相对链接(如
/teams/xxx),转换为完整URL。
- 放弃原有的字符串匹配和分割方式,改用
按钮功能替换
- 原代码中
attachButton方法不存在,改用富文本链接实现点击跳转功能,显示文本为"Link",点击后打开对应链接。
- 原代码中
异常处理增强
- 请求时添加
muteHttpExceptions: true,避免因HTTP请求异常直接中断脚本;解析过程添加try-catch,便于排查问题。
- 请求时添加
内容的提问来源于stack exchange,提问作者mollinas
相关产品推荐
相关产品推荐

