剛建好的試算表,打開一下子就好,改一格也是瞬間。半年後,每輸入一個數字都要等它轉一下,你卻說不出是哪天開始變慢的。
這篇不教優化技巧,只講試算表為什麼會慢,讓你下次變慢時知道先看哪裡。改了計算設定(手動計算、重新計算頻率)會換來什麼、失去什麼,放在 Google 試算表「計算」設定頁導覽。
改一格,Sheets 會重算什麼
先想像一份茶飲店的訂單表。你把價目表裡的單價改掉,用到單價的小計跟著變,小計加起來的報表總計也跟著變。Sheets 記得「誰引用了誰」,所以只會重算被牽動的那一條線,下圖上排就是這樣。
圖:上排只動被牽動的公式,下排那格不管你改哪裡都會被算一次。
下排是揮發性函式(volatile function,意思是「結果隨時可能變」的函式)。NOW、TODAY、RAND、RANDBETWEEN 每次重算結果都可能不同,所以 Sheets 每次重算都得把它們再算一遍,用到它們的公式也跟著算。官方說明舉的例子就是這四個,用的是「例如」,沒有給完整清單。網路上常把 INDIRECT、OFFSET 也列進來,官方沒有這樣寫,這篇不下結論。
重算的時機可以調,在「檔案」>「設定」的「計算」分頁。
慢的來源,先分成三個問題
我把一次重算想成三件事:公式有幾條、每條要讀多少格,再加上有沒有要去別的檔案拿資料。
圖:五個常見原因都落在這三個問題裡,哪個變大,一次重算的工作量就跟著變大。
下面照這三個問題一個一個看。
公式有幾條
最常見的是同一個查找寫在很多欄。舉例來說,訂單在 A:B 欄,價目表在 G:H 欄:
| 品項 | 杯數 |
|---|---|
| 蘋果紅茶 | 7 |
| 青茶 | 12 |
| 烏龍 | 3 |
| 品項 | 單價 |
|---|---|
| 蘋果紅茶 | 45 |
| 青茶 | 38 |
| 烏龍 | 42 |
我想要小計和打九折後的價錢,一開始很容易兩欄各寫一次查單價。C2 是小計:
小計,查一次單價
=B2*VLOOKUP(A2,$G$2:$H$4,2,FALSE)D2 是折後價,又查了一次:
折後價,再查一次單價
=B2*VLOOKUP(A2,$G$2:$H$4,2,FALSE)*0.9每一列要查 2 次。改成先把單價查出來放一欄,後面的欄位都引用它,每列就只查 1 次:
| 欄位 | 公式 |
|---|---|
C2 單價 | |
D2 小計 | |
E2 折後價 |
來看看結果:
| 品項 | 杯數 | 單價 | 小計 | 折後價 |
|---|---|---|---|---|
| 蘋果紅茶 | 7 | 45 | 315 | 283.5 |
| 青茶 | 12 | 38 | 456 | 410.4 |
| 烏龍 | 3 | 42 | 126 | 113.4 |
3 列看不出差別,不過同一個查找貼在幾千列、又被好幾欄重複,差距就會被放大。這種「先算一次、後面都引用」的做法,放在三層架構的計算層最自然,呈現層只引用結果,見 三層架構入門。
揮發性函式也是同一個道理。如果每一列都寫一個 來算天數,不如在一格放 ,其他公式都引用那一格。這樣揮發性函式只出現一次,哪些公式被它牽動也一目了然。被牽動的公式還是會跟著重算,所以我會盡量少讓大量公式依賴它。
每條讀多少格
整欄範圍(例如 A:A)常被當成元凶,我沒有量過整欄和固定範圍的差距,所以不拿它下結論。我的理解是公式讀的是工作表實際有的那些列,新工作表預設 1,000 列,資料拉長才跟著變多。
比較值得留意的是兩件事。一是工作表被拉得很長,有一大段用不到的空白列,整欄公式和條件式格式的範圍也跟著長。二是整欄寫進很多條公式,每一條都在讀那一欄。我個人的做法:會一直新增資料的表,我還是用整欄或開放式範圍(例如 A2:A),因為固定寫成 A2:A100,之後忘了改,算錯比慢更麻煩。用不到的空白列和欄,就選起來刪掉。
條件式格式也是這一類。每條規則要對它套用範圍裡的每一格判斷,負擔大約是規則數乘上範圍大小。常見狀況是複製貼上之後,同一個條件被拆成十幾條規則,各自套在一小段上。到「格式」>「條件式格式」看右側的規則列表就知道了,合併成一條、範圍只框資料真正有的地方。設定方式在 條件式格式。
要不要跨檔
每一條 IMPORTRANGE 都要去讀另一份試算表,條數越多,這份檔案要等的外部資料就越多。我的做法跟 IMPORTRANGE 那篇一樣:一份來源檔只匯一次,放進專門的匯入分頁,其他公式再從那一頁取值,見 IMPORTRANGE 跨試算表同步。這一頁就是原數據層,計算層與呈現層都只讀它。
變慢時的排查順序
我自己遇到變慢,不會先動公式。先確定是哪個動作慢,再從查得快、改了也不心疼的開始查。一次只改一件事,改完用同一個動作再試一次,才知道哪個有用。
圖:由上往下查,前面的用搜尋就找得到,最後的範圍會動到整張表的結構。
第 1 步的答案可以縮小範圍。只有開檔慢,我會先懷疑跨檔匯入;改一格就慢,先看揮發性函式、重複計算與條件式格式;只有某一張分頁慢,就先查那一張。第 2、3 步用「編輯」>「尋找並取代」搜尋公式內容就能數出來。
範圍放最後,是因為刪列刪欄會動到整張表,改錯了公式會算錯。這是我個人的順序,不是官方流程。
不是公式的問題時
如果公式在一大張表上做複雜運算,才從結果挑出要的幾筆,不如先用 FILTER 或 QUERY 挑出要的幾筆,再對它們計算。要算的格子少了,工作量就少,這是算術,不用實測。
沒有一個通用的「超過幾列就該換工具」門檻,同樣的列數,公式輕不輕差很多。試算表單檔的上限是 2,000 萬個儲存格(2026 年 9 月從 1,000 萬加倍),那是硬限制,在碰到之前慢不慢到影響工作,要看你自己的檔案。整理過還是慢,才考慮把原數據放進資料庫,讓試算表只負責呈現,見 試算表的本質。
下次它又變慢,就從排查順序的第 1 步開始吧。我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
這篇在技能樹的 Lv.0「核心思維」,模組「計算效能的基礎認知」(第 1/1 篇)。讀完這篇,路線上的下一個模組是「建立與組織試算表」。
回到技能樹相關文章
查看所有文章Google 試算表「計算」設定頁導覽:重新計算、反覆運算與 2,000 萬格上限
2026 年 9 月試算表在「檔案」>「設定」>「計算」多了手動計算,儲存格上限也從 1,000 萬加倍到 2,000 萬。這篇逐項看這一頁的選項,用獎金與淨利互相引用的例子說明反覆運算與循環參照,並換算新上限大約是幾列資料。
三層架構入門:把原數據、計算、呈現分到三個分頁
用一份茶飲店月報當例子,示範怎麼把試算表拆成原數據層、計算層、呈現層三個分頁,改一格月份整份報表跟著換,數字不對時也知道從哪一層開始查。
IMPORTRANGE 跨試算表同步:授權、匯入與合併
用 IMPORTRANGE 把另一份試算表的資料匯進來:從網址取得 ID、第一次按「允許存取」、範圍的寫法、把好幾份檔案疊成一張,以及授權跟權限的關係。
留言討論
共 0 則留言
