QUERY関数で指定日時以降のデータを抽出する
Facebook の公開グループ「Google for Education 研究グループ」に以下のような質問が寄せられていました。質問の意図とすれば、「GAS でどのようにしたらよいでしょう?」というものですが、
GAS による解決方法
けいすけさんが
という感じで、解決方法を提示されています。
こんな短時間でプログラムを作ったうえで、解説動画まで作るのはステキ!
QUERY 関数による解決方法
ということで、GAS による解決方法を複数人で焼き直しても有用ではないので、以前の記事でもネタにした Google スプレッドシートの QUERY 関数での解決方法を考えてみました。
(1)サンプルデータ
まず、下図のようなサンプルデータを用意してみました。サンプル数は 25件と少ない感じですが、Google フォームで集めた健康観察のデータをイメージして作成してみました。
列 A「タイムスタンプ」のデータは、手持ちのデータからコピペした生データとなっています。
D 列の名前については、以下の「個人情報おテストジェネレーター」によって生成したものなので、仮に実在する個人と一致するものだったとしても、意図したものではありません。
(2)作成したスプレッドシート
今回作成したのは、下図のようなスプレッドシートです。右上の黄色のマーカー部分で、QUERY 関数をどのように使うかを設定すれば、セル B1 に QUERY 関数に指定しなければならないクエリが生成され、セル A7 に設定された QUERY 関数は前述のサンプルデータをそのクエリによって処理します。
以下の URL にアクセスすると、自身の Google ドライブにコピーできるので実際に試してみてください。
https://docs.google.com/spreadsheets/d/1Aaz44FFOuS5rfHrAf9POyb8Vcx5hV_0I0AsuroV3c1U/copy
(3)クエリのポイント
どの日付(期間)のデータを処理の対象とするかを、スプレッドシート上で簡単に指定できるようにしています。クエリに指定する日付は / ではなく - で区切らなければならないこともあって、年月日をそれぞれ入力して指定します。
普段は、「指定日」のチェックをOFF にしておけば、当日のデータが対象となります。
ここで単純に日付だけではなく、時間も対象としています。健康観察ではなく欠席連絡として利用する場合、日付の変わる前に入力されてしまうことも考えられ、そのデータが前日分として扱われないように「前日の何時からを対象とするか?」と指定できるようにしてあります。
右側のオレンジ色のセルには、前日 17時の日時が表示されており、この日時以降のデータを抽出するため、4/26 を指定しても、4/25 17:34 のデータが抽出されます。
また、使い勝手などの観点から、日付を「昇順」か「降順」のどちらで表示するのかも選択可能です。
学校全体や学年で共通のフォームで回答を集めていた場合、自身の担当するクラスのデータだけを確認したい、発熱者がいるかだけを確認したい、といった絞り込みを行いたい場合にも、チェックボックスを操作するだけで簡単に絞り込みが行えます。
QUERY 関数は元データを参照しているだけで、元データには手を加えていません。複数人で同時に上記の絞り込みを行うためのチェックボックスを操作した場合、表示する内容の奪い合いが発生してしまいますが、それぞれの担当者ごとにシート「QUERY」をコピーして、自身のよく使う絞り込みの状態にしておけば奪い合いも発生しません。
(4)自身のデータで使うときは?
今回のスプレッドシートは、用意したサンプルデータを対象に行っています。GAS のプログラムなどを利用したものではなく、シート「QUERY」が、シート外のデータを参照しているのは、セル A7 の QUERY 関数だけです。
列 R のオレンジ色のセルや、セル B1 には関数や数式が設定してあります。
セル J5、J6 には「セルの入力規則」を設定してあります。
セル A7 の QUERY 関数の第一引数に処理対象となるデータ範囲を指定すれば、そのデータ範囲に対して処理を行います。
サンプルデータでは絞り込みの条件として、「学年」「組」「体温」を指定していますが、これらが指定したデータ範囲の何行目にあるのかを、列 K で指定しています。図のように C、D、F と入力してある部分が、それに当たります。
最後に
QUERY 関数は、前述したように指定されたデータ範囲を参照して、指定したデータを抽出するために使います。そのため、データを更新するなどの目的には使えません。
GAS と QUERY 関数などの関数をうまく使い分けて、業務が楽になればいいなと思います。
ちなみに…
元の質問のように、毎日のようにスプレッドシートからデータを削除する必要はありませんが、↓ の URL で案内されているように、Google スプレッドシートの扱えるセル数の上限が規定されているのも事実なので、この制限を超えないようにしなければならないことも事実。
この制限を回避するためには、別のスプレッドシート(ファイル)に退避させて元のシートから削除しなければならないので注意が必要です。
また、
今回の QUERY 関数に与えるクエリについては、以下のページを参考にさせていただきました。細かなクエリの記述やカスタマイズについては、そちらをご覧ください。
クエリの基本的な記述方法については、こちらを参考に…
今回の日時についての抽出は、こちらのページを参考にしています。