Google スプレッドシートで管理していた障害管理表を元に、フィルタ機能で自分が担当した障害をフィルタしていました。そのまま原因分析をしようとしたところ、自分の担当した件数以上にデータを取得してしまいました。
画面のフィルタを活かす、またはフィルタと同等の機能を使えるようにするのが、この記事の目的です。
環境
- Google スプレッドシート
仕様
2021年10月1日から2021年10月31日までの東京の平均気温が載っているCSVを元にする。土日の平均気温を調べたい。
次の画像はゴールを指定しています。画像では曜日のB列で「値でフィルタ」をして「土」・「日」をフィルタした結果を表示しているため、土日しか表示されていませんが、平日のデータも存在します。土日の平均気温は18.07℃、10月平均気温は18.17℃です。18.07℃を求められることがゴールです。
フィルタした結果を元に計算したい
SUBTOTAL
関数を使用することで、画面上でフィルタしている状態の平均や合計を簡単に計算できます。
第一引数を変更することで、最小値、最大値等を求めることもできます。
# 平均を求めるには1を第一引数とする。 # 第二引数には範囲を指定します。 =SUBTOTAL(1,$C$4:$C$34)
SUBTOTAL
関数の詳細は公式ページを参照してください。
- 1 - AVERAGE
- 2 - COUNT
- 3 - COUNTA
- 4 - MAX
- 5 - MIN
- 6 - PRODUCT
- 7 - STDEV
- 8 - STDEVP
- 9 - SUM
- 10 - VAR
- 11 - VARP
また、1桁のコードの先頭に10を追加するか、2桁のコードの先頭に1を追加すると非表示の値を無視できるそうです。101
であれば非表示の値を無視したうえでAVERAGE
, 110
であれば非表示の値を無視したうえでVAR
の関数で処理します。
フィルタした結果を元に処理したい
集合関数(AVERAGE、SUM、MAX等々)を使用したい場合はSUBTOTAL
関数を使用すれば、画面上でフィルタした結果を使用できます。
それ以外の操作をしたい場合、FILTER
関数を使用するとフィルタした結果を元に処理できます。ただし、FILTER
関数では画面上でフィルタした結果を使用することはできません。画面上で使用しているフィルタと同等の条件をFILTER
関数ですべて指定する必要があります。
FILTER
関数の第一引数に、フィルタする前の範囲を指定します。第二引数以降にフィルタする条件を指定します。第二引数、第三引数以降はそれぞれの条件をANDで結合してフィルタします。もしOR条件でフィルタしたい場合は、条件を+
で結合するとOR条件でフィルタできます。
# AND条件でフィルタしたい場合、第二引数以降にパラメータを指定する =FILTER(範囲, A条件, B条件) # OR条件でフィルタしたい場合、+で結合します =FILTER(範囲, (A条件)+(B条件))
また、列数は一致している必要はありませんが、行数は一致している必要がありますので注意してください。
今回のユースケースの場合、B列が「土」・「日」のレコードのC列の平均気温を取得したいので、FILTER
関数でフィルタした後に集合関数のAVERAGE
を設定しています。
=AVERAGE(FILTER($B$4:$C$34, ($B$4:$B$34="土")+($B$4:$B$34="日")))
終わりに
フィルタした結果を別シートにコピー&ペーストして、必要なレコードを抽出してもよかったのですが、毎回この手作業やりたくなかったので方法を知ることができてよかったです。
今後もSUBTOTAL
、 FILTER
関数を使って、余計な条件を省いた結果を容易に分析したいです。
…まぁ、本格的に分析したければ、SpreadSheetではなくBIツールを使った方がいいとは理解しています。とりあえず、さくっと確認したいときには使える関数です。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考情報
- 平均気温の取得元
- SUBTOTAL - ドキュメント エディタ ヘルプ
- How to use an advanced filter with an OR condition in Google Sheets