みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptとスプレッドシート、Googleフォーム、Googleカレンダーを使って、チームで使えるタスク管理ツールを作成しています。
前回の記事はこちらでした。
Google Apps Scriptのイベントトリガー「値の変更」の使い方、また、スプレッドシートで変更されたセルの位置を知る方法についてお伝えしました。
今回は、タスク管理ツールの総仕上となります。
Google Apps ScriptでGoogleカレンダーのイベントタイトルを変更する方法を使います。
これにより、タスクが完了したときにカレンダー表示を「イベント名【完了】 」と変更をする処理を追加していきます。
では、行ってみましょう。
前回のおさらい
まず、前回のおさらいをしましょう。
使用するスプレッドシートはこちらですね。
このシートがタスクとそのステータスを管理するシートになっていて、これらのタスクは専用のGoogleカレンダーでその期限を確認ができます。
今回のお題としては、F列の「ステータス」がスプレッドシート上で「完了」に変更されたときに、Googleカレンダーのイベント名に「【完了】」という文字列を追加したい、ということになります。
その処理については、前回作成したこちらのスクリプトをベースに作っていきます。
function showStatus(){ var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得 var myCell = mySheet.getActiveCell(); //アクティブセルを取得 if(myCell.getColumn()==6){ //アクティブセルがF列かを判定 Browser.msgBox(myCell.getRow() + '行目のステータスが変更されました'); } }
このスクリプトは、イベントトリガー「値の変更」で呼び出されるもので、変更されたセルがF列「ステータス」であれば、行番号を返す、というものでした。
7行目の処理を、Googleカレンダーのイベント名変更の処理に変えていけばよいですね。
Googleカレンダーのイベント名を変更する
まず、Googleカレンダーから目的のイベントを取得しなければいけません。
なんとなく、カレンダーオブジェクトにはgetEventsByIDというようなIDから特定のイベントを取得するメソッドがありそうなのですが、残念ながら存在しないようです…。
ということで、ちょっと遠回りですが
- 納期(日付)の日付のイベントを配列で取得する
- 取得したイベントすべてについて繰り返し
- 現在のイベントのIDが探しているイベントのIDと等しければ
- そのイベントのタイトルを変更する
- 現在のイベントのIDが探しているイベントのIDと等しければ
という流れになりまして、それをスクリプトにしたのがこちらです。
/* セルが変更されたら実行してカレンダーのイベント名に【完了】を追加 */ function changeStatus(){ var myCal = CalendarApp.getCalendarById('xxxxxxxxxxxxxxxxxx@group.calendar.google.com'); //カレンダーIDでカレンダーを取得 var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得 var myCell = mySheet.getActiveCell(); //アクティブセルを取得 if(myCell.getColumn()==6){ //アクティブセルがF列かを判定 var myEvtID = myCell.offset(0,-1).getValue(); //イベントID var myEvts = myCal.getEventsForDay(myCell.offset(0,-3).getValue()); //当日のイベントを取得 for each(var evt in myEvts){ //取得したイベントの配列全てについて繰り返す if(evt.getId() == myEvtID){ //現在のIDが目的のIDであれば evt.setTitle(evt.getTitle() + "【完了】"); } } } }
指定日のイベント一覧を取得するgetEventsForDayメソッドの使い方などは以下記事もご覧ください。
今回のポイントについて、以下で解説していきますね。
offsetメソッドで相対位置のセルを取得
10行目は、「完了」とされたタスクのIDを取得しています。ここで、offsetというメソッドがありますが、これは相対位置の指定でセルを取得するメソッドです。
書き方としては、
となります。これで基点となるセル範囲から、指定の数だけ移動した場所のセル範囲を取得できます。
例の場合は、myCellがF列ですから、行方向の移動数は0なのでそのまま、列はマイナス1列=E列のイベントIDを取得しています。
getRangeメソッドでも指定はできるのですが、行数・列数の指定で
var EvtID = getRange(myCell.getRow(),myCell.getColumn()-1).getValue();
と、若干冗長な表現になってしまうので、スッキリ書くために今回はoffsetメソッドを使いました。ケースバイケースで使い分けると良いでしょう。
setTitle,getTitleメソッドでイベントタイトルを変更
15行目が、イベント名=イベントタイトルを変更している箇所になります。
イベントのタイトルを取得するgetTitleメソッドと
イベントのタイトルを設定するsetTitleメソッド
を使って、「【完了】」を付与しています。
実行結果
完成した関数changeStatusに「値の変更」トリガーをセットして、スクリプトを動かしてみましょう。
このように無事、カレンダーのイベント名に【完了】がつきましたね。
まとめ
今回は、Google Apps ScriptでGoogleカレンダーのイベント名を変更する方法についてお伝えしました。
イベントはIDで直接は取得できないので、今回のようにgetEventsForDayメソッドで取得した上で、if文でIDを比較しながら該当のイベントを取得するという方法になります。もし、この機能を多用するのであれば、汎用的な関数にして使いまわすのも良いかもですね。
さて、ここまで数回にわたって、Googleカレンダー、Googleフォーム、スプレッドシートを活用した、チームで使うタスク管理ツールの作り方についてお伝えしてきました。
このようにGoogle Apps Scriptの場合は、Googleサービスをちょっと組み合わせる+GASで、そこそこレベルのシステムを簡単に作ることができますので、ぜひご活用下さい。
また、新たに面白いツールを思いついたら、お知らせしますね。
どうぞお楽しみに!