You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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解析规则,减少匹配错误
  • 保留内容的必要空格,避免文本过度压缩

使用步骤

  1. 打开Google Sheets的「扩展程序」→「Apps脚本」,替换原代码为上述修改后的版本,保存并运行授权
  2. 依然使用公式=ImportTableHTML(A1,1)(A1单元格存放目标站点URL,1表示取页面第一个表格)
  3. 导入后数据将自动对齐列,匹配原网站表格布局或「Model Result」模板结构
  4. 添加复选框列:选中目标列→「数据」→「数据验证」→ 选择「复选框」,完成后即可筛选赛事
  5. 复制筛选后的数据到其他工作表:可手动复制,或编写简单脚本实现自动复制(示例:使用getRange().copyTo()方法)

内容的提问来源于stack exchange,提问作者onsitenow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:15:32