みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでチームで使えるタスク管理ツールをスプレッドシート、Googleフォーム、Googleカレンダーで作成するシリーズです。
前回の記事はこちらです。
Googleフォームからの新規タスクを入力がると、タスク管理用のGoogleカレンダーのタスク期限の日時にイベントが追加されるという処理を作成しました。
今回から、スプレッドシートのタスクのステータスが「完了」にされたときの処理を考えてきます。
まず、Google Apps Scriptのイベントトリガー「値の変更」の使い方と、値の変更されたセルの位置を知る方法から解説をします。
これは、かなりあちこちで使えるテクニックですので、ぜひマスター頂ければと思います。
前回までのおさらい
Googleフォームからタスクを入力すると、スプレッドシートにその情報が追加されます。これは、通常のGoogleフォームの動きですね。
このスプレッドシートにフォームからの情報通知があったということをトリガーに、イベント追加のスクリプトが起動して、以下のようにカレンダーに追加されつつ
スプレッドシートにはE列イベントIDと、F列ステータスが入力される
というところまで前回進めました。
今回は、スプレッドシートのF列が「未完」から「完了」に切り替わったときにスクリプトを起動させる、という点を進めていきます。
イベントトリガー「値の変更」を設定する
まず、スプレッドシートの特定のセルの値が変更されたときを検知して、スクリプトを起動させる必要があります。
その場合は、イベントトリガー「値の変更」を使えばOKですね。
例えば、showStatusという関数を起動させるのであればメニューの「リソース」→「現在のプロジェクトのトリガー」からウィンドウを開いて、「新しいトリガー」をクリック。
そこで、実行を「showStatus」、イベントを「スプレッドシートから」「値の変更」を選択して、「保存」ですね。
これで、スプレッドシートの任意のセルに値の変更があった場合には、都度「showStatus」が実行されることになります。
値の変更があったセルの位置を知る方法
次にスプレッドシートの中で値が変更されたのはどのセルなのか?を知る必要があります。
例えば、F2セルが「完了」に変更されたのであれば「牛乳を買う」というタスクについてGoogleカレンダーのイベント名を変更しますし、F列でないセルであれば何の処理も実行する必要もありません。
getActiveCellで変更されたセル位置を取得
値が変更されたセルの位置を知るということは、言い換えれば「今、カーソルがあるセル」の位置を知るということと同義ですから、アクティブなセルの位置を返すgetActiveCellメソッドを使います。
getRowとgetColumnでセルの位置を取得
また、指定のセルの行番号および列番号を取得する場合は、Rangeオブジェクトに対してそれぞれgetRow、getColumnメソッドを使います。
値の変更があったセルの位置を表示するスクリプト
それでは、上記メソッドを使って、値の変更があったセルがどこなのかを調べて、その結果を返すスクリプトを作成してみましょう。
こちらをご覧下さい。
function showStatus(){ var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得 var myCell = mySheet.getActiveCell(); //アクティブセルを取得 if(myCell.getColumn()==6){ //アクティブセルがF列かを判定 Browser.msgBox(myCell.getRow() + '行目のステータスが変更されました'); } }
まず4行目でアクティブセルを取得しています。
そして6行目のif文ですが、アクティブセルの列番号を調べてそれが6つまりF列「ステータス」かどうかを判定して、そうであればその行番号を調べてメッセージを表示します。F列でない場合は何の処理もしない、ということになりますね。
実行結果
では、こちらを保存して実行してみましょう。
例えば、スプレッドシートでセルF3のステータスを「完了」に変更してみますと
このように「3行目のステータスが変更されました」とメッセージが表示されます。
別のセル、例えばA6セルに何か入力してみても
特に何も起きません。
まとめ
以上、イベントトリガー「値の変更」の使い方と、値の変更があったセルの行および列を知る方法についてお伝えしました。
getActiveCell、getRow、getColumnはセットで使う場合が多いと思うので、ぜひまとめて覚えておきたいですね。
次回ですが、実際にGoogleカレンダーのイベント名を変更していく処理についてお伝えしていきます。
どうぞお楽しみに!