跳到主要內容跳到頁尾

互動式報表設計:用下拉選單和核取方塊讓同一張報表自己換內容

13 分鐘閱讀Lv.4 進階摘要與日期

把門市銷量表做成讀的人自己操作的報表:控制格放下拉選單與核取方塊,用 TEXTJOIN 與 SWITCH 把選擇組成 QUERY 字串,再比較 FILTER、QUERY 與切片器各自適合的場合,以及怎麼只開放控制格給別人改。

發布 更新

文章目錄

信義店長要看信義,板橋店長要看板橋。我以前的做法是每間店複製一個工作表,改一次公式就要改三次,新開一間店再複製一次。

這篇把它做成一張報表:讀的人自己選門市、勾要不要含外送、挑要看品項還是通路,結果自己換。資料是三間店 9 月的銷量,放在 A1:D13,共 12 筆:

門市品項通路杯數
信義蘋果紅茶店內87
信義蘋果紅茶外送34
信義青茶店內52
信義烏龍奶茶店內64
板橋蘋果紅茶店內71
板橋青茶店內38
板橋青茶外送19
板橋烏龍奶茶外送27
中和蘋果紅茶店內45
中和青茶店內33
中和烏龍奶茶店內41
中和烏龍奶茶外送16

整張報表我分成三層,讀的人只碰第一層:

控制面板經選擇進入資料層的 QUERY 或 FILTER,重算後更新展示層的結果表與圖表← 左右滑動看完整的圖,點圖可放大

圖:控制格是輸入,資料層是公式,展示層是結果,三層放在同一頁但各佔一塊。

資料與計算分層的想法在 三層架構 講過,這篇直接拿來用。

控制面板:三個格子,三種控制

控制格放在資料右邊,F1:G3:

FG
1門市(下拉選單)
2含外送(核取方塊)
3分組(下拉選單)

報表右側的控制面板:門市選信義、含外送未勾選、分組選品項,下方是對應的結果表

圖:讀的人只會動 G1、G2、G3 這三格。

  • G1 門市:下拉選單,選項是「全部」「信義」「板橋」「中和」,手打在 L2:L5,用「來自範圍」指過去。「全部」那個選項的處理與選項自動長出來的寫法,在 FILTER 實戰 講過,設定下拉選單的操作則見 資料驗證實戰。
  • G2 含外送:核取方塊,選取 G2 後點「插入」>「核取方塊」。勾起來的值是 TRUE,沒勾是 FALSE。
  • G3 分組:下拉選單,選項直接手打「品項,通路」。

兩種控制我是這樣分的:要在幾個名稱裡挑一個,用下拉選單。只有開和關兩種狀態,用核取方塊,因為它的值本身就是 TRUE 或 FALSE,可以直接放進 IF,用下拉選單選「是」「否」還得多寫一道 G2="是"。

這三格跟 動態資料設計 的「設定」工作表長得很像,差在改的人不同。設定是做表的人調,控制格是看表的人調,所以我放在報表旁邊,不藏到別頁。

資料層:把控制格組成 QUERY

先手算一個狀態。選信義、不含外送,店內有三筆:蘋果紅茶 87、青茶 52、烏龍奶茶 64。要讓 QUERY 算出這個,就得把控制格的選擇組成一條查詢字串。

我把字串拆成三格,一格一件事,出錯時看得到哪一步歪了。G5 放條件:

Google 試算表公式
fx

門市不是全部就加一條門市條件,沒勾含外送就加一條店內條件,條件之間用 and 接起來

=TEXTJOIN( " and ", TRUE, IF(G1="全部", "", "A = '"&G1&"'"), IF(G2, "", "C = '店內'") )

TEXTJOIN 的第二個參數 TRUE 是略過空字串,所以兩個條件都不需要時,G5 就是空的。G1 選信義、G2 沒勾時,G5 的結果是:

A = '信義' and C = '店內'

G6 放要分組的欄位字母,這個等一下在「切換檢視」那節講,現在先知道分組選品項時它的結果是 B。G7 放完整的查詢字串:

Google 試算表公式
fx

把欄位字母與條件拼成 QUERY 查詢字串

="select " & G6 & ", sum(D)" & IF(G5="", "", " where "&G5) & " group by " & G6 & " order by sum(D) desc label sum(D) '杯數'"

G7 的結果是:

select B, sum(D) where A = '信義' and C = '店內' group by B order by sum(D) desc label sum(D) '杯數'

最後 F9 把字串交給 QUERY:

Google 試算表公式
fx

資料範圍含標題列,最後一個參數 1 表示第一列是標題

=QUERY(A1:D13, G7, 1)

來看看結果,F9:G12:

品項杯數
蘋果紅茶87
烏龍奶茶64
青茶52

跟手算的三筆一樣。把 G1 改成「全部」、G2 勾起來,G5 變成空字串,G7 就沒有 where,結果是三間店全部加總:

品項杯數
蘋果紅茶237
烏龍奶茶148
青茶142

三個數字加起來是 527,等於 D 欄 12 筆全部加總。

字串拼接我自己很容易少一個引號,所以我習慣先在 G7 看字串長相,確定對了再交給 QUERY。QUERY 本身的語法在 QUERY 基礎 講過。

只要列明細:FILTER 版

如果報表要的是明細,不用加總,換成 FILTER 比較直接,放在 I9:

Google 試算表公式
fx

門市符合(或選全部),且含外送有勾,或通路是店內

=FILTER(A2:D13, (G1="全部")+(A2:A13=G1), (G2=TRUE)+(C2:C13="店內"))

用 + 當 OR、逗號當 AND 的寫法,在 FILTER 實戰 有整理,這邊不重講。G1 信義、G2 沒勾的結果,溢出到 I9:L11:

列IJKL
9信義蘋果紅茶店內87
10信義青茶店內52
11信義烏龍奶茶店內64

我的分法很單純:要加總、要分組,用 QUERY;只要把符合的列列出來,用 FILTER。QUERY 的字串要自己拼,比 FILTER 多一道工,所以沒有加總需求我就不用它。

切換檢視:一個下拉選單換分組欄位

G3 選「通路」時,同一張報表要改成按店內、外送加總。做法是只換 QUERY 字串裡的欄位字母,其他都不動。G6 這樣寫:

Google 試算表公式
fx

分組選品項對應 B 欄,選通路對應 C 欄

=SWITCH(G3, "品項", "B", "通路", "C")

分組下拉選單選品項對應欄 B、選通路對應欄 C,兩者都進同一條 QUERY 字串,輸出結果表← 左右滑動看完整的圖,點圖可放大

圖:下拉選單只決定欄位字母,後面的 QUERY 是同一條。

G1 選板橋、G2 勾起來、G3 選通路,結果是:

通路杯數
店內109
外送46

板橋店內 71 + 38 = 109,外送 19 + 27 = 46。想多一種檢視,在 SWITCH 多加一組「名稱, 欄位」就好。

同一個下拉,更新明細與彙總兩份查詢

方格子 QUERY 與儲存格連動提過,一個選單可以控制多個查詢。這個練習請另開一張空白的新分頁,用少量資料做。

把下方資料貼到 A1,H1 填「控制門市」、H2 先填 O'茶。P1:P4 依序填「選單來源」「全部」「O'茶」「信義」,把 H2 設為來自 P2:P4 的下拉選單:

同一控制格要帶動的來源資料
門市	品項	杯數
O'茶	紅茶	10
信義	紅茶	20
O'茶	青茶	5
信義	青茶	30
	紅茶	99

J1 放明細,留空 J:L 讓結果展開:

Google 試算表公式
fx

來源右邊加一欄 TRUE/FALSE,查詢只讀取是否命中

=IF( H2="", "請選門市", QUERY( {A2:C6, ARRAYFORMULA(IF(H2="全部", A2:A6<>"", A2:A6=H2))}, "select Col1,Col2,Col3 where Col4 = true", 0 ) )

J12 放彙總,仍讀同一個 H2:

Google 試算表公式
fx

同一控制值,另一份查詢按品項加總與排序

=IF( H2="", "請選門市", QUERY( {A2:C6, ARRAYFORMULA(IF(H2="全部", A2:A6<>"", A2:A6=H2))}, "select Col2,sum(Col3)" & " where Col4 = true" & " group by Col2" & " order by sum(Col3) desc" & " label Col2 '品項',sum(Col3) '杯數'", 0 ) )

這裡沒有把 H2 內容拼進查詢文字,而是在陣列多加一個布林欄;Col4 = true 比較布林值,不是字串 'TRUE'。因此 O'茶 的單引號只是資料,不會提早關閉查詢文字。

選單明細彙總(由多到少)
O'茶紅茶 10、青茶 5紅茶 10、青茶 5
信義紅茶 20、青茶 30青茶 30、紅茶 20
全部四筆有門市的資料青茶 35、紅茶 30
留空請選門市請選門市

「全部」在這裡明訂為有填門市的資料,所以沒有門市的 99 不納入;這是報表的業務規則,不是 QUERY 自動判斷那一列有錯。缺門市的資料要另外追蹤補齊。

建立下拉後換三個選項,明細與彙總都會跟著更新,結果如上表;清空 H2 後兩處都顯示「請選門市」。選「全部」時,四筆明細不會混入缺門市的 99。

來源固定到第 6 列,是為了讓練習範圍看得清楚;正式表擴充時,三欄資料與布林欄必須維持相同列數。查無門市的情況也不一定丟錯,若要提示「無符合資料」,另外先算命中數;更多單選/多選與特殊字元的邊界在 QUERY 動態多選。

這個兩份查詢的練習放在獨立分頁就好。下一節的圖表與 Slicer 回到前面 12 筆、527 杯的原始報表。

圖表跟著結果走

圖表的資料範圍框 F9:G12,也就是 QUERY 的輸出。控制格一改,結果換了,圖表跟著換,不需要再動圖表。

柱狀圖顯示信義店內三個品項的杯數,蘋果紅茶 87、烏龍奶茶 64、青茶 52

圖:圖表讀的是 QUERY 的輸出,不是原始資料。

動畫:G1 由信義換成板橋,結果表與柱狀圖同時更新

圖:改一格,表和圖一起換。

分組換成通路時,結果只有 2 筆;換回品項則有 3 筆。框選圖表來源時,要能容納兩種結果,別為了縮掉空白格就固定改成 F9:G11,否則第三個品項會漏掉。空白範圍的呈現還要看圖表設定,切換分組後直接檢查標籤與數值,見 圖表完全指南 的互動式圖表一節。

用 Slicer 帶動透視表與圖表

切片器(Slicer)在繁體中文介面叫「篩選器控制項」。如果門市、通路已經是固定的篩選欄位,我會先試這個做法,讓同一份資料的透視表與圖表一起換,不必先拼 QUERY 字串。

下面沿用 A1:D13 的 12 筆銷量。這次我要做「各門市杯數」透視表,再讓門市和通路各有一個控制項。

先放好透視表與圖表

  1. 選取 A1:D13,建立資料透視表,放在同一張工作表的 A22。列放「門市」,值放「杯數」,匯總依據選 SUM。
  2. 如果要畫各門市占比,關閉透視表列的總計,再用透視表的門市與杯數欄建立圓餅圖。不要把總和也當成一間門市畫進去。
  3. 選取來源 A1:D13,點「資料」>「新增篩選器控制項」。在右側把資料範圍設為 A1:D13,資料欄選「門市」,確認「套用到資料透視表」已勾選。

選取來源範圍,從資料選單新增篩選器控制項,再指定要篩選的資料欄← 左右滑動看完整的圖,點圖可放大

圖:控制項的來源是原始銷量,不是透視表輸出的兩欄。

我把透視表放在第 22 列,是因為控制項篩掉來源資料時,對應的整列會隱藏。如果透視表放在來源右邊、剛好跟它同列,報表本身也可能跟著看不見。來源下方的報表記得留在 A1:D13 範圍外。

門市與通路一起篩

  1. 點門市控制項的篩選圖示,用「依值篩選」只保留「信義」,套用後看透視表與圖表。
  2. 再新增一個控制項,資料欄選「通路」,來源仍然是同一個 A1:D13,並勾選「套用到資料透視表」。
  3. 通路只保留「店內」。這時保留的是「門市為信義,而且通路為店內」的資料。
  4. 在門市控制項重新全選並套用,通路先保留店內,看看剩下的條件有沒有繼續生效。

用上面這份資料,兩個控制項的組合結果是:

門市控制項通路控制項透視表杯數合計
全部全部527
信義全部237
信義店內203
全部店內431

兩個控制項會一起限制資料,清掉其中一個不會清掉另一個。圖表接的是這張透視表,所以同樣跟著變;兩個條件只剩信義店內時,圓餅圖也只剩信義這一片。

畫面篩了,公式會跟著算嗎?

這邊最容易看錯。我同時在來源範圍外放了兩條公式:

Google 試算表公式
fx

直接加總來源杯數,不讀取篩選器控制項的選擇

=SUM(D2:D13)
Google 試算表公式
fx

QUERY 只讀取自己的查詢條件

=SUM(QUERY(A1:D13, "select D", 1))

控制項切成信義、店內後,透視表是 203,這兩條仍然是 527。要讓公式只算信義店內,就得把條件寫進公式,例如:

Google 試算表公式
fx

把門市與通路條件直接交給 SUMIFS

=SUMIFS(D2:D13, A2:A13, "信義", C2:C13, "店內")

結果是 203。它符合的原因是公式自己寫了這兩個條件;接著清掉控制項,也不會把這條公式改成算全部。

所以我會看報表要怎麼互動:

  • 透視表已經做好,只想讓人切門市、切通路,連同圖表一起看:用 Slicer。
  • 需要讓公式讀取使用者的選擇、加核取方塊,或切換分組欄位:用上面的控制格加 QUERY/FILTER。

自己的選擇與大家的預設畫面

依 Google 官方說明,一般篩選選擇是私人的,也不會自動儲存成共用預設。不要以為自己選了信義,其他人打開就一定先看到信義。

想固定初始畫面,先設好條件,再開控制項右側的「更多」選單,選「將目前的篩選器設為預設值」。兩個控制項要各自設定;想預設看全部,就先各自全選、套用,再儲存預設。官方說明也區分了權限:新增或移除控制項需要編輯權限,可存取試算表的人則可以調整篩選。

我把門市「信義」與通路「店內」各自設為預設後,先把門市改成全選,透視表變成 431;重新載入頁面,兩個控制項都恢復只選一項,透視表也回到 203。其他人打開時看到的是你存的預設值;沒有存成預設值的選擇不會公開,也不會儲存。

只有一部分跟著變時

先核對來源,不要急著重做圖表:

  • 兩個控制項與透視表是不是同一個來源範圍?本例都用 A1:D13。若一個只框到第 12 列,就沒有套在相同的資料範圍上。
  • 控制項是否勾選「套用到資料透視表」?圖表是否真的指向這張透視表?若接的是另一份 QUERY 結果,它會繼續依自己的公式計算。
  • 新資料是否加在第 14 列、已經超出 A1:D13?更新來源範圍時,透視表與每個控制項都要一起核對。報表放在第 22 列的這個練習版不要直接改成整欄,否則會把下方的報表也框進來源。

來源會持續新增的正式報表,我會先把原始資料與展示區分開。

讓看的人只動控制格

  • 控制格的預設值放「全部」並勾起含外送,打開報表時就有完整內容,不會是一張空的。
  • G1 的下拉選單設成「拒絕輸入」,打錯字就進不來,不會讓 QUERY 的 where 找不到門市。
  • 把控制格以外的範圍用保護鎖起來,只留 G1:G3 可以編輯,作法見 保護試算表。
  • 篩選結果是空的時候,FILTER 要用 IFNA 接住,寫法在 FILTER 實戰 的「沒有符合的時候」。

什麼時候不要做成互動

主管每週只看信義一間店,就不要做。一個控制格看起來只是多一個選單,但它讓組合數乘上去:這張報表門市有 4 種選項、含外送 2 種、分組 2 種,一共 4 × 2 × 2 = 16 種狀態,每一種都得能正常算出東西。每多一個只有兩種選項的控制格,要驗的組合就變成兩倍。

資料會一直新增的話,原始資料另放一張工作表、報表放另一張,會比現在這樣擺在同一頁好維護,見 三層架構。

練習

1

加第四個控制格:品項

在 G4 加一個「品項」下拉選單,選項是「全部」「蘋果紅茶」「蘋果綠茶」「烏龍奶茶」「青茶」。請改寫 G5,讓品項也能當條件。G1 選板橋、G2 勾起、G4 選青茶時,G5 應該是 A = '板橋' and B = '青茶'。

2

分組多一種:門市

G3 的選項加上「門市」,對應 A 欄。請改寫 G6,讓 G3 選「門市」、G1 選「全部」、G2 勾起時,F9 輸出信義 237、板橋 155、中和 135。

控制格設好之後,讀的人什麼公式都不用看,只要選就好。想把互動做在圖表上,下一步看 圖表完全指南。我是喜特先生,Mr. Sheet,我們下個教學見!

這個步驟如果每週都要重做

現在
每月把各門市的報表另存一份,用信件分別寄給各店長
自動化後
每月初自動為各門市產出報表,寄給對應的店長
有類似需求,可以來信聊聊
分享:
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

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

接下來可以

這篇在技能樹的 Lv.4「進階應用」,模組「設計互動式報表」(第 1/1 篇)。讀完這篇,路線上的下一個模組是「讓試算表不要慢到讓人抓狂」。

回到技能樹

相關文章

查看所有文章

留言討論

共 0 則留言

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

免費,隨時可取消。

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