Google Apps ScriptでGoogleカレンダーのイベントタイトルを変更する方法

calendar

photo credit: brennan.browne via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptとスプレッドシート、Googleフォーム、Googleカレンダーを使って、チームで使えるタスク管理ツールを作成しています。

前回の記事はこちらでした。

301 Moved Permanently

Google Apps Scriptのイベントトリガー「値の変更」の使い方、また、スプレッドシートで変更されたセルの位置を知る方法についてお伝えしました。

今回は、タスク管理ツールの総仕上となります。

Google Apps ScriptでGoogleカレンダーのイベントタイトルを変更する方法を使います。

これにより、タスクが完了したときにカレンダー表示を「イベント名【完了】 」と変更をする処理を追加していきます。

では、行ってみましょう。

スポンサーリンク

前回のおさらい

まず、前回のおさらいをしましょう。

使用するスプレッドシートはこちらですね。

Google Apps ScriptでカレンダーのイベントIDとステータスを入力

このシートがタスクとそのステータスを管理するシートになっていて、これらのタスクは専用の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と等しければ
      • そのイベントのタイトルを変更する

という流れになりまして、それをスクリプトにしたのがこちらです。


/* セルが変更されたら実行してカレンダーのイベント名に【完了】を追加 */
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メソッドの使い方などは以下記事もご覧ください。

毎朝、当日の予定をGoogleカレンダーから取得してチャットワークに送る
Google Apps Scriptを使ってチャットワークに色々と送ることができます。Googleカレンダーから当日の予定を取得してチャットワークに送る方法についてお伝えしたいと思います。

今回のポイントについて、以下で解説していきますね。

offsetメソッドで相対位置のセルを取得

10行目は、「完了」とされたタスクのIDを取得しています。ここで、offsetというメソッドがありますが、これは相対位置の指定でセルを取得するメソッドです。

書き方としては、

Rangeオブジェクト.offset(行方向の移動数,列方向の移動数)

となります。これで基点となるセル範囲から、指定の数だけ移動した場所のセル範囲を取得できます。

例の場合は、myCellがF列ですから、行方向の移動数は0なのでそのまま、列はマイナス1列=E列のイベントIDを取得しています。

getRangeメソッドでも指定はできるのですが、行数・列数の指定で

var EvtID = getRange(myCell.getRow(),myCell.getColumn()-1).getValue();

と、若干冗長な表現になってしまうので、スッキリ書くために今回はoffsetメソッドを使いました。ケースバイケースで使い分けると良いでしょう。

setTitle,getTitleメソッドでイベントタイトルを変更

15行目が、イベント名=イベントタイトルを変更している箇所になります。

イベントのタイトルを取得するgetTitleメソッド

Eventオブジェクト.getTitle()

イベントのタイトルを設定するsetTitleメソッド

Eventオブジェクト.setTitle(イベント名)

を使って、「【完了】」を付与しています。

実行結果

完成した関数changeStatusに「値の変更」トリガーをセットして、スクリプトを動かしてみましょう。

Googleカレンダーのイベントタイトルを変更した結果

このように無事、カレンダーのイベント名に【完了】がつきましたね。

まとめ

今回は、Google Apps ScriptでGoogleカレンダーのイベント名を変更する方法についてお伝えしました。

イベントはIDで直接は取得できないので、今回のようにgetEventsForDayメソッドで取得した上で、if文でIDを比較しながら該当のイベントを取得するという方法になります。もし、この機能を多用するのであれば、汎用的な関数にして使いまわすのも良いかもですね。

さて、ここまで数回にわたって、Googleカレンダー、Googleフォーム、スプレッドシートを活用した、チームで使うタスク管理ツールの作り方についてお伝えしてきました。

このようにGoogle Apps Scriptの場合は、Googleサービスをちょっと組み合わせる+GASで、そこそこレベルのシステムを簡単に作ることができますので、ぜひご活用下さい。

また、新たに面白いツールを思いついたら、お知らせしますね。

どうぞお楽しみに!

連載目次:スプレッドシート、フォーム、カレンダーで作るタスク管理ツール

本シリーズはチームで使えるタスク管理ツールをG Suiteのスプレッドシート、フォーム、カレンダーを組み合わせて作ってしまおう!というものです。手軽にビジュアルでわかりやすいツールを作れますよ。
  1. 入力インターフェースとして超優秀!Googleフォームで新規タスクを入力する
  2. Googleフォームの送信があったときにイベントの予定をGoogleカレンダーに入れる
  3. Google Apps Scriptで値の変更をトリガーにしつつ変更されたセルの行番号と列番号を知る
  4. Google Apps Scriptでカレンダーのイベントタイトルを変更する方法
タイトルとURLをコピーしました