手搖飲有三家分店,每家店各自記一份銷售檔,總部想看的是「全部加起來,哪個品項賣最多、哪家店賣最多」。如果是請各店月底傳檔案過來,再複製貼上疊成一張,貼錯一次整個月都要重來。這篇用 IMPORTRANGE 把這件事改成讓總部檔自己去收。
IMPORTRANGE 的語法、第一次授權和「誰需要有權限」,在 IMPORTRANGE 入門 講過了,這邊直接進任務。QUERY 的基本寫法也不重講,不熟的話可以先看 QUERY 基礎。
先讓三家店的檔案長一樣
這件事跟公式無關,卻是最重要的一步。三份分店檔我要求它們:
- 工作表都叫「銷售」。
- 欄位順序固定是 A 欄門市、B 欄日期、C 欄品項、D 欄杯數、E 欄備註。
- 第 1 列是標題,資料從第 2 列開始。
門市欄請每家店自己填店名,這樣疊在一起之後還分得出誰是誰。備註欄是店員自己的小抄,總部不需要,等一下也不會匯進來。
台北店的檔案是這樣:
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | 門市 | 日期 | 品項 | 杯數 | 備註 |
| 2 | 台北店 | 2026/10/01 | 蘋果紅茶 | 37 | |
| 3 | 台北店 | 2026/10/01 | 青茶 | 64 | |
| 4 | 台北店 | 2026/10/02 | 蘋果紅茶 | 21 |
台中店有 3 筆:烏龍奶茶 112、蘋果綠茶 8、蘋果紅茶 29,其中烏龍奶茶那列的備註寫了「急單」。高雄店也是 3 筆:桂花烏龍 21、蘋果紅茶 15、青茶 18。日期都落在 10/01 到 10/02。
設定表放各店網址
在總部檔新增一個工作表叫「設定」,把三家店的網址放進去:
| A | B | |
|---|---|---|
| 1 | 門市 | 試算表網址 |
| 2 | 台北店 | (台北店檔案的網址) |
| 3 | 台中店 | (台中店檔案的網址) |
| 4 | 高雄店 | (高雄店檔案的網址) |
B 欄請貼各店檔案真正的完整網址。之後公式不直接寫網址,改成指向 設定!B2、設定!B3、設定!B4。這樣某家店換了新檔案,我只改設定表的一格,不用在長長的公式裡找網址。
先匯一家店,只拿需要的欄位
我先在總部檔新增一個工作表叫「匯入」,A1 先寫台北店。只想要門市、品項、杯數,日期跟備註都不需要,就把 IMPORTRANGE 放進 QUERY,用 select 挑欄:
匯入台北店的銷售表,只留第 1、3、4 欄(門市、品項、杯數)
=QUERY(
IMPORTRANGE(設定!B2, "銷售!A1:E"),
"select Col1, Col3, Col4 where Col1 is not null",
1
)設定!B2:台北店的網址,從設定表來。"銷售!A1:E":台北店檔案「銷售」工作表的 A 到 E 欄,從標題列開始拿。select Col1, Col3, Col4:只留門市、品項、杯數三欄。這邊Col1是匯入範圍的第一欄,不是工作表的 A 欄。where Col1 is not null:門市欄是空的列不要。"銷售!A1:E"這種不寫結尾列的範圍,回來的是整張工作表的列數(來源工作表有 1000 列就是 1000 列,含空白列),不濾掉的話,下面的空白列會全部跟進來。- 最後的
1:第 1 列是標題。
第一次輸入會是 #REF!,點一下儲存格,卡片上寫「你必須連結這些試算表。目標試算表初次從新的來源試算表擷取資料時,你必須授予權限。」按右邊的「允許存取」就好(左邊的「瞭解詳情」是說明連結)。來看看結果:
| A | B | C | |
|---|---|---|---|
| 1 | 門市 | 品項 | 杯數 |
| 2 | 台北店 | 蘋果紅茶 | 37 |
| 3 | 台北店 | 青茶 | 64 |
| 4 | 台北店 | 蘋果紅茶 | 21 |
日期跟備註沒有進來。我個人把「只匯需要的欄位」當預設,但要老實說,這比較像是整理畫面,不算鎖。Google 的說明寫明,授權之後目標檔的任何編輯者都能用 IMPORTRANGE 從來源檔的任何位置拉資料,總部檔的編輯者自己再寫一條就拿得到其他欄。授權會一直有效,直到授權的人被移出來源檔,所以真正敏感的資料,不要放在會被匯入的檔案裡。權限的想法在 協作與權限 有講。
三家店疊在一起
要把三家疊成一張,用大括號 {} 加分號 ; 上下接起來。第一段保留標題列,後兩段從第 2 列開始、QUERY 最後的標題列數改成 0,免得標題出現三次。每一段都要有 where Col1 is not null,因為少了它,空白列會夾在三家店中間,疊合結果會多出近兩千列,下方有東西還會被擋成 #REF!:
三家分店的銷售表上下疊在匯入工作表的 A1,網址都從設定表讀
={
QUERY(
IMPORTRANGE(設定!B2, "銷售!A1:E"),
"select Col1, Col3, Col4 where Col1 is not null",
1
);
QUERY(
IMPORTRANGE(設定!B3, "銷售!A2:E"),
"select Col1, Col3, Col4 where Col1 is not null",
0
);
QUERY(
IMPORTRANGE(設定!B4, "銷售!A2:E"),
"select Col1, Col3, Col4 where Col1 is not null",
0
)
}三段各去一份來源檔,所以台中店和高雄店也各要按一次「允許存取」。疊合時如果有一段出 #REF!(例如某家店把工作表改名,訊息是「在匯入範圍中找不到範圍或工作表。」),整個結果會變成 #VALUE!,訊息是「ARRAY_LITERAL 中的陣列常值有一或多列缺少值。」,不是 #REF!。來看看結果:
| A | B | C | |
|---|---|---|---|
| 1 | 門市 | 品項 | 杯數 |
| 2 | 台北店 | 蘋果紅茶 | 37 |
| 3 | 台北店 | 青茶 | 64 |
| 4 | 台北店 | 蘋果紅茶 | 21 |
| 5 | 台中店 | 烏龍奶茶 | 112 |
| 6 | 台中店 | 蘋果綠茶 | 8 |
| 7 | 台中店 | 蘋果紅茶 | 29 |
| 8 | 高雄店 | 桂花烏龍 | 21 |
| 9 | 高雄店 | 蘋果紅茶 | 15 |
| 10 | 高雄店 | 青茶 | 18 |
1 列標題加 3 + 3 + 3 列資料,一共 10 列。這張「匯入」工作表我只放這一條公式,不加工、不手改,後面的報表都從這張取值。
算各店與各品項的總杯數
新增一個工作表叫「報表」,A1 先算各店的總杯數,由多到少排:
從匯入工作表算每家店的總杯數,由多到少
=QUERY(
匯入!A1:C,
"select Col1, sum(Col3)" &
" where Col1 is not null" &
" group by Col1" &
" order by sum(Col3) desc" &
" label sum(Col3) '總杯數'",
1
)來看看結果:
| A | B | |
|---|---|---|
| 1 | 門市 | 總杯數 |
| 2 | 台中店 | 149 |
| 3 | 台北店 | 122 |
| 4 | 高雄店 | 54 |
手算對一下:台北 37 + 64 + 21 = 122,台中 112 + 8 + 29 = 149,高雄 21 + 15 + 18 = 54。
再來是各品項的總杯數,把分組的欄位換成品項(第 2 欄):
從匯入工作表算每個品項的總杯數,由多到少
=QUERY(
匯入!A1:C,
"select Col2, sum(Col3)" &
" where Col1 is not null" &
" group by Col2" &
" order by sum(Col3) desc" &
" label sum(Col3) '總杯數'",
1
)| A | B | |
|---|---|---|
| 1 | 品項 | 總杯數 |
| 2 | 烏龍奶茶 | 112 |
| 3 | 蘋果紅茶 | 102 |
| 4 | 青茶 | 82 |
| 5 | 桂花烏龍 | 21 |
| 6 | 蘋果綠茶 | 8 |
蘋果紅茶三家店都有賣,37 + 21 + 29 + 15 = 102,是賣得最廣的品項,但單一品項賣最多的是只有台中店有的烏龍奶茶。兩張表加起來都是 325,跟三家店各自的合計 122 + 149 + 54 一樣。我會在報表上留一格 當對帳用,數字跟各店自己算的對不上,就先去看是哪家店的資料沒進來。
用下拉選單切換來源工作表
方格子下拉式選單與 IMPORTRANGE的想法,可以改成選門市:網址固定,只換範圍字串裡的工作表名稱。先確認你有權讀取來源;下拉不是繞過權限的方法。這裡先用同一檔案的不同工作表練習,之後跨檔仍要另外處理連線。
在同一檔案準備兩張合成來源表,各自 A1:B3 都是「品項/杯數」兩欄:門市 A 為紅茶 10、青茶 20,O'茶 為紅茶 30、青茶 40。另開一張空白控制表,B2 放這份檔案自己的網址,F2:F3 放兩個完整工作表名稱,A2 設為來自 F2:F3 的下拉。
A5 放公式,留空 A5:B7:
同檔來源練習:選單組成工作表範圍字串,名稱內單引號加倍處理
=IF(A2="","請選工作表",IMPORTRANGE(B2,"'"&SUBSTITUTE(A2,"'","''")&"'!A1:B3"))選 門市 A 會得到 10/20,選 O'茶 會得到 30/40。清空選單顯示「請選工作表」,選到不存在的工作表名會得到 #REF!。把來源工作表改名為 門市 B 後,舊名稱就失效,要同步更新清單與選項,才會恢復 10/20。
這個練習用同一份檔案當來源,所以不需要授權;來源換成別的檔案時,第一次仍要按「允許存取」。讀到舊值時先確認目前選項、工作表實際名稱與穩定後結果,不把暫態畫面當最終答案。
工作表名有空格時,要依範圍字串的規則包住名稱;名稱含單引號則需正確處理,不能把 QUERY 的引號規則直接套來。範圍字串也可以寫命名範圍或表格參照,例如 IMPORTRANGE(網址, "Sales_total")、IMPORTRANGE(網址, "DeptSales[Sales Amount]")(官方範例)。A2 留空時,這個版本明確顯示「請選工作表」,不把「空白選單」解釋成一定匯入第一張表。
選單來源也要維護:來源工作表改名後,清單若還留舊名,範圍字串就會指向不存在的名稱。更改檔案標題與更改內部工作表名稱是兩回事;#REF! 要看實際提示,不能一律再按授權。
切換後的更新時間仍受來源計算與外部匯入影響,不保證即時。外面的 IF 只控制顯示分支,不代表背景請求、快取或已授權連線被切斷,詳見 IMPORTRANGE 排錯。
為什麼這樣組
- 為什麼不是一個大檔、每家店一個分頁:三家店的店員都要能編輯,又不該看到彼此的檔案,拆成三個檔,權限最乾淨。這個取捨在 三層架構進階 有展開。
- 為什麼要一張「匯入」工作表:
IMPORTRANGE只在這一格出現。報表要換算法、加新欄,都是從「匯入」取值,不會再多一條去打擾來源檔。 - 為什麼網址放設定表:換檔案只改一格,也讓接手的人一眼看出這份總表連了哪些檔。
新增第四家店要改哪裡
這裡我得老實說,設定表沒辦法讓公式自己變長。如果再開一家屏東店,要做兩件事:
- 在設定表
A5、B5填進店名跟網址。 - 在「匯入」的公式最後面加第四段
QUERY(IMPORTRANGE(設定!B5, "銷售!A2:E"), "select Col1, Col3, Col4 where Col1 is not null", 0),前一段後面補上分號。
加完之後屏東店的檔案還要按一次「允許存取」。四段的欄數要一樣,不然整個結果也是同一個 #VALUE!。報表的 QUERY 不用動,因為它讀的是整個 A 到 C 欄。店數常常在變的話,這條公式就要常常改,這是這個做法的代價。公式壞掉的幾種常見情況,整理在 IMPORTRANGE 為什麼突然 #REF!。
只看台中店
「匯入」工作表的 A1:C10 是上面那張 10 列的結果。請寫出公式,只列出台中店的品項和杯數,要保留標題列。
試著在匯入表多加一個「日期」欄看看:三段 select 都要多放一個 Col2,匯入表的欄位會往右移一欄,報表公式裡的 Col2、Col3 也要跟著改。
我是喜特先生,Mr. Sheet,我們下個教學見!
這個步驟如果每週都要重做
- 現在
- 每月底打開匯入表,核對三家店的資料都進來,再把報表貼給主管
- 自動化後
- 每月底自動核對各店資料,彙總報表以 PDF 寄給主管
接下來可以
相關文章
查看所有文章留言討論
共 0 則留言
