如何调整Google Apps Script实现赛事表格向Google Sheets的格式化导入?
问题描述
从BlueGolf系列站点(如指定的赛事日程页)导入赛事表格到Google Sheets,已通过=ImportTableHTML(A1,1)公式结合现有Apps Script实现数据导入,但原始数据格式混乱,无法匹配原网站布局或指定的「Model Result」模板。后续计划添加复选框列筛选赛事,再复制到其他工作表做个性化规划,需要调整导入数据的格式以符合需求。
原使用的Apps Script代码
function importTableHTML(url,n){ var html = '<table' + UrlFetchApp.fetch(url, {muteHttpExceptions: true}).getContentText().replace(/(\r\n|\n|\r|\t| )/gm,"").match(/(?<=<table).*(?=<\/table)/g) + '</table>'; var trs = [...html.matchAll(/<tr[\s\S\w]+?<\/tr>/g)]; var data = []; for (var i=0;i<trs.length;i++){ var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)]; var prov = []; for (var j=0;j<tds.length;j++){ donnee=tds[j][0].match(/(?<=\>).*(?=<\/)/g)[0]; prov.push(stripTags(donnee)); } data.push(prov); } return(data); } function stripTags(body) { var regex = /(<([^>]+)>)/ig; return body.replace(regex,""); }
解决方案
格式混乱的核心原因是原脚本未处理HTML表格的合并单元格(colspan/rowspan),导致拆分后列数不一致、布局错位。以下是修改后的脚本,可还原原网站表格布局,或匹配指定模板的列结构:
修改后的Apps Script代码
function importTableHTML(url, n) { // 获取HTML内容并清理冗余空白字符 const htmlContent = UrlFetchApp.fetch(url, { muteHttpExceptions: true }).getContentText() .replace(/(\r\n|\n|\r|\t|\s{2,})/gm, ""); // 提取指定序号的表格(n从1开始,支持多表格场景) const tableMatches = htmlContent.match(/<table[\s\S]+?<\/table>/g); if (!tableMatches || n > tableMatches.length) return []; const tableHtml = tableMatches[n - 1]; // 解析表格行 const trMatches = [...tableHtml.matchAll(/<tr[\s\S]+?<\/tr>/g)]; const data = []; const rowSpanTracker = []; // 跟踪跨行单元格剩余展示行数 trMatches.forEach((trMatch, rowIndex) => { const trHtml = trMatch[0]; const tdMatches = [...trHtml.matchAll(/<(td|th)([\s\S]+?)<\/\1>/g)]; const currentRow = []; let colIndex = 0; // 填充上一行遗留的跨行单元格占位 while (rowSpanTracker[colIndex] && rowSpanTracker[colIndex] > 0) { currentRow.push(""); rowSpanTracker[colIndex]--; colIndex++; } tdMatches.forEach(tdMatch => { const [fullTd, tag, attrs] = tdMatch; // 提取并清理单元格内容 const content = stripTags(fullTd.match(/>([\s\S]+?)<\/\1>/)[1].trim()); // 获取跨列、跨行属性值 const colspan = parseInt(attrs.match(/colspan="(\d+)"/)?.[1] || 1); const rowspan = parseInt(attrs.match(/rowspan="(\d+)"/)?.[1] || 1); // 添加当前单元格内容 currentRow.push(content); // 处理跨列:添加对应数量的空白占位 for (let i = 1; i < colspan; i++) { currentRow.push(""); colIndex++; } // 处理跨行:记录到跟踪器,后续行自动填充占位 if (rowspan > 1) { rowSpanTracker[colIndex] = rowspan - 1; } colIndex++; }); // 补全行尾空白,确保所有行的列数统一 const maxCols = Math.max(...data.map(row => row.length), currentRow.length); while (currentRow.length < maxCols) { currentRow.push(""); } data.push(currentRow); }); return data; } function stripTags(body) { return body.replace(/(<([^>]+)>)/ig, ""); }
关键改进说明
- 支持指定导入第n个表格(适配多表格页面场景)
- 新增合并单元格处理逻辑:自动识别colspan/rowspan,填充空白占位,保证每行列数一致
- 优化HTML解析规则,减少匹配错误
- 保留内容的必要空格,避免文本过度压缩
使用步骤
- 打开Google Sheets的「扩展程序」→「Apps脚本」,替换原代码为上述修改后的版本,保存并运行授权
- 依然使用公式
=ImportTableHTML(A1,1)(A1单元格存放目标站点URL,1表示取页面第一个表格) - 导入后数据将自动对齐列,匹配原网站表格布局或「Model Result」模板结构
- 添加复选框列:选中目标列→「数据」→「数据验证」→ 选择「复选框」,完成后即可筛选赛事
- 复制筛选后的数据到其他工作表:可手动复制,或编写简单脚本实现自动复制(示例:使用
getRange().copyTo()方法)
内容的提问来源于stack exchange,提问作者onsitenow
相关产品推荐
相关产品推荐

