見出し画像

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 スプレッドシートでは、データからグラフを生成しても 画像になっていて、ユーザー側で編集ができない仕様でした。

Geminiにデータをグラフ化してもらう

しかし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列から表示させるのがおススメです。

A列のコードは不要なので対象外とした

今回はわかりやすいように、別シートではなく同じシートの元の表の下に、見出しを含めて 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年4Q

C1: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,"_"),"_"))

BYCOL関数で列ごとに UNIQUE関数で一意にして

=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. 第1引数のdata にチェックボックスの列を横連結する

  2. チェックボックスを 第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関数は 行(縦)、列(横)、どちらの絞り込みにも使えるのが魅力です。

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,期間)

とすることで、

四半期のプルダウンで 1Qを 選択した時
年のプルダウンで 2022年を 選択した時
四半期、年、両方を選択した時

いずれのパターンも満たします。

さらに 四半期、年 ともに 未選択(空白)の場合は、  期間, 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. 第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なしで、シート関数を組み合わせた数式だけで作れました~。



スプレッドシートで作ったインタラクティブ グラフの弱点

結構便利だとは思いますが、どうしてもスプレッドシートで作ったツールなんで弱い部分があります。

前回も取り上げましたが、

  1. 営業部ごとにグラフの色を固定できない(コロコロ色が変わる)

  2. スプレッドシートなので 操作部分を壊される可能性がある

  3. 誰かが操作していると他の人が操作できない

この3つが大きなウィークネスかなと。



1⃣ 営業部ごとにグラフの色を固定できない(コロコロ色が変わる)

👆 最初は 青線 が F営業部 だったのが、D営業部にチェックを入れると

青線 D営業部、赤線 F営業部 に変わって、さらに B営業部にチェックを入れると

青線 B営業部、赤線 D営業部、黄線 F営業部

とチェックのオン・オフで、営業部ごとのグラフの色がコロコロ変わってしまいます。

営業部ごとのカラーが固定出来た方がわかりやすいのですが、残念ながらグラフの色を固定することは出来ません。



2⃣ スプレッドシートなので 操作部分を壊される可能性がある

ユーザーに操作してもらう場合、チェックボックスやプルダウンのセルに保護をかけることが出来ません。

保護をかけていない状態だと、チェックボックスやチップ表示のプルダウンが Deleteで削除できてしまうリスクがあります。

不慣れなユーザーだと、チェックボックスを外すのにDeleteキーを使ってチェックボックスごと削除してしまったり、プルダウンの選択をクリアする際に Deleteを2回押して プルダウン自体を削除してしまうことも・・・。

当然、すぐに「操作を戻す」ボタンや Ctrl+Z してくれればいいんですが、不慣れなユーザーは 運用ルールをなかなか守ってくれませんw

知ってると便利。処理を戻す Ctrl + Z

常に壊されるリスクがあるってことです。



3⃣ 誰かが操作していると他の人が操作できない

最後がコレです。スプレッドシートはの共有は、同じ画面を見ながらメンバーが共同作業をする想定の機能です。

つまり グラフを使おうと スプレッドシートを開いても、他の人がグラフ操作をしていた場合は、もう一人のユーザーは待つしかないってことです。

後から入ったユーザーは、すぐに確認操作したいのに待たされて困りますし、先に使ってたユーザーも他の人に自分の操作を見られて落ち着かないです。

これらの弱点が気になる、影響が大きいという場合は、前回紹介したように Gemini Canvasにコードを書いてもらって、グラフをWebアプリ化しちゃうのがおススメです。



FILTER関数とQUERY関数

今回は 前回紹介した インタラクティブなグラフを スプレッドシートのシート関数を組み合わせた数式のみで作る方法を紹介しました。

数式を組むパートでは、FILTER関数 と QUERY関数という 2大関数の使い方をお題形式で学びました。

どちらも非常に強力で便利な関数ですが、同じ「条件で絞り込む」処理でもアプローチが違うことを理解できたでしょうか?

  • FILTER関数は見出し行を出力する為の工夫が必要

  • FILTER関数は含む条件とする場合は、REGEXMATCH関数と組み合わせる(※他の関数を使う方法もある)

  • FILTER関数は横方向の絞り込みも出来る


  • QUERY関数の絞り込みは見出しを自動出力できる

  • QUERY関数で いずれかを含む条件とする場合は matches と|(パイプ)

  • QUERY関数は 第1引数のデータにない列では絞り込みができない

  • QUERY関数で横方向の絞り込みをしたい場合は、TRANSPOS ×2


それぞれの関数の特性・挙動を理解し、要件に応じて、適した関数が選べるようになっていきましょう!

次回は QUERY関数シリーズに戻る前に、もう1回だけ軽めのネタを書きたいと思います。

今回登場した、チェックボックスや プルダウンが Delteで消せちゃう問題を解決する 小ネタを予定


いいなと思ったら応援しよう!

mir チップ大歓迎です。やる気がアップしますw