Google Apps ScriptでDateオブジェクトの複製や時刻のセットで注意すること


date

photo credit: themostinept 22nd January 2017 via photopin (license)

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

GASでGoogleカレンダーに複数の予定を簡単に登録できるツールを作成しています。

前回の記事はこちら。

GASでスプレッドシートの入力からGoogleカレンダーに複数のイベントを追加
GASでGoogleカレンダーに複数の予定をまとめて追加するスクリプトを作成する方法をお伝えしています。今回は、スプレッドシートの値を二次元配列で取得して、複数のイベントを追加するスクリプトを作成します。

スプレッドシートの情報をもとに、カレンダーにイベントを複数追加するスクリプトを作成しました。

…え、まだ何かやることあるの?

というふうに思われるかもしれませんが、イベントのデータの準備をもっと楽にできるんです。

ただ、それに伴って、ちょっとDateオブジェクトの使い方を気にする必要があります。

ということで、今回はGoogle Apps ScriptでDateオブジェクトの複製や時刻のセットで注意することについてお伝えします。

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

前回のおさらい

前回作成したスクリプトはこちらです。

バインドしているスプレッドシートのアクティブシートのイベントをカレンダーにまとめて追加することができます。

それで、そのスプレッドシートがこちらでした。

カレンダーに追加するデータをスプレッドシートに入力

日時と開始時間、期間を入力データとしたい

で、作ってみてちょっと思うことがあるんですね。

B列の開始時間と、C列の終了時間。

年、月、日、時、分を同じセルに入力しなければいけません。

…ちょっと面倒ですよね?

それで、例えば以下のようなスプレッドシートのほうが入力しやすいと思うのです。

スプレッドシートの構成を変更
日付と開始時間、そして期間が決まれば、終了時間も決まりますもんね。

日付と開始時間、期間からカレンダーイベントを追加するスクリプト

それで、変更後のスプレッドシートに合わせてスクリプトも変更しました。

こちらです。

…んー、ちょっと複雑ですかね。

でも、大丈夫。解説していきます。

ポイントはDateオブジェクトですね。

オブジェクトを複製したいならnewしよう

まず、7~9行目が、開始時間を生成している部分、11~13行目が終了時間を生成する部分です。

それぞれ、newキーワードで新たなDateオブジェクトを生成して変数startTimeとendTimeにセットしています。

この部分、newキーワードを使わずに、うっかり以下のようにしたくなりますが…

これで実行すると、実はstartTimeがendTimeと同じ日時にセットされちゃいます。さらに言うと、values[i][1]も同じ日時にセットされちゃいます。

Dateオブジェクトをはじめ、オブジェクトを変数にセットした場合、そのオブジェクトへの参照を変数にセットすることになります。

物理的にメモリの別の場所にオブジェクトを複製するのではなくて、同じオブジェクトを表すことになっちゃうんですね。

ですから、values[i][1]、startTime、endTimeはいずれも同じDateオブジェクトを参照することになっているのです。

なので、物理的に別のDateオブジェクトを生成したいのであれば、ちゃんとnewキーワードを使って生成しないと駄目なんです。

別のDateオブジェクトの時、分をセットする

Dateオブジェクトの時間や分を変更したいのであれば、setHoursメソッド、setMinutesメソッドを使って、時や分を数値で指定してあげます。

Dateオブジェクト.setHours(時間)
Dateオブジェクト.setMinutes(分)

それで、別のDateオブジェクトの時間や分を参照してセットしたいのであれば、スクリプト内にあるように、以下のようにすることになります。

Dateオブジェクト.setHours(Dateオブジェクト2.getHours())
Dateオブジェクト.setMinutes(Dateオブジェクト2.getMinutes())

getHoursメソッドやgetMinutesメソッドはDateオブジェクトの時間や分を数値で取得するメソッドです。

スクリプトの12,13行目では、開始時間と期間の両方から時間、分を取得してそれぞれ加算したものを、endTimeにセットしていますね。

ちょっと回りくどいですが、GASの時刻の取り扱いではこのような使い方は比較的使いますので、マスターください。

今回は、秒単位でスプレッドシートのデータを準備することを想定していませんが、万が一秒単位が必要であれば、setSecondsメソッド、getSecondsメソッドも使用する必要があります。

まとめ

以上、Google Apps ScriptでDateオブジェクトの複製や時刻のセットで注意することについてお伝えしました。

カレンダー以外にも、スプレッドシートやフォームなどで日時の取り扱いは比較的起こりえます。

GASのDateオブジェクトの取り扱いでは、複製をしたいとき、時刻をセットしたいときに、若干のコツがいりますのでつかんでおくと良いですね。

次回は、今回作成した処理を関数化してみたいと思います。

Google Apps Scriptで日付関連の処理を関数化する例とその際のポイント
GASでGoogleカレンダーにまとめてイベントを登録できるツールを作成しています。今回は、Google Apps Scriptで日付関連の処理を関数化する例とそのポイントについて解説をしていきます。

どうぞお楽しみに!

連載目次:GASでカレンダーイベントをまとめて追加するツールを作る

Googleカレンダー便利ですよね!ただ、複数のイベントをいくつも追加しなければいけないとき…少し面倒です。そんなときのための便利ツールとして、スプレッドシートの入力情報をもとにカレンダーイベントをまとめて追加するツールを作成していきます。
  1. GASでデフォルトのGoogleカレンダーにイベントを追加する簡単なスクリプト
  2. GASでスプレッドシートの入力からGoogleカレンダーに複数のイベントを追加
  3. Google Apps ScriptでDateオブジェクトの複製や時刻のセットで注意すること
  4. Google Apps Scriptで日付関連の処理を関数化する例とその際のポイント
  5. Google Apps Scriptで関数の引数を省略した場合の挙動とデフォルト値の設定方法
  6. GASで論理演算子「||」を使って条件分岐の省略をしつつ変数に値を代入する方法

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

コメント