みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
チームで使えるタスク管理ツールをスプレッドシート、Googleフォーム、Googleカレンダーで作成しています。
前回はこちらの記事。
Googleフォームから新規タスクの入力ができるようになりました。
今回は、Google Apps Scriptを使って、Googleフォームからの送信をトリガーにGoogleカレンダーにタスクをイベントとして追加する方法をお伝えします。
では行ってみましょう!
作成したフォームとスプレッドシートのおさらいと今回のお題
前回作ったフォームはこちらでした。
新規のタスクが発生したときに
- タスク名:記述テキスト(短文)※必須
- 納期(日付):日付 ※必須
- 納期(時刻):時刻 ※必須
を入力して送信すると、スプレッドシートに結果が蓄積されます。
そのスプレッドシートがこちらですね。
タイムスタンプは自動で入ります。タスク名、納期(日付)、納期(時刻)はフォームの設問の回答がそれぞれ入ります。
今回のお題ですが、フォームからの送信をトリガーにして以下二つを実行しますよ。
- タスクをイベントとしてタスク用Googleカレンダーに追加
- 追加したタスクのイベントID、ステータスを入力
では、行ってみましょう!
新規カレンダーの作成とカレンダーIDを取得
まずはタスク管理専用のカレンダーを作成して、そのカレンダーIDをゲットしましょう。
画面の左側、「マイカレンダー」の▼マークから「新しいカレンダーの作成」をして、カレンダー名ほか必要事項を記入、そして「カレンダーを作成」。これであっという間に新しいカレンダーが完成します。
詳しくはこちらの記事もどうぞ。
今回は「タスク管理用カレンダー」という名前にしました。
では次。カレンダーIDを取得します。
画面の左側の、「タスク管理カレンダー」の▼マークから「カレンダー設定」を選択。中段より下のほうに「カレンダーのアドレス」というコーナーに
というのがありますが、そのメアドみたいなのがカレンダーIDです。
Google Apps Scriptで使いますのでメモっておきましょう。
詳しくは以下記事もご覧ください。
これで準備は完了です。
スプレッドシートのタスクをイベントとしてカレンダーに追加
次にスプレッドシートに移動して、スクリプトエディタを開きます。
メニューから「ツール」→「スクリプトエディタ」でしたね。
こちらのスクリプトを作成して実行しましょう!
/* 指定月のカレンダーからイベントを取得する */ function addTaskEvents() { var myCal = CalendarApp.getCalendarById('xxxxxxxxxxxxxxxxxx@group.calendar.google.com'); //カレンダーIDでカレンダーを取得 var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得 var dat = mySheet.getDataRange().getValues(); //シートデータを取得 for(var i=1;i<dat.length;i++){ if(dat[i][4] == ""){ /* 日時をセット */ var evtDate = new Date(dat[i][2]); var evtTime = new Date(dat[i][3]); evtDate.setHours(evtTime.getHours()); evtDate.setMinutes(evtTime.getMinutes()); /* イベントの追加・スプレッドシートへの入力 */ var myEvt = myCal.createEvent(dat[i][1],evtDate,evtDate); //カレンダーにタスクをイベントとして追加 dat[i][4]=myEvt.getId(); //イベントIDを入力 dat[i][5]='未完'; } } mySheet.getRange(1,1,i,6).setValues(dat); //データをシートに出力 }
大まかなアルゴリズムとしては
- データの2行目から最終行まで繰り返し
- イベントIDが空欄であれば
- カレンダーへイベントを追加
- スプレッドシートにイベントID、「未完」を入力
- イベントIDが空欄であれば
となります。
getValuesやsetValuesを使って、シートデータを二次元配列に格納をしてから処理をしていますが、Google Apps Scriptでは
- 実行速度を稼げるとっても素敵な方法
- getRange,getValue,setValueなどゴチャゴチャ書かなくて済む
というメリットがありますので、ぜひ活用下さい。以下記事にまとめています。
createEventメソッドでカレンダーにイベントを追加
まず、先に18行目を説明します。ここが、今回の記事のキモですね。
カレンダーへのイベントの追加には、カレンダーオブジェクトに対するcreateEventメソッドを使います。
書き方は
です。今回の場合、タスクの期限を表現したいだけですので、開始日時=終了日時としています。
日付と時刻からDateオブジェクトを生成する
12行目~15行目ですが、イベントを追加するときに指定する日時を生成しています。
ちょっと回りくどいですが、手順としては
- C列の値をもとにDateオブジェクトevtDateを生成
- D列の値をもとにDateオブジェクトevtTimeを生成
- evtDateの時刻に、evtTimeの時刻をセット
- evtDateの分に、evtTimeの分をセット
という手順で、evtDateが欲しいDateオブジェクトになるという寸法です。
Dateオブジェクトへの各値のセットには以下メソッドを使いますので、一緒に覚えてしまいましょう。
setMonth(値) //月(値は0~11(1月~12月))
setDate(値) //日
setHours(値) //時
setMinutes(値) //分
setSeconds(値) //秒
getIdでイベントIDを取得
また、カレンダーを追加した”証”として、イベントIDを取得してスプレッドシートに記入します。イベントIDが入っていれば、既に”カレンダーにタスクを追加済み”ということになるわけです。
その部分が20行目です。
イベントIDを取得する場合はイベントオブジェクトに対するgetIDメソッドを使います。
イベントIDは後で、タスクを完了するときにも使います。
実行結果
ではこのスクリプトを実行してみましょう。
カレンダーは
タスクがちゃんと追加されていますね。スプレッドシートは
イベントIDとステータスに入力が完了しています。
それで、今回のスクリプトをイベントトリガーで「スプレッドシートから」→「フォーム送信時」に設定すれば、フォーム送信時に実行してくれますね。
まとめ
以上、Google Apps ScriptでGoogleフォームからの送信をもとにカレンダーにイベントを追加する方法についてお伝えしました。
createEventメソッドと、getIdメソッドについて、あとは細やかなテクニックがありましたので、ぜひマスター頂ければと思います。
今回はタスクをイベントとして追加しましたが、例えば、予約申し込みなど他の用途にも応用ができるものと思います。
ぜひご活用くださいね。
次回は、イベントトリガー「スプレッドシートの値の変更」と、その時に変更のあったセルの位置を知る方法です。
どうぞお楽しみに!