Googleフォームの送信があったときにイベントの予定をGoogleカレンダーに入れる


calendar

photo credit: wiccked mjc-2014-11-05-IMG_9211 via photopin (license)

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

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

前回はこちらの記事。

入力インターフェースとして超優秀!Googleフォームで新規タスクを入力する
チームで使えるGoogleカレンダータスク管理ツールを作っていきます。今回はタスクを追加する用のフォームの作成と編集とスプレッドシートの入力規則の設定などの下準備についてお伝えしていきます。

Googleフォームから新規タスクの入力ができるようになりました。

今回は、Google Apps Scriptを使って、Googleフォームからの送信をトリガーにGoogleカレンダーにタスクをイベントとして追加する方法をお伝えします。

では行ってみましょう!

スポンサーリンク

作成したフォームとスプレッドシートのおさらいと今回のお題

前回作ったフォームはこちらでした。

新規タスク入力用のGoogleフォーム

新規のタスクが発生したときに

  1. タスク名:記述テキスト(短文)※必須
  2. 納期(日付):日付 ※必須
  3. 納期(時刻):時刻 ※必須

を入力して送信すると、スプレッドシートに結果が蓄積されます。

そのスプレッドシートがこちらですね。

フォームで入力したタスクを蓄積するスプレッドシート

タイムスタンプは自動で入ります。タスク名、納期(日付)、納期(時刻)はフォームの設問の回答がそれぞれ入ります。

今回のお題ですが、フォームからの送信をトリガーにして以下二つを実行しますよ。

  1. タスクをイベントとしてタスク用Googleカレンダーに追加
  2. 追加したタスクのイベントID、ステータスを入力

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

新規カレンダーの作成とカレンダーIDを取得

まずはタスク管理専用のカレンダーを作成して、そのカレンダーIDをゲットしましょう。

画面の左側、「マイカレンダー」の▼マークから「新しいカレンダーの作成」をして、カレンダー名ほか必要事項を記入、そして「カレンダーを作成」。これであっという間に新しいカレンダーが完成します。

詳しくはこちらの記事もどうぞ。

スケジュールを共有しても恥ずかしくないGoogleカレンダーの使い方
Googleカレンダーですがプライベートの予定もあるし…などと共有機能を使ってないなんてことありませんか?仕事、プライベートなど複数のカレンダーと共有設定を使いこなして恥ずかしくなく共有する方法です。

今回は「タスク管理用カレンダー」という名前にしました。

では次。カレンダーIDを取得します。

画面の左側の、「タスク管理カレンダー」の▼マークから「カレンダー設定」を選択。中段より下のほうに「カレンダーのアドレス」というコーナーに

カレンダーID:XXXXXXXXXXX@group.calendar.google.com

というのがありますが、そのメアドみたいなのがカレンダーIDです。

Google Apps Scriptで使いますのでメモっておきましょう。

詳しくは以下記事もご覧ください。

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

これで準備は完了です。

スプレッドシートのタスクをイベントとしてカレンダーに追加

次にスプレッドシートに移動して、スクリプトエディタを開きます。

メニューから「ツール」→「スクリプトエディタ」でしたね。

こちらのスクリプトを作成して実行しましょう!

/* 指定月のカレンダーからイベントを取得する */
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、「未完」を入力

となります。

getValuesやsetValuesを使って、シートデータを二次元配列に格納をしてから処理をしていますが、Google Apps Scriptでは

  • 実行速度を稼げるとっても素敵な方法
  • getRange,getValue,setValueなどゴチャゴチャ書かなくて済む

というメリットがありますので、ぜひ活用下さい。以下記事にまとめています。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

createEventメソッドでカレンダーにイベントを追加

まず、先に18行目を説明します。ここが、今回の記事のキモですね。

カレンダーへのイベントの追加には、カレンダーオブジェクトに対するcreateEventメソッドを使います。

書き方は

Calendarオブジェクト.createEvent(タイトル, 開始日時, 終了日時)

です。今回の場合、タスクの期限を表現したいだけですので、開始日時=終了日時としています。

日付と時刻からDateオブジェクトを生成する

12行目~15行目ですが、イベントを追加するときに指定する日時を生成しています。

ちょっと回りくどいですが、手順としては

  1. C列の値をもとにDateオブジェクトevtDateを生成
  2. D列の値をもとにDateオブジェクトevtTimeを生成
  3. evtDateの時刻に、evtTimeの時刻をセット
  4. evtDateの分に、evtTimeの分をセット

という手順で、evtDateが欲しいDateオブジェクトになるという寸法です。

Dateオブジェクトへの各値のセットには以下メソッドを使いますので、一緒に覚えてしまいましょう。

setFullYear(値) //年
setMonth(値) //月(値は0~11(1月~12月))
setDate(値) //日
setHours(値) //時
setMinutes(値) //分
setSeconds(値) //秒

getIdでイベントIDを取得

また、カレンダーを追加した”証”として、イベントIDを取得してスプレッドシートに記入します。イベントIDが入っていれば、既に”カレンダーにタスクを追加済み”ということになるわけです。

その部分が20行目です。

イベントIDを取得する場合はイベントオブジェクトに対するgetIDメソッドを使います。

Eventオブジェクト.getId()

イベントIDは後で、タスクを完了するときにも使います。

実行結果

ではこのスクリプトを実行してみましょう。

カレンダーは

Google Apps Scriptでタスクをイベントとしてカレンダーに追加

タスクがちゃんと追加されていますね。スプレッドシートは

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

イベントIDとステータスに入力が完了しています。

それで、今回のスクリプトをイベントトリガーで「スプレッドシートから」→「フォーム送信時」に設定すれば、フォーム送信時に実行してくれますね。

まとめ

以上、Google Apps ScriptでGoogleフォームからの送信をもとにカレンダーにイベントを追加する方法についてお伝えしました。

createEventメソッドと、getIdメソッドについて、あとは細やかなテクニックがありましたので、ぜひマスター頂ければと思います。

今回はタスクをイベントとして追加しましたが、例えば、予約申し込みなど他の用途にも応用ができるものと思います。

ぜひご活用くださいね。

次回は、イベントトリガー「スプレッドシートの値の変更」と、その時に変更のあったセルの位置を知る方法です。

Google Apps Scriptで値の変更をトリガーにしつつ変更されたセルの行番号と列番号を知る
Google Apps Scriptでチームで使えるタスク管理ツールを作成中です。今回は、イベントトリガーとしてスプレッドシートの「値の変更」を設定する方法と、値の変更されたセルの位置を知る方法についてです。

どうぞお楽しみに!

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

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

タイトルとURLをコピーしました