【GAS活用術③】Googleフォームから送信されたらスプレッドシートのデータを自動でソート(並べ替え)
PTAや学校関係者必見?!の「自動で並べ替え」
Google Apps Script (GAS)を、もっと身近に、日々の暮らしに。
皆さん、Googleフォームを作成したこと、ありますか?
作成したことがある方は、「Googleフォームからデータが送信される度に、スプレッドシートのデータをシート(並べ替え)できたらな」と思ったことはありませんか?
今回は、GASを使ってこの自動ソートをする方法をご紹介します。特に、PTAや学校関係でGoogleフォームを使っている方、必見の内容ですよ。
イケてるGoogleフォーム、でも、、、
Googleフォーム?作ったことないなー、という方のために、簡単にGoogleフォームの話を少しだけしていきますね。
うちの子が通っている小学校では、数年前から、PTA活動や小学校でもGoogleフォームが使われるようになりました。
以前は子ども達に紙を配布、保護者が記入後、学校で紙を回収していましたが、最近は、QRコードが印刷された紙が配布され(ここはまだ紙)、保護者が各自Googleフォームにアクセスし、必要事項を入力後、データを送信するという形式に変わって来ています。
紙ベースの回収作業に比べれば、明らかに便利ですよね。
作成したことがある方は、ご存じだと思いますが、Googleフォームはスプレッドシートを連携させることができます。連携すると、Googleフォームで入力・送信されたデータは、スプレッドシートに自動的に挿入されます。
もともとGoogleフォームは、アンケートの回答用フォームとして作られ、アンケートの回答結果を収集するために、スプレッドシートに連携する、という発想で作られたようです。
このコンセプトも素晴らしいのですが、アンケートでなくても、各自がデータを入力する仕組みとして、Googleフォームはとても優秀な使えるやつなのです。
私が作成した読み聞かせの登録システムでも、各ボランティアの方が読んだ本の記録をGoogleフォームから入力すると、連携したスプレッドシードにどんどん読み聞かせの記録が蓄積されるようになっています。
Googleフォームの作り方も、スプレッドシートとの連携も簡単だし、作ってすぐは完璧!と思っていましたが、試しにデータを入力してみると、ある問題に気づきました。
Googleフォームから入力すると、新しく入力したデータが一番最後の行に追加されるのです。こんな感じに登録した順にデータが並びます。
しかし、読み聞かせをする時は、担当するクラスで以前、どんな本を読んだか確認するので、以前の記録は、年・組・読み聞かせ日の順に並び替え(ソート)をしておく必要があります。
PTAや学校でGoogleフォームを使っていたら、年・組・出席番号の順にデータを自動的に並べ替えされた方が楽だと思います。
ということで、「Googleフォームから入力されたら、自動的にデータをソートする方法」について解説します。
さっそくGASのコードをコピペ
ここでは、Googleフォームに連携したスプレッドシートが定義済みあることを前提に、「Googleフォームから入力されたら、自動的にデータをソートする方法」を解説していきます。
スプレッドシートを開き、メニューバーから、拡張機能 > Apps Script を選択しApps Scriptを起動します。
対象のスプレッドシートからはじめてApps Scriptを起動した方は、下記のようにコード.gsファイルに、「function myFunction() { }」が書かれていると思います。
次に下記のコードをコピーします。かなり短めですよね。
function sortByClass() {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //一番左のシートを取得
let range = sheet.getDataRange();
let dRange = range.offset(1, 0, range.getNumRows() - 1); //見出し行を除く
// sort({ソートをかける列の指定}, {true: 昇順, false: 降順})
dRange.sort([{column: 4, ascending: true}, //第1キー:D列(年), 昇順
{column: 5, ascending: true}, //第2キー:E列(組), 昇順
{column: 2, ascending: true} //第3キー:B列(読み聞かせ日), 昇順
])
}
そして、コード.gsファイルに、コピーした、sortByClass関数を作成するコードをペーストしてください。
ペースト後に、以下の箇所を変更してください。
2行目のgetSheets()[0]で一番左のシートを取得しています。
Googleフォームに紐づけている対象のシートが大体一番左にあると思います。対象シートが一番左にあれば(もしくはシートは1つしかないのであれば)、このままで変更は不要です。
(もし、シートが複数あって、かつ、対象シートが一番左にではない場合は、左から何番目か数えて、-1した数で[0]の0を書き換えてください)6~8行目で、ソートをかける列を指定します。
読み聞かせの記録の場合は、
第1ソートキーはD列・4番目の列(年)→ column: 4
第2シートキーはE列・5番目の列(組)→ column: 5
第3ソートキーはB列・2番目の列(組)→ column: 2
としています。ご自分のニーズにあわせて変更してください。1行目の関数名:sortByClassとしていますが、これもソートの内容に合わせて、変えてください。
ポイントはいうまでもなく、6~8行目です。
スプレッドシートでソートする時は、ソートの対象範囲をショートカットのCtrl+Aなどで指定してから、メニューバーからデータ > 範囲を並べ替え > 範囲の並べ替え詳細オプションで以下のように設定すると思います。
// sort({ソートをかける列の指定}, {true: 昇順, false: 降順})
dRange.sort([{column: 4, ascending: true}, //第1キー:D列(年), 昇順
{column: 5, ascending: true}, //第2キー:E列(組), 昇順
{column: 2, ascending: true} //第3キー:B列(読み聞かせ日), 昇順
])
列をアルファベットから、何番目かという数字に変えただけなので、イメージがつきやすいかと思います。上の方のソートキー・並べ替え条件が優先されます。
この例では3つのソートキー・並べ替え条件を指定していますが、必要に応じて増やしたり減らしたりにも、挑戦してみてくださいね。その場合は、括弧やカンマのルールを推測しつつ、慎重に実施してください。
sortメソッドはもっと省略して書く方法もありますが、これが直感的にわかりやすい書き方だと思います。ちなみに、4行目の
let dRange = range.offset(1, 0, range.getNumRows() - 1); //見出し行を除く
このoffsetは、範囲の並べ替え詳細オプションで「データにヘッダー行が含まれている」をチェックした場合と同じ処理をしています。
これをチェックすると、表の1行目をヘッダー行として、ソートの対象外としてくれますよね?それをoffsetメソッドがやってくれているわけです。
スクリプトを保存・実行してみる
ここまで来たら、スクリプトを保存し、実行してみましょう。
「無題のプロジェクト」をクリックして、プロジェクト名を変更
ツールバーの保存ボタンでプロジェクトを保存
ツールバーの「デバッグ」と「実行ログ」の間の「実行する関数を選択」で、作成した関数"sortByClass"が表示されていることを確認して実行ボタンをクリック
「承認が必要です」と言われたら、以下の手順で実行権限の承認する
→ 「権限を確認」をクリック
→ Googleにログイン画面で、自分のアカウントを選択
→ 「詳細」、「[プロジェクト名](安全ではないページ)に移動」を順番にクリック
→ 「許可」をクリックすることで、実行権限の承認完了
上記の手順は、【GAS活用①-3】のページで、画面ショットつきで説明しているので、そちらを参考にしてください。
なお、スクリプトの保存でエラーになった場合は、ソートキー・並べ替え条件を増やしたり減らしたりした際に、括弧やカンマが正しく記述されていない、といったことが考えられます。
無事、エラーなく実行されたら、スプレッドシートで期待通りに並べ替えができているか、確認しましょう。
指定した通りに、データが並べ替えされていますよね!
トリガーを設定する(イベントの種類:フォーム送信時)
これで今あるデータは並べ替えられましたが、フォームから新しいデータが入力されたら、最後の行に追加されてしまいます。
そこで、作成した関数"sortByClass"が、フォームから送信される度に実行されるよう、トリガーを設定しましょう。
スクリプトエディタの画面左端のメニューバーで「トリガー」を選択します。
「トリガーを追加」をクリックします。
トリガーを追加の画面で、「実行する関数の選択」でsortByClass、「イベントのソースを選択」でスプレッドシート、になっていることを確認します。
「イベントの種類を選択」のプルダウンをクリックすると、フォーム送信時がありますね!これを選択します。
あとは保存ボタンをクリックするだけです。
これでフォームからデータが送信される度に、関数"sortByClass"が自動実行され、データの並べ替えがされるはずです!
動作確認をする
では、最後に動作確認をしてみましょう。
Googleフォームからデータを送信して、、、スプレッドシートで並べ替えが自動的に行われたら、大成功です!!
終わりに
いかがでしたか。思っていたより簡単だったのではないでしょうか。スクリプトも短いので、GASの初めの一歩としては最適かもしれません。
思えば、私も読み聞かせの記録を「フォームから送信される度にソートしたい!」と思ったことがきっかけでGASに出会ったのでした。
個人的には、ぜひPTAや学校関係者の方に、年・組・出席番号順に並べ替えをしていただきたいです。
なお、フォームから送信される度に実行したい処理がソートだけであれば、まったく問題ありませんが、あれこれいろいろGASでやろうとすると、ちょっとまずいことも起きたりします。
実際に私が直面した事象について、「GAS失敗談」として以下の記事にまとめています。
ちょっと応用的な話ですが、よかったらこちらもご覧ください。
この記事が気に入ったらサポートをしてみませんか?