通过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: 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动态生成的内容。 - 写入表格:清空目标工作表内容,将提取到的二维数组写入表格。
使用注意事项
- 替换代码中的
YOUR_TARGET_URL为实际目标网页的URL。 - 如果网页有反爬机制,可给
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); - 日期格式化的时区可根据需求修改
Session.getScriptTimeZone()为指定时区(比如"Asia/Shanghai")。
内容的提问来源于stack exchange,提问作者James2023
相关产品推荐
相关产品推荐

