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

通过App Script导入动态HTML表格数据到Google表格遇空白问题求助

问题描述

尝试通过Google Apps Script将网页表格数据导入Google表格,日志无报错但单元格始终为空。由于网站日期数据为JavaScript动态生成,无法使用内置的IMPORTHMTL函数,曾尝试getChild()、getChildren()方法均无效。目标网页的核心HTML结构如下:

<html>
  <head>
    <title>TITLE AAAAA</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible">
    <style type="text/css">
      body {font-size: 12px;font-family: Arial}
      td {font-size: 12px;line-height: 20px;font-family: Arial}
    </style>
    <script type="text/javascript" language="javascript" src="Function.js"></script>
  </head>
  <body>
    <p align="center"><b>AAAA: &nbsp; AAAAAA</b></p>
    <table width="300" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#0066cc">
      <tbody>
        <tr align="center" bgcolor="#333399" class="font13">
          <td width="150"><b><font color="#ffffff">TO_CELL_A1_TEXT</font></b></td>
          <td width="150"><b><font color="#ffffff">TO_CELL_B1_TEXT</font></b></td>
          <td width="150"><b><font color="#ffffff">TO_CELL_C1_TEXT</font></b></td>
          <td width="150"><b><font color="#ffffff">TO_CELL_D1_TIME_TEXT</font></b></td>
        </tr>
        <tr align="center" bgcolor="#FFFFFF">
          <td height="20"><b><font color="red">TO_CELL_A2_TEXT</font></b></td>
          <td><b><font color="red">TO_CELL_B2_TEXT</font></b></td>
          <td><b><font color="red">TO_CELL_C2_TEXT</font></b></td>
          <td>
            <script>showtime(2023, 01 - 1, 13, 23, 01, 12)</script>"TO_CELL_D2_TIME_TEXT"
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    <p align="center">SITE_NAME</p>
  </body>
</html>
解决方案

核心原因

Google Apps Script的UrlFetchApp获取的是网页静态原始HTML,不会执行页面中的JavaScript代码,因此动态生成的日期无法直接获取,需要从script标签中提取参数手动计算;同时表格单元格内容嵌套了<b>、<font>标签,直接用getChild()可能无法正确提取文本。

完整实现代码

function importDynamicTable() {
  // 替换为目标网页的URL
  const url = "YOUR_TARGET_URL";
  const response = UrlFetchApp.fetch(url);
  const html = response.getContentText();
  
  // 1. 解析表格内容
  const tableMatch = html.match(/<table[^>]*>([\s\S]*?)<\/table>/);
  if (!tableMatch) {
    Logger.log("未找到目标表格");
    return;
  }
  const tableHtml = tableMatch[1];
  
  // 2. 提取表格的行数据
  const rows = tableHtml.match(/<tr[^>]*>([\s\S]*?)<\/tr>/g);
  if (!rows) {
    Logger.log("未找到表格行");
    return;
  }
  
  const data = [];
  rows.forEach(row => {
    const cells = row.match(/<td[^>]*>([\s\S]*?)<\/td>/g);
    if (cells) {
      const rowData = [];
      cells.forEach(cell => {
        // 提取单元格内的文本(去掉HTML标签)
        let text = cell.replace(/<[^>]+>/g, "").trim();
        
        // 处理动态日期:匹配showtime函数参数
        const scriptMatch = cell.match(/showtime\((\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)\)/);
        if (scriptMatch) {
          // 解析参数:年, 月(注意原代码是01-1=0,对应1月), 日, 时, 分, 秒
          const year = parseInt(scriptMatch[1]);
          const month = parseInt(scriptMatch[2]) + 1; // 修正为实际月份(0对应1月)
          const day = parseInt(scriptMatch[3]);
          const hour = parseInt(scriptMatch[4]);
          const minute = parseInt(scriptMatch[5]);
          const second = parseInt(scriptMatch[6]);
          // 生成日期对象
          const date = new Date(year, month - 1, day, hour, minute, second);
          // 格式化为需要的字符串,比如"YYYY-MM-DD HH:mm:ss"
          text = Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
        }
        
        rowData.push(text);
      });
      data.push(rowData);
    }
  });
  
  // 3. 将数据写入Google表格(这里默认写入当前表格的A1开始位置)
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clearContents();
  if (data.length > 0) {
    sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
    Logger.log("数据导入成功,共导入" + data.length + "行");
  } else {
    Logger.log("未提取到有效数据");
  }
}

关键步骤说明

  • 获取静态HTML:用UrlFetchApp.fetch获取网页原始代码,不执行JS。
  • 提取表格和行:用正则表达式匹配表格及内部的行、单元格,避免XML解析对不规范HTML的兼容性问题。
  • 提取单元格文本:通过正则去掉所有HTML标签,得到纯文本。
  • 处理动态日期:从showtime函数中提取日期参数,手动计算生成日期对象并格式化,替代原JS动态生成的内容。
  • 写入表格:清空目标工作表内容,将提取到的二维数组写入表格。

使用注意事项

  1. 替换代码中的YOUR_TARGET_URL为实际目标网页的URL。
  2. 如果网页有反爬机制,可给UrlFetchApp.fetch添加请求头,示例:
    const options = {
      headers: {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
      }
    };
    const response = UrlFetchApp.fetch(url, options);
    
  3. 日期格式化的时区可根据需求修改Session.getScriptTimeZone()为指定时区(比如"Asia/Shanghai")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:20:50