每天手動把網頁上的表格複製貼進試算表,只要一個禮拜忘記,數字就舊了。今天整理三個可以把網址的內容直接拉進試算表的函式: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 開始,表格與清單各自計數。
圖:索引是「這一種」東西的第幾個,圖裡是拿第 2 個表格。
我想把莫氏硬度表放進試算表。維基百科 Mohs scale of mineral hardness 這頁,2026 年 10 月時第 1 個表格就是它,所以:
抓維基百科莫氏硬度頁面的第 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 欄是空白,這裡略過):
| 列 | A | B | D |
|---|---|---|---|
| 1 | Mohs hardness | Reference mineral | Absolute hardness[14] |
| 2 | *1* | Talc | 1 |
| 3 | *2* | Gypsum | 2 |
| 4 | *3* | Calcite | 14 |
| 5 | *4* | Fluorite | 21 |
| 6 | *5* | Apatite | 48 |
有幾個地方跟網頁上看到的不一樣:
- 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:
讀入國家名稱與代碼的 CSV 網址
=IMPORTDATA(
"https://raw.githubusercontent.com/datasets/country-list/master/data.csv"
)放在 A1,會得到兩欄:
| 列 | A | B |
|---|---|---|
| 1 | Name | Code |
| 2 | Afghanistan | AF |
| 3 | Albania | AL |
| 4 | Algeria | DZ |
整份檔案是 1 列標題加 249 個國家與地區,要確認有沒有讀完整,可以在別的儲存格算筆數:
算 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 則標題:
取 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,我們下個教學見!
接下來可以
這篇在技能樹的 Lv.3「資料整合與自動化」,模組「匯入外部資料」(第 2/2 篇)。讀完這篇,路線上的下一個模組是「處理網頁資料」。
回到技能樹相關文章
查看所有文章留言討論
共 0 則留言
