Googleスプレッドシート FILTER関数 / QUERY関数 超応用例 -番外編(数式だけでインタラクティブなグラフを作る)
前回の noteでチラッとふれた

👆 こんな感じのインタラクティブな グラフを Googleスプレッドシート上で実現する方法を紹介します。
GASなし、数式だけでこちらは実現可能です。(プルダウンやチェックボックスなどの機能は使います)
今回は FILTER関数 と QUERY関数の夢の競演で、それぞれ数式を組み立てるお題にチャレンジしてみましょう。それ以外の様々な関数も活用する超応用例です!
Gemini Canvasでグラフアプリ化しちゃうのもいいんですが、Googleスプレッドシートだけでインタラクティブなグラフが実装できるってことも実感いただければと思います。
前回のnoteは、このインタラクティブグラフを Gemini Canvasで グラフアプリとして生成する方法、そしてそれを公開する方法を紹介しました。
まずは Googleスプレッドシートでグラフを生成にしてみる
グラフの元になるデータは

👆このような2021年1Qから2025年4Qまで(実績が入っているのは2025年2Qまで)の、8つの営業部と営業部合計の 5年間の四半期ごとの実績推移です。
サンプルデータは 👇をコピーして A1セルに貼り付けて利用ください。
部門CODE 部門 2021年1Q 2021年2Q 2021年3Q 2021年4Q 2022年1Q 2022年2Q 2022年3Q 2022年4Q 2023年1Q 2023年2Q 2023年3Q 2023年4Q 2024年1Q 2024年2Q 2024年3Q 2024年4Q 2025年1Q 2025年2Q 2025年3Q 2025年4Q
101 A営業部 148,500 112,500 154,000 159,500 99,500 117,000 135,000 141,750 124,200 144,200 153,200 145,200 156,200 145,200 131,400 149,600 162,800 179,900
102 B営業部 72,000 71,500 81,000 82,500 76,500 77,000 84,500 72,000 75,000 68,200 78,000 81,000 82,000 74,000 85,000 73,800 77,400 78,100
103 C営業部 115,200 115,500 148,500 108,000 154,000 112,500 159,500 117,000 146,300 106,600 157,300 115,200 124,200 134,200 162,800 119,900 157,300 115,200
104 D営業部 82,500 54,000 62,000 63,000 72,000 71,500 99,000 67,500 70,200 69,300 79,200 80,300 91,300 61,200 102,300 70,200 72,900 72,600
105 E営業部 103,000 97,200 111,800 125,300 117,300 115,200 122,800 119,900 132,400 132,000 131,400 143,000 154,000 162,500 165,000 161,500 160,100 157,000
106 F営業部 63,000 60,500 72,000 71,500 67,500 66,000 60,000 63,000 73,200 75,000 73,800 74,800 80,800 75,800 76,800 84,800 78,400 67,100
107 G営業部 71,500 45,000 82,500 54,000 63,000 60,500 63,000 58,500 61,200 58,300 70,200 71,500 79,950 52,200 91,300 61,200 63,900 61,600
108 H営業部 54,000 49,500 63,000 60,500 58,500 55,000 82,500 54,000 55,800 52,800 64,800 63,800 79,800 66,800 85,800 55,800 59,400 56,100
営業部合計 709,700 605,700 774,800 724,300 708,300 674,700 806,300 693,650 738,300 706,400 807,900 774,800 848,250 771,900 900,400 776,800 832,200 787,600 まずは、これをそのまま折れ線グラフにしてみましょう。
Gemini in Google スプレッドシート が編集可能なグラフを生成できるようになった
前回の流れで、最初にAIに頼る方法を試してみましょう。
GoogleWorkspace ではない無料のGmailユーザーでも Workspace Labs に登録することで、スプレッドシートのサイドバーでGeminiが利用できます。
無料のGmailユーザーが スプレッドシートで Geminiを利用する方法は以下のnoteを参照ください 👇
👆この noteでも触れてますが、これまでは Gemini in Google スプレッドシートでは、データからグラフを生成しても 画像になっていて、ユーザー側で編集ができない仕様でした。
しかし2025年6月のアップデートで、 Gemini in Google スプレッドシートから ユーザー側で編集ができる(Googleスプレッドシートのグラフ機能を使って生成した)グラフが挿入できるようになりました。
これを試してみましょう!
とりあえず A列の部門CODEはグラフには使わないので、B1:V10を選択して
「折れ線グラフにしてください」と依頼してみます。

少し思考してからサイドバー上にグラフを生成してくれまいた。

ん、範囲が 勝手に 営業部合計(10行目)を除いて A列を加えた A1:V9に変わってる・・・
一応イメージ通りのグラフが生成されたけど、Qが日付に変換されてますね。
挿入ボタンでグラフをスプレッドシートに挿入すると・・・

なんと、新しいシートが追加され、元データのクロス表から 縦横(期間と営業部)を入れ替えた テーブルが生成されました。
こちらの新たに挿入されたテーブルからグラフを生成したようです。
で、本来グラフを入れたかったシートではなく、この新たに挿入されたシートにグラフが生成されてます。

Googleスプレッドシートのグラフ機能を利用したグラフなので、元データのシートにコピーしてからグラフの編集も出来ますが・・・
追加されたシートのテーブルのデータを使ったグラフなので、元の表を更新しても連動しません。
さらに 追加されたシートを削除しちゃうと

グラフも消えちゃいます・・・。
ちょっと思ってたものと違いましたね。
2025年6月 時点では、Gemini in Google スプレッドシートから今回のような表から直接 求めている折れ線グラフを作るのは難しいようです。
Googleスプレッドシートで手動で 折れ線グラフを生成する
諦めて手動でグラフを生成しましょう。
グラフの対象範囲であるB1:V10セルを選択した状態で、メニューから
挿入 > グラフ を選択します。

そうすると 👇こんな感じの縦棒グラフになっちゃうんで

グラフの種類を 折れ線グラフにして

営業部が横軸になってしまったので、下の方にある 行と列を入れ替えるにチェックを入れます

さらに グラフエディタを 「カスタマイズ」タブに切り替えて、
系列 > データラベルにチェックを入れておきましょう。

これでグラフに数字が表示されました。
さらに 凡例で 位置を「上」に固定して、グラフエリアをドラッグで横に広げておきましょう。

とりあえず見づらいですが、ベースの折れ線グラフは完成です。

でも、前回も書きましたらこれだと 見づれぇぇ~! ですよね。
これを見やすい インタラクティブなグラフにしていきましょう!
Googleスプレッドシートで インタラクティブなグラフを生成する準備をする

まず、どんなグラフにしたいかをイメージします。
今回は 👆 こんな感じでGUI操作で表示を切り替え出来るグラフをゴールとしてみましょう。
営業部合計を含め 選択した 営業部 だけグラフが見れるようにしたい
各年のクォーター(Q)単位で比較できるように表示を切り替えたい
指定した年だけのデータが見れるように表示を切り替えたい
この3つを基本要件とします。
まずはインタラクティブなグラフを作る準備から。
インタラクティブなグラフ用の表を準備する
Googleスプレッドシートは、グラフそのものを数式で制御することは出来ません。
だから

①数式を使って指定した条件で元データを絞り込んだ表を生成
▼
②数式で生成した表を対象範囲としてグラフで可視化
このような手順になります。
つまり条件で元のデータを絞り込んだ表を数式で生成した上で、その数式で生成した表(の範囲)をグラフ化することで、条件選択に連動する インタラクティブなグラフを作るってことです。
この表のエリアは、最大ケースを考慮して元データと同じ行数、列数を確保する必要があります。
別シート、または同じシートであれば 表の下に、数式で表を展開するセル範囲を確保しましょう。
元の表に合わせて、今回の場合は 部門コードをのぞいてB列から表示させるのがおススメです。

今回はわかりやすいように、別シートではなく同じシートの元の表の下に、見出しを含めて 10行21列の範囲を確保しておきます。
操作エリアを準備する

数式で表を生成するエリアを確保したら、その下に先ほど作った見づらいグラフをいい感じのサイズにして配置し、その横の2列を グラフ操作エリアとします。

操作エリアはこんなイメージ。
部門はチェックボックス、四半期と年は ラジオボタンが欲しいところですが、Googleスプレッドシートには機能として無いので、プルダウンを代わりに使います。
部門は 元の表のB列部分を配列として参照すれば良いですね。
={B2:B10}

チェックボックスは 範囲を選択してから メニューの
挿入 > チェックボックス でセットします。

四半期のプルダウンと 年は、挿入 >プルダウンで プルダウン(範囲内)を使います。
プルダウン用の範囲はグラフの下に隠れるように J26:I30 に 年 と Qを用意しました。「全て」という項目を一番上に用意しています。
※この部分はお題としています。とりあえず仮で手入力(もしくは以下をコピペして入れておきましょう)
全て 全て
2021年 1Q
2022年 2Q
2023年 3Q
2024年 4Q
2025年 👆 I26に貼り付け。

四半期 の方は、J26:J31 を
年の方は I26:I31を プルダウンの選択肢範囲とします。

あとは、セルの塗りつぶしや交互の背景色で見栄えを整えればOK。

このように✅に連動して条件付き書式でセルの塗りつぶしもよいでしょう。

Q1. プルダウンの選択肢 年・Qを 数式で生成したい
それでは、プルダウンの選択肢範囲を生成する式を作るお題にチャレンジしてみましょう。
元の表の見出し範囲

2021年1Q 2021年2Q 2021年3Q 2021年4Q 2022年1Q 2022年2Q 2022年3Q 2022年4Q 2023年1Q 2023年2Q 2023年3Q 2023年4Q 2024年1Q 2024年2Q 2024年3Q 2024年4Q 2025年1Q 2025年2Q 2025年3Q 2025年4QC1:V1 から、

このように一番上に「全て」を付けて、年 と Qの一意なデータを縦に展開した2列の配列を出力するには、どのような式を組めばよいでしょうか?
考えみてましょう!
↓↓
回答はここから。
↓↓
A1. プルダウンの選択肢 年・Qを 数式で生成する
回答です。

=ARRAYFORMULA(BYCOL(
SPLIT(REPLACE(TOCOL(C1:V1,1),6,0,"_"),"_"),
LAMBDA(c,{"全て";UNIQUE(c)})))
他の方法もあるので一例です。
まず データを 〇年の部分と 〇Q の部分に分けたい(分割したい)ので、SPLIT関数を使いたいんですが、「年」を区切り文字として分割すると、後でまた「年」を付ける必要が出てくるので、ここは年の後ろに区切り文字 "_"を入れてSPLITで分割するとします。
区切り文字を年の後ろに入れる方法は、SUBSTITUTE関数を使って 年を 年_に置換してもよいんですが、今回は文字の長さが全て同じなので、〇文字目に文字を挿入できる REPLACE関数を使ってみましょう。
まず TOCOL関数で縦にするついでに、空白セルがあった場合は詰める操作をした上で

=ARRAYFORMULA(REPLACE(TOCOL(C1:V1,1),6,0,"_"))
REPLACE関数で 6文字目から 長さ0文字を "_" に置き換えます。
REPLACEは第3引数(文字の長さ)を 0指定することで、第2引数(文字の位置)、今回は 6なので 6文字目の20xx年の後ろの数字 の前 に 第4引数の文字を挿入することができます。
これで 20xx年xQ → 20xx年_xQ と区切り文字を入れることができました。
この部分が配列処理になるので ARRAYFORMULA関数が必要となります。
あとは

挿入した区切り文字 "_" でSPLITして
=ARRAYFORMULA(SPLIT(REPLACE(TOCOL(C1:V1,1),6,0,"_"),"_"))
▼
=ARRAYFORMULA(BYCOL(SPLIT(REPLACE(TOCOL(C1:V1,1),6,0,"_"),"_"),LAMBDA(c,UNIQUE(c))))
▼
列毎の処理の中で 中カッコと ; で 上に"全て"をつければ 完成です。
=ARRAYFORMULA(BYCOL(SPLIT(REPLACE(TOCOL(C1:V1,1),6,0,"_"),"_"),LAMBDA(c,{"全て";UNIQUE(c)})))
今回の場合は固定長で2分割なんで、シンプルに左と右でそれぞれUNIQUE処理して連結、最後に縦に変換もアリですね。👇
=ARRAYFORMULA(TRANSPOSE(
IFNA(VSTACK(UNIQUE(LEFT(C1:V1,5),1),UNIQUE(RIGHT(C1:V1,2),1)))))
これで操作エリアは完成しました。
操作エリアの条件に連動して行(部門)を絞り込む
それでは操作エリアで指定した条件に連動して、元の表を絞り込む式を作っていきましょう。
今回のケースは、行(縦)と列(横)、それぞれを条件で絞り込む必要があります。
ここで活躍する関数が FILTER関数です。
もちろん 現在 進行中の QUERY関数を使う方法もあります。
せっかくなので、お題形式で 両方のパターンで式を考えていきましょう!
Q2. チェックボックスを条件にして、表示する部門を絞り込みたい

それでは、まずは縦方向(行)の絞り込みをする式を考えていきましょう。
つまり部門のチェックボックス

見出しを含めた M31:M40 の✅に連動して行を絞り込むという処理です。
わかりやすいように
元データ範囲 B1:V10 を data
見出しを含めたチェックボックス範囲 M31:M40を 部門
※珍しく日本語変数名を使ってみました
とLET関数で変数定義するとします。
=LET(data,B1:V10,部門,M31:M40,
また追加条件として
・見出し行は必ず出力すること
・チェックが一つもついていない場合は全データを出力すること
とします。


この処理はFILTER関数の方が簡単ですかね?
FILTER関数の場合は
=LET(data,B1:V10,部門,M31:M40,FILTER(data, この部分の式を考える ))
こんな式になります。考えてみましょう!
余裕のある人は QUERY関数の式にも挑戦してみましょう!
※QUERY関数の場合は「部門」を M31:M40 ではなく違う形で定義する必要があります
シンプルな式を作ろうとすると結構難しい「超応用例」と言える問題です!
↓↓
回答はここから。
↓↓
A2. チェックボックスを条件にして、表示する部門を絞り込みたい(FILTER関数)
まずはFILTER関数の回答です。

=LET(data,B1:V10,部門,M31:M40,
FILTER(data,NOT((部門=false)*OR(部門))))
今回のFILTER関数の条件式は
NOT((部門=false)*OR(部門))
実は ここまでシンプルに出来るんです。
解説していきます。
FILTER関数の条件部分は、行数(列数)が同じサイズの一次元配列になれば何を利用してもよいので、 data と同じ行数の一次元配列 部門(チェックボックス範囲) をそのまま使えないか? とまずは考えます。

ただ、
FILTER(data,部門)
とした場合は、チェックを付けた箇所はTRUEなので出力されますが、見出しの「部門」というテキストは TRUEではないので出力対象外となります。
ここで OR条件で TRUE または "部門"という文字と一致する
FILTER(data,部門+(部門="部門"))
としてもいいんですが、今回は 部門 配列が FALSEではない という条件記述としてみましょう。

=LET(data,B1:V10,部門,M31:M40,FILTER(data,部門<>false))
これなら「部門」という見出し部分の文字列は FALSEではないので、常に出力されますし、チェックを入れたところも TRUE となる為 FALSE ではないという条件式はTRUEを返すので、出力されます。
これで見出し部分はクリアですね。
もう1つの条件「全てチェックが入ってない時は全データを出力」はどうするか?
全てチェックが入っていないは 部門に TRUEが一つもないということなので、
OR(部門)が FALSE を返す ▶ チェックが一つも無い
と判定できます。

1個でもチェックが付いていれば OR(部門) は TRUEを返すわけです。
これを先ほどの条件式 部門<>false と組み合わせたいのですが
(部門<>data)*OR(部門)

このままだと 一つもチェックが付いてない時は OR(部門)が FALSE で 0をかけたことになり 全て 0となってしまいます。
だから最後にNOT関数で反転させます。
全体をNOTで反転させるので、 部門<>false は 部門=false とします。

これによって、全て✅が入ってないときは全てTRUEとなり

一つでも✅が入った時は 見出し行と チェックを入れた行がTRUEとなります。
これをFILTERの条件式としたものが、恐らくもっともシンプルな回答です。
=LET(data,B1:V10,部門,M31:M40,
FILTER(data,NOT((部門=false)*OR(部門))))
A2. チェックボックスを条件にして、表示する部門を絞り込みたい(QUERY関数)
もう一つ、QUERY関数の回答です。

=LET(data,B1:V10,部門,IFNA(JOIN("|",FILTER(N32:N40,M32:M40)),".*"),
QUERY(data,"where Col1 matches '"&部門&"'"))
QUERY関数で今回のような別の場所のチェックボックスを条件に絞り込む方法は
第1引数のdata にチェックボックスの列を横連結する
チェックボックスを 第1引数の dataのキーワードに置き換え、matches と| パイプを使った OR条件として利用する
という2つの方法が考えられます。
今回は 2の解法でいってみましょう。(1の解法についても最後に触れます)
この場合 部門 の変数定義が一工夫必要です。
部門,IFNA(JOIN("|",FILTER(N32:N40,M32:M40)),".*")
ここで 👆 FILTER関数使ってるじゃない!って言われそうですが、もちろんQUERY関数で置き換えることはできます。(長くなるけど)
=LET(data,B1:V10,部門,IFNA(JOIN("|",
QUERY(M32:N40,"select Col2 where Col1 = true",0)),".*"),
QUERY(data,"where Col1 matches '"&部門&"'"))
まず QUERY関数で 行を絞り込む際に使うのは where句なんですが、FILTER関数と違って 第1引数 の範囲に無い 列を利用して 絞り込むことは出来ません。
だから data (B1:V10) の1列目 Col1 を使う必要があります。

これが チェックを付けた 部門のいずれかと一致する を条件とすれば良いので、QUERY関数シリーズでも紹介した matchesの正規表現テクニック | パイプで区切って OR条件で絞り込む を使います。
where句の matchesで 複数の値のいずれかに「一致する」記述と、いずれかを「含む」記述
それが
JOIN("|",FILTER(N32:N40,M32:M40))
この部分です。

チェックを付けた部門だけに絞り込んで、JOIN関数で | を区切り文字として結合しています。
QUERY関数を使った場合は 見出しは自動出力できるので、考慮する必要はありません。見出しに関して FILTER関数よりも楽ですね。
あとは 全てチェックが無い時に全出力とする処理ですが

✅が一つもない(条件に一致する項目が一つもない)時、FILTERやQUERY(見出し0行)は #N/Aエラーとなるので、IFNA関数で mathces で全てに一致する(改行入りテキストを除く) .* を 返すとしておけばOK。
これを LET関数で 部門と定義すれば
部門,IFNA(JOIN("|",FILTER(N32:N40,M32:M40)),".*")
最後のQUERY関数は 👇このように 非常にシンプルになるわけです。
QUERY(data,"where Col1 matches '"&部門&"'")
以上、回答2パターンでした。
操作エリアの条件に連動して 列(年・Q)を絞り込む
行に続いて、列方向の絞り込みをしていきます。

要件としては
・N26の 四半期を選択したら その Q の列のみ出力する
・N28の 年 を選択したら その 年 の列のみ出力する
・四半期、年ともに「全て」を選択の場合は、全ての列を出力する
・プルダウン 未選択(空白)の場合は、全ての列を出力する
・dataの1列目(部門)は必ず出力する
このようにします。
プルダウン未選択で全ての列を返すなら、わざわざプルダウンの選択肢に「全て」を追加しなくてよいのでは?と思うかもしれませんが、
プルダウンは、マウス操作だけでは 選択肢を空白に戻すことが出来ません。

マウスだけで操作できるように、選択肢の中にあえて「全て」を加えています。(ちょっとした優しさですw)
Q3. 2つのプルダウンを条件にして、表示する期間(列)を絞り込みたい
それでは、お題いってみましょう。

四半期、年のプルダウン選択に応じて データの列を絞り込むにはどうしたらよいでしょうか?
今回もFILTER関数、QUERY関数の両方で考えてみましょう。
FILTER関数を使う場合は、👇こちらの式を
=LET(data,B1:V10,部門,M31:M40,
FILTER(data,NOT((部門=false)*OR(部門))))
QUERY関数を使う場合は、👇こちらの式を
=LET(data,B1:V10,部門,IFNA(JOIN("|",
QUERY(M32:N40,"select Col2 where Col1 = true",0)),".*"),
QUERY(data,"where Col1 matches '"&部門&"'"))
ベースにして 式を作るものとします。
考えてみましょう!
↓↓
回答はここから。
↓↓
A3. チェックボックスを条件にして、表示する部門を絞り込みたい(FILTER関数)
まずはFILTER関数の回答です。

=LET(data,B1:V10,部門,M31:M40,期間,N28&N26,header,INDEX(data,1),
x,FILTER(data,NOT((部門=false)*OR(部門))),
FILTER(x,REGEXMATCH(header,SUBSTITUTE("部門|"&期間,"全て",))))
解説していきます。
まず、LET関数で 四半期のプルダウン N26セル、年のプルダウン N28セルを それぞれ変数でおくのではなく、
期間, N28&N26
と 年、期間の順に &連結で1つのテキストとしたものを 期間 と置きます。
これによって後のFILTER式をシンプルにしています。
条件で利用するのは data 部分の 1行目なので これを INDEX関数で取得して
header,INDEX(data,1)
とします。(日本語に揃えればよかった。。)
また、Q2で 作成した 行を絞り込んだFILTER式の結果を
x,FILTER(data,NOT((部門=false)*OR(部門))),
として x と置きます。
これで準備はOK。
FILTER関数は 行(縦)、列(横)、どちらの絞り込みにも使えるのが魅力です。
=LET(data,B1:V10,部門,M31:M40,期間,N28&N26,header,INDEX(data,1),
x,FILTER(data,NOT((部門=false)*OR(部門))),
FILTER(x, 【ここを考える】
この後の 列方向のFILTERの条件式は header を 対象として、四半期、年、ともに 含む判定をする必要があるので、 REGEXMATCH関数 を利用します。
ここで REGEXMATCH関数の第2引数に 期間 をそのまま使って
REGEXMATCH(header,期間)
とすることで、



いずれのパターンも満たします。
さらに 四半期、年 ともに 未選択(空白)の場合は、 期間, N28&N26 は 空文字 となり、
REGEXMATCH関数の仕様上、第2引数が空文字、空白の場合は、

全てTRUEを返すので、未選択時の全出力 を含めてクリアしています。
ただ、プルダウンで「全て」を選択したした場合も全出力とする必要があるので、

ここは SUBSTITUTE関数で「全て」を空白に置換しちゃいましょう。
REGEXMATCH(header,SUBSTITUTE(期間,"全て",))
これで「全て」選択時の全出力もクリアです。

最後に 一番左の見出し列を 必ず出力させる為に、
"部門|" & 期間
このように 期間の前に "部門|" という文字列を加えて連結させます。
REGEXMATCH(header,SUBSTITUTE("部門|"&期間,"全て",))

これによって REGEXMATCH関数は 正規表現で「または」マッチとなり、見出し(header)が「部門」という文字列の1列目は 常にTRUEを返します。」
FILTER(x,REGEXMATCH(header,SUBSTITUTE("部門|"&期間,"全て",)))

これで列(横)方向の絞り込みも出来たので、条件に応じての縦・横に絞り込みをした インタラクティブグラフ用の可変データを出力する式は完成です。
回答にたどり着けたでしょうか?
A3. チェックボックスを条件にして、表示する部門を絞り込みたい(QUERY関数)
QUERY関数を使った場合の回答です。

=LET(data,B1:V10,部門,IFNA(
JOIN("|",QUERY(M32:N40,"select Col2 where Col1 = true",0)),".*"),
期間,SUBSTITUTE(N28&N26,"全て",),
header,INDEX(data,1),
x,QUERY(data,"where Col1 matches '"&部門&"'"),
TRANSPOSE(
QUERY(TRANSPOSE(x),"where Col1 matches '.*("&期間&").*'")))
先ほどのFILTER関数の式と考え方は一緒です。
こちらは
期間,SUBSTITUTE(N28&N26,"全て",),
👆 最初から N28&N26として SUBSTITUTEで「全て」を空白に置換したものを 期間 という変数にしています。
最後のQUERY式ですが、FILTER関数と違ってQUERY関数は横方向の絞り込みは出来ません。
select句で列を絞り込む方法もあるんですが、今回は煩雑な式になってしまうので、1回目のQUERY関数で行方向(営業部)で絞り込んだ結果 xを TRANSPOSE関数で90度回転させ、

この状態で where句で Col1(部門の列)を対象に matches で含む条件で絞り込みます。
QUERY(TRANSPOSE(x),"where Col1 matches '.*("&期間&").*'")

見出し行は自動で出力されるので、ここも気にする必要がありません。
これをもう1回TRANSPOSE関数で 縦横を戻せば

完成です。
=LET(data,B1:V10,部門,IFNA(
JOIN("|",QUERY(M32:N40,"select Col2 where Col1 = true",0)),".*"),
期間,SUBSTITUTE(N28&N26,"全て",),
header,INDEX(data,1),
x,QUERY(data,"where Col1 matches '"&部門&"'"),
TRANSPOSE(
QUERY(TRANSPOSE(x),"where Col1 matches '.*("&期間&").*'")))
QUERY関数を3発使った 応用例でした~。
A3. QUERY関数 別解

=LET(data,B1:V10,部門,M31:M40,
期間,SUBSTITUTE(N28&N26,"全て",),header,INDEX(data,1),
x,QUERY({部門,data},"select Col"&JOIN(",Col",SEQUENCE(COLUMNS(data)-1,1,2))&" where Col1 = "&OR(部門)),
TRANSPOSE(QUERY(TRANSPOSE(x),"where Col1 matches '.*("&期間&").*'")))
QUERY関数のもう一つの解法
第1引数のdata にチェックボックスの列を横連結する
で進めた場合の式です。
最後のQUERY式は一緒で、ポイントは
部門,M31:M40,
x,QUERY({部門,data},"select Col"&JOIN(",Col",SEQUENCE(COLUMNS(data)-1,1,2))&" where Col1 = "&OR(部門)),
この部分。
まずは チェックボックス部分はそのまま、部門 という変数にして利用します。
{部門,data} と一番左に チェックボックス列を連結して、この Col1を where句の中で条件式に使えるようにします。

条件は = true としたいところですが、一つも チェックがついてない時は全出力という条件に対応する為に
" where Col1 = "&OR(部門)
こんな式にしています。
OR(部門) は、一つでもチェックがつけば TRUE、一つもチェックがついていなければ FALSE を返すので、これを where句の条件に利用しています。
ブール値(Boolean型)は 文字列と違ってシングルクォートで括る必要はありません。また 大文字・小文字を考慮しないので TRUE 、true どちらでも使えます。
where句の条件は 型を意識。文字列はシングルクォートで括る
ただ、この連結した チェックボックス列(Col1)は、where句の条件には使いたいけど結果として出力はしたくないので、select句の文字列を
"select Col"&JOIN(",Col",SEQUENCE(COLUMNS(data)-1,1,2))
このように生成しています。
これはQUERY関数シリーズの select回で取り上げましたね。
QUERY関数のselect句で 20列のデータの 1列目を除いた 2列目~20列目を指定する記述の文字列を数式で生成したい
QUERY関数の式を2パターン紹介しましたが、今回のケースはFILTER関数の方が簡単かなと思います。
インタラクティブなグラフを完成させる
選択した条件で表が絞り込みでたら、ほぼ完成です。最後にこちらをグラフに反映させましょう!
最初に生成したグラフの範囲を変更するだけ

最後にやることは、元データから生成した折れ線グラフを 3点リーダーから「グラフを編集」に進み、データ範囲で選択している B1:V10 の部分を

数式で絞り込んだ表を出力するセル範囲 B12:V21 に変更するだけ。
全て出力された場合を想定した、最大出力範囲をグラフの範囲としましょう。
これだけです。

右側の プルダウン で選択した 四半期、年、そしてチェックボックスで選択した 部門に 連動する インタラクティブグラフ 完成です!
スプレッドシート上のインタラクティブグラフを試す
実際に動かしてみましょう。
✅チェックボックスで表示させる営業部を選択

チェックが一つもない状態では、全営業部が表示され、一つでもチェックをつけたら、チェックを付けた営業部のみがグラフに表示されます。
✅ショートカットで一括オン・オフ

GASなしでチェックボックスの一括オン・オフ ボタンを作ることは無理ですが、部門選択エリアが独立したリージョンになっていれば、ショートカットで操作が出来ます。
チェックボックスエリアのセルが選択された状態で、Ctrl + A で 部門選択エリアが(文字列のN列も含め)全て選択され
スペースキーで、一旦 全てのチェックボックスをチェックオンに。
もう一度スペースキーで 全てのチェックをオフに。
選択範囲のチェックボックスではないセルには、一切影響がないのがわかりますね。
ショートカットでGoogleスプレッドシートのチェックボックスを一括操作するテクニックは、👇過去noteで詳しく触れています。
✅四半期と年のプルダウンで 表示期間を絞り込み

四半期のプルダウンで「2Q」を選択すると 各年の第2四半期だけを比較する推移グラフに
四半期のプルダウンを「全て」にすると、未選択(空白)の時と同じ 全期間グラフに
そして「年」のプルダウンで「2022年」を選択すると、2022年の推移グラフに
プルダウンに連動して、グラフが変化してますね。
インタラクティブなグラフをGASなしで、シート関数を組み合わせた数式だけで作れました~。
スプレッドシートで作ったインタラクティブ グラフの弱点
結構便利だとは思いますが、どうしてもスプレッドシートで作ったツールなんで弱い部分があります。
前回も取り上げましたが、
営業部ごとにグラフの色を固定できない(コロコロ色が変わる)
スプレッドシートなので 操作部分を壊される可能性がある
誰かが操作していると他の人が操作できない
この3つが大きなウィークネスかなと。
1⃣ 営業部ごとにグラフの色を固定できない(コロコロ色が変わる)

👆 最初は 青線 が F営業部 だったのが、D営業部にチェックを入れると
青線 D営業部、赤線 F営業部 に変わって、さらに B営業部にチェックを入れると
青線 B営業部、赤線 D営業部、黄線 F営業部
とチェックのオン・オフで、営業部ごとのグラフの色がコロコロ変わってしまいます。
営業部ごとのカラーが固定出来た方がわかりやすいのですが、残念ながらグラフの色を固定することは出来ません。
2⃣ スプレッドシートなので 操作部分を壊される可能性がある

ユーザーに操作してもらう場合、チェックボックスやプルダウンのセルに保護をかけることが出来ません。
保護をかけていない状態だと、チェックボックスやチップ表示のプルダウンが Deleteで削除できてしまうリスクがあります。
不慣れなユーザーだと、チェックボックスを外すのにDeleteキーを使ってチェックボックスごと削除してしまったり、プルダウンの選択をクリアする際に Deleteを2回押して プルダウン自体を削除してしまうことも・・・。
当然、すぐに「操作を戻す」ボタンや Ctrl+Z してくれればいいんですが、不慣れなユーザーは 運用ルールをなかなか守ってくれませんw
常に壊されるリスクがあるってことです。
3⃣ 誰かが操作していると他の人が操作できない

最後がコレです。スプレッドシートはの共有は、同じ画面を見ながらメンバーが共同作業をする想定の機能です。
つまり グラフを使おうと スプレッドシートを開いても、他の人がグラフ操作をしていた場合は、もう一人のユーザーは待つしかないってことです。
後から入ったユーザーは、すぐに確認操作したいのに待たされて困りますし、先に使ってたユーザーも他の人に自分の操作を見られて落ち着かないです。
これらの弱点が気になる、影響が大きいという場合は、前回紹介したように Gemini Canvasにコードを書いてもらって、グラフをWebアプリ化しちゃうのがおススメです。
FILTER関数とQUERY関数
今回は 前回紹介した インタラクティブなグラフを スプレッドシートのシート関数を組み合わせた数式のみで作る方法を紹介しました。
数式を組むパートでは、FILTER関数 と QUERY関数という 2大関数の使い方をお題形式で学びました。
どちらも非常に強力で便利な関数ですが、同じ「条件で絞り込む」処理でもアプローチが違うことを理解できたでしょうか?
FILTER関数は見出し行を出力する為の工夫が必要
FILTER関数は含む条件とする場合は、REGEXMATCH関数と組み合わせる(※他の関数を使う方法もある)
FILTER関数は横方向の絞り込みも出来る
QUERY関数の絞り込みは見出しを自動出力できる
QUERY関数で いずれかを含む条件とする場合は matches と|(パイプ)
QUERY関数は 第1引数のデータにない列では絞り込みができない
QUERY関数で横方向の絞り込みをしたい場合は、TRANSPOS ×2
それぞれの関数の特性・挙動を理解し、要件に応じて、適した関数が選べるようになっていきましょう!
次回は QUERY関数シリーズに戻る前に、もう1回だけ軽めのネタを書きたいと思います。
今回登場した、チェックボックスや プルダウンが Delteで消せちゃう問題を解決する 小ネタを予定

いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw