跳到主要內容跳到頁尾

網頁資料匯入函式:IMPORTHTML、IMPORTDATA、IMPORTFEED

8 分鐘閱讀Lv.3 中級摘要與日期

IMPORTHTML 抓網頁表格與清單、IMPORTDATA 讀 CSV 網址、IMPORTFEED 讀 RSS 訂閱,逐一整理語法、範例、更新頻率、限制與常見錯誤,並說明什麼時候該改用 IMPORTXML。

發布 更新

文章目錄

每天手動把網頁上的表格複製貼進試算表,只要一個禮拜忘記,數字就舊了。今天整理三個可以把網址的內容直接拉進試算表的函式:IMPORTHTML、IMPORTDATA 和 IMPORTFEED。

我自己最常用的是 IMPORTDATA,其次是 IMPORTHTML,IMPORTFEED 用得少,通常是想把某個網站的最新文章標題放進儀表板才會寫。要精準抓網頁上某個元素的 IMPORTXML 另外有一篇,IMPORTXML:精確抓取網頁資料,這裡不重講。

先選函式

看你的網址指到什麼東西:

網址指到的東西用哪個函式
網頁裡的表格或清單IMPORTHTML
一個 .csv 或 .tsv 檔IMPORTDATA
RSS 或 ATOM 訂閱IMPORTFEED
網頁裡某個特定元素(用 XPath 指定)IMPORTXML
另一份 Google 試算表IMPORTRANGE

能用簡單的就用簡單的,IMPORTDATA 比 IMPORTHTML 穩,IMPORTHTML 比 IMPORTXML 好維護。下面的範例網址都是公開、不需要登入的來源:維基百科、GitHub 上的公開資料集、BBC 的 RSS。

三個函式

IMPORTHTML

把網頁裡的表格或清單抓進試算表。

語法:

  • 網址:完整網址,要加 https://,並用雙引號包起來,也可以放在別的儲存格再參照。
  • 查詢:"table" 抓表格,"list" 抓項目清單(ul 或 ol)。
  • 索引:網頁裡第幾個表格或清單,從 1 開始,表格與清單各自計數。

左邊網頁依出現順序有 table 1、table 2、list 1 三塊,右邊試算表從 A1 展開其中的 table 2← 左右滑動看完整的圖,點圖可放大

圖:索引是「這一種」東西的第幾個,圖裡是拿第 2 個表格。

我想把莫氏硬度表放進試算表。維基百科 Mohs scale of mineral hardness 這頁,2026 年 10 月時第 1 個表格就是它,所以:

Google 試算表公式
fx

抓維基百科莫氏硬度頁面的第 1 個表格

=IMPORTHTML( "https://en.wikipedia.org/wiki/Mohs_scale_of_mineral_hardness", "table", 1 )

第一次在檔案裡用 IMPORT 系列函式,儲存格會先顯示 #REF!,畫面上方出現黃色橫幅:「警告:某些公式正試圖傳送資料到外部或接收外部的資料。」右邊有「瞭解詳情」和「允許存取」,按「允許存取」之後,資料才會載入。這份檔案裡之後的 IMPORT 函式不用再按。

公式放在 A1,表格會從 A1 往右往下展開,共 11 列 5 欄:第 1 列是標題,第 2 列開始是 10 種礦物,E 欄是圖片,抓進來是空白。來看看前幾列(C 欄是化學式,E 欄是空白,這裡略過):

列ABD
1Mohs hardnessReference mineralAbsolute hardness[14]
2*1*Talc1
3*2*Gypsum2
4*3*Calcite14
5*4*Fluorite21
6*5*Apatite48

有幾個地方跟網頁上看到的不一樣:

  • A 欄不是數字 1 到 10,而是文字 *1*、*2* … *10*,前後帶著星號。所以拿 A 欄去 SUM、排序或比較大小都不對。要變回數字,可以用 。
  • 標題列的文字含換行(Mohs 和 hardness 中間是換行,上表合併成一行顯示),而且 D 欄標題的 [14] 是維基百科的註腳,也一起抓進來了。
  • 第 7 列的礦物是 Orthoclase feldspar,中間是換行,不是空格。
  • D 欄的絕對硬度是數字:1、2、14、21、48、72、100、200、400、1500。

到第 11 列是 10 號 Diamond,絕對硬度 1500。

要抓清單就把第二個參數換成 "list",例如 抓頁面上第 2 個清單,每個項目一列。

要注意的地方:

  • 索引不固定。維基百科這種會被編輯的頁面,哪天上方多插了一個表格,索引就整個往後移,抓到的就變成別張表。給別人用的檔案,我會在旁邊放一格表頭,對不上時一眼看得出來。
  • 不知道索引是多少,就從 1 開始往上試。
  • 只能讀伺服器回傳的 HTML。網頁是先載入空殼、之後才用 JavaScript 填資料的,IMPORTHTML 看不到那些內容,IMPORTXML 也一樣。

IMPORTDATA

把 .csv 或 .tsv 網址的內容讀進來,逗號(TSV 是 Tab)自動分成欄。

語法:

  • 網址:指向 CSV 或 TSV 檔案本身的網址,要用雙引號包起來。

GitHub 上有個公開資料集 datasets/country-list,放的是國家名稱與兩碼代碼的 CSV:

Google 試算表公式
fx

讀入國家名稱與代碼的 CSV 網址

=IMPORTDATA( "https://raw.githubusercontent.com/datasets/country-list/master/data.csv" )

放在 A1,會得到兩欄:

列AB
1NameCode
2AfghanistanAF
3AlbaniaAL
4AlgeriaDZ

整份檔案是 1 列標題加 249 個國家與地區,要確認有沒有讀完整,可以在別的儲存格算筆數:

Google 試算表公式
fx

算 A 欄有幾列有資料

=COUNTA(A:A)

結果是 250,也就是標題加上 249 筆。國名裡有逗號的,像第 28 列的「Bonaire, Sint Eustatius and Saba」,原始檔會用雙引號包起來,讀進來仍然是同一格,不會被切成兩欄。

要注意的地方:

  • 政府開放資料平台很多都提供 CSV 下載連結,直接貼到 IMPORTDATA 就能用。不過有些舊系統產出的 CSV 是 Big5 編碼,讀進來可能會出現亂碼,這種就先下載、轉成 UTF-8 再放到網路上,或改用「檔案」>「匯入」。編碼的細節在 匯入與下載格式 那篇。
  • 網址必須直接指向檔案。雲端硬碟的分享連結是網頁,不是檔案,讀不到。Google 試算表自己要讀的話,用 IMPORTRANGE 比較對。
  • xlsx 檔案不行,這個函式只讀文字格式。

IMPORTFEED

讀 RSS 或 ATOM 訂閱,適合把部落格、新聞網站的最新文章列進試算表。

語法:

  • 網址:訂閱的網址。
  • 查詢(選填):要取什麼。常用的有 "feed title"(訂閱的名稱)、"items"(所有項目與其欄位)、"items title"(只要標題)、"items url"(只要連結)。
  • 標題列(選填):TRUE 會多一列欄位名稱,FALSE 不加。我習慣兩個都明寫,不靠預設值。
  • 項目數(選填):最多取幾筆。

BBC News 的 RSS 是個公開的訂閱,拿最新 3 則標題:

Google 試算表公式
fx

取 BBC News 訂閱最新 3 則的標題,不含標題列

=IMPORTFEED("https://feeds.bbci.co.uk/news/rss.xml", "items title", FALSE, 3)

結果是 A1:A3 三列文字,內容是當下最新的三則標題,每次更新都會變,所以這裡不放結果。查詢改成 "feed title" 會得到訂閱的名稱,這個訂閱是「BBC News」。標題列改成 TRUE 的話會多出一列,第一列是欄位名稱 Title,所以同樣要 3 則,會得到 4 列。

要注意的地方:

  • 只讀訂閱,不是一般網頁。網站沒有提供 RSS 或 ATOM 的話,改用 IMPORTXML 或 IMPORTHTML。
  • 查詢填 "items" 會一次拿到 4 欄:Title(標題)、URL(連結)、Date Created(發佈時間)、Summary(摘要)。標題列設 TRUE 時第一列就是這四個欄位名稱。

更新頻率

依官方更新規則,IMPORTDATA、IMPORTHTML、IMPORTXML 在檔案保持開啟時,每小時會檢查更新。打開或重新整理文件本身不會觸發更新;每小時檢查也不是整點執行或資料一定變新的保證。

同一頁寫明,刪除後重新加入儲存格,或用相同公式覆寫儲存格,會觸發這三個函式重新整理。它會發出更新要求,但資料來源快取、流量限制與錯誤仍可能使結果延後,不適合當成高頻更新排程。

IMPORTFEED 沒有列在該頁的三函式更新規則裡,因此本文不替 RSS 套用「每小時」或相同的手動觸發保證。需要固定時間抓資料時,應另做可監控的排程,不能靠重開試算表。

也有人想用 NOW() 串在網址後面,騙 Sheets 以為網址每次都不一樣。這個做法 Sheets 不允許,匯入函式不能跟會自己變動的函式組在一起,例如 會得到 #ERROR!,提示是「這個函式無法參照含 NOW()、RAND()、RANDARRAY() 或 RANDBETWEEN() 的儲存格」,不要試了。

常見錯誤

看到什麼常見原因怎麼處理
#ERROR!網址沒有加雙引號,Sheets 把它當公式解析網址用半形雙引號包起來
#REF!,提示「系統未展開陣列結果,以免覆蓋 G2 中的資料。」展開的範圍被別的儲存格擋住(G2 換成實際被擋的格子)清掉被擋的格子,或把公式搬到空白處
#N/A,提示「匯入內容沒有含有指定索引的查詢。」索引超過頁面上實際的表格或清單數(例如索引 99)改索引;看看網頁原始碼裡有沒有那張表
#N/A,提示「在指定網址找不到資源。」網址不存在(404)。IMPORTHTML、IMPORTDATA 都是這個先用瀏覽器開一次網址確認
#N/A,提示「匯入的內容空白。」查詢選不到任何東西(IMPORTXML 的 XPath 寫到沒有的節點),或內容是 JavaScript 之後才產生的檢查 XPath;看看網頁原始碼裡有沒有那段內容
#REF!,點儲存格有橫幅「允許存取」這份檔案還沒允許外部資料按「允許存取」
#ERROR!,提示「這個函式無法參照含 NOW()、RAND()、RANDARRAY() 或 RANDBETWEEN() 的儲存格」網址裡串了 NOW() 之類會變動的函式拿掉
顯示「Loading...」正在抓取等幾秒,通常會自己變成結果

IMPORTDATA 讀進來全是亂碼,是編碼的問題,不是函式寫錯,處理方式在上面 IMPORTDATA 那一節。

什麼時候不要用匯入函式

  • 需要登入才看得到的網站:沒有地方可以輸入帳號密碼,抓不到。
  • 內容靠 JavaScript 產生的網頁:這時 IMPORTHTML、IMPORTXML 都抓不到,通常要找網站有沒有公開的 API,再用 Apps Script 去呼叫。
  • 資料量很大:這幾個函式是把資料整份拉進儲存格,放得下才行,單一試算表的上限是 2,000 萬格或 100MB。真的到百萬列等級,是 Connected Sheets 的領域,這篇不談。 Excel 沒有 IMPORTHTML、IMPORTDATA、IMPORTFEED 這類同名函式,要把網頁資料拉進 Excel,用的是「資料」>「取得資料」>「從 Web」(Power Query)。

三個函式的語法都很短,先挑一個公開的網址試試看吧!

我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
#IMPORTHTML#IMPORTDATA#IMPORTFEED#網頁抓取#自動更新
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

這篇在技能樹的 Lv.3「資料整合與自動化」,模組「匯入外部資料」(第 2/2 篇)。讀完這篇,路線上的下一個模組是「處理網頁資料」。

回到技能樹

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。