使用IMPORTHTML导入MetalsDaily金属价格表,谷歌表格数值缺失求助
解决Google Sheets IMPORTHTML导入MetalsDaily金属价格数值不显示的问题
问题根源
MetalsDaily网站的「LIVE METALS PRICES」表格内的价格数值是通过JavaScript动态渲染生成的,而IMPORTHTML函数仅能抓取页面初始加载时的静态HTML内容,无法解析或执行JavaScript,因此会出现表格结构正常但数值为空的情况。
解决方案1:用Google Apps Script抓取动态内容
这是最可靠的解决方式,步骤如下:
- 打开目标Google Sheet,点击菜单栏「扩展程序」→「Apps Script」进入脚本编辑器。
- 删除默认代码,粘贴以下脚本:
function fetchMetalsPrices() { const targetUrl = "https://www.metalsdaily.com"; const fetchOptions = {muteHttpExceptions: true}; const response = UrlFetchApp.fetch(targetUrl, fetchOptions); const pageHtml = response.getContentText(); // 解析页面DOM,提取表格数据(若网站更新结构需调整XPath规则) const xmlDoc = XmlService.parse(pageHtml); const rootElement = xmlDoc.getRootElement(); const htmlNamespace = rootElement.getNamespace(); const tableRows = xmlDoc.getDescendants(XmlService.getNamespace("http://www.w3.org/1999/xhtml"), "tr"); const priceData = []; tableRows.forEach(row => { const cells = row.getChildren("td", htmlNamespace); if (cells.length > 0) { const rowContent = cells.map(cell => cell.getText().trim()); priceData.push(rowContent); } }); // 将数据写入当前Sheet的A1起始位置 const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); activeSheet.clearContents(); activeSheet.getRange(1, 1, priceData.length, priceData[0]?.length || 0).setValues(priceData); }
- 保存脚本(命名如
MetalsPriceScraper),点击运行按钮,首次运行需授权脚本访问权限。 - 若需要自动更新,可在脚本编辑器左侧点击「触发器」图标,设置定时执行规则(比如每5分钟更新一次)。
解决方案2:尝试提取页面静态数据源
部分动态网站会在页面<script>标签中嵌入JSON格式的数据源,可尝试用IMPORTXML提取后解析:
在Sheet单元格中输入公式:
=IMPORTXML("https://www.metalsdaily.com", "//script[contains(text(), 'livePrices')]/text()")
若提取到有效数据,可搭配REGEXEXTRACT、SPLIT等函数解析出价格数值。
注意:网站的DOM结构或数据源格式可能随时变更,若后续脚本/公式失效,需重新分析页面结构调整规则。
内容的提问来源于stack exchange,提问作者Ong K.S
相关产品推荐
相关产品推荐

