GASで論理演算子「||」を使って条件分岐の省略をしつつ変数に値を代入する方法


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

GASでGoogleカレンダーの予定をまとめて登録するツールを作成しています。

前回の記事はこちら。

Google Apps Scriptで関数の引数を省略した場合の挙動とデフォルト値の設定方法
GASでGoogleカレンダーの複数の予定をまとめて登録するツールを作成しています。今回は、Google Apps Scriptで関数の引数を省略した場合の挙動とデフォルト値の設定方法についてです。

日付関連の処理を関数化したのですが、その引数を省略した際の挙動とデフォルト値の設定について解説をしました。

それで、その引数が渡されているかの判定をしてデフォルト値を設定する処理にif文を使っていたのですが、そのif文を省略してオシャレに書いちゃおうと思います。

ということで、今回は、Google Apps Scriptで論理演算子「||」を使って条件分岐の省略をつつ変数に値を代入する方法です。

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

スポンサーリンク

前回のおさらい

前回のスクリプトはこちらです。

function createEvents() {
  var calendar = CalendarApp.getDefaultCalendar();
  var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();

  for(var i = 1; i < values.length; i++){
    var title = values[i][0];

    var startTime = addTime(new Date(values[i][1]), values[i][2]);
    var endTime = addTime(new Date(values[i][1]), startTime, values[i][3]);

    var option = {
      description: values[i][3],
      location: values[i][4]
    }
    calendar.createEvent(title, startTime, endTime, option);    
  }
}

/*
 * 日付のみのDateオブジェクトに与えられた時刻をセットしさらに時刻の加算をする
 *
 * @param {Date} 日付を表すDateオブジェクト
 * @param {Date} 時刻を表すDateオブジェクト
 * @param {Date} 加算する時刻を表すDateオブジェクト、デフォルトはnew Date(0,0,0,0,0,0);
 * @return {Date} 日付をベースに、時刻をセットし、加算する時刻を加算したDateオブジェクト
 */
function addTime(date, time, howLong){
  if(!howLong) {
    howLong = new Date(0,0,0,0,0,0);
  }
  date.setHours(time.getHours() + howLong.getHours());
  date.setMinutes(time.getMinutes() + howLong.getMinutes());
  return date;
}

関数createEventsから呼び出される関数addTimeですが、引数が2つの場合と3つの場合があります。

引数が2つの場合は、関数addTimeでは仮引数の値がundefindになってしまいます。

ですから、undefindかどうかを判定して、もしそうなら以降の処理に支障をきたさないように、デフォルト値を設定するというのが28~30行目の処理になります。

ただ、この部分。

if文を省略してオシャレに書くことができるんです。

論理演算子「||」を使って仮引数の判定をするスクリプト

結論から言うと、関数addTimeは以下のように記述することができます。

/*
 * 日付のみのDateオブジェクトに与えられた時刻をセットしさらに時刻の加算をする
 *
 * @param {Date} 日付を表すDateオブジェクト
 * @param {Date} 時刻を表すDateオブジェクト
 * @param {Date} 加算する時刻を表すDateオブジェクト、デフォルトはnew Date(0,0,0,0,0,0);
 * @return {Date} 日付をベースに、時刻をセットし、加算する時刻を加算したDateオブジェクト
 */
function addTime(date, time, howLong){
  howLong = howLong || new Date(0,0,0,0,0,0);
  date.setHours(time.getHours() + howLong.getHours());
  date.setMinutes(time.getMinutes() + howLong.getMinutes());
  return date;
}

if文の代わりに、論理演算子を使ったコチラのステートメントが挿入されています。

howLong = howLong || new Date(0,0,0,0,0,0);

…論理演算子「||」…?

こんな使い方、あんまり見たことないですよね。私もそうでした。

論理演算子の本来の意味

本来、論理演算子「||」は、if文などの条件式内で「または」という意味で使っていました。

しかし、それが真偽値ではないデータに用いたらどうなるのか…?

それを明らかにするために、HTMLやJavaScriptなどのウェブ標準についてまとめられているMDNで、各論理演算子の定義を確認してみましょう。

以下のように記載されています。

演算子 使用法 説明
論理AND (&&) expr1 && expr2 expr1 を false と見ることができる場合は、expr1 を返します。そうでない場合は、expr2 を返します。
論理OR (||) expr1 || expr2 expr1 を true と見ることができる場合は、expr1 を返します。そうでない場合は、expr2 を返します。
論理 NOT (!) !expr 単一の演算対象が true と見ることができる場合は、false を返します。そうでない場合は、true を返します。

引用: 論理演算子 - JavaScript | MDN

「論理OR(||)」の説明を見てくださいね。

JavaScriptの場合、全てのデータ型について真偽値への暗黙の型変換がなされます。

ですから、今回のスクリプトの例ですと変数howLongがtrueとみなされれば、howLongにはその値がそのまま採用されますし、falseとみなされればnew Date(0,0,0,0,0,0)が適用されるということになります。

論理演算子「||」を使った変数への代入

つまり、以下のように書いた場合は、変数がtureとみなされれば変数の値がそのまま、変数がfalseとみなされれば値が変数に代入されるということになります。

変数 = 変数 || 値

なお、変数がfalseとみなされるケースにはundefindを含めて以下のような値になります。

  • 0
  • NaN
  • 空文字
  • false
  • null
  • undefind

したがって、変数に何かおそらく有効な値が入っているかどうかを判定して、そうでない場合はデフォルト値を設定したい、そのようなときには論理演算子「||」を使うチャンスということになります。

まとめ

以上、Google Apps Scriptで論理演算子「||」を使って条件分岐の省略をつつ変数に値を代入する方法をお伝えしました。

論理演算子…奥が深いですね!

その意味をちゃんと理解しておくと、コードをオシャレに書くことができるというわけです。

ちなみに、本記事は以下の記事をたいへん参考にさせていただきまいた。ありがとうございます!

JavaScriptの「&&」「||」について盛大に勘違いをしていた件 - Qiita
論理演算子「&&」「||」についてJavaScriptの基本である論理演算子の && || について、根本的に勘違いをしていたことに最近気付いたので自戒の意味を込めてここに記します。論理演算子…

これで、イベントを追加する一連のシリーズは終了です。

また、別の便利なツールを紹介していきますね。

どうぞお楽しみに!

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

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

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