![operators](https://tonari-it.com/wp-content/uploads/operators.jpg)
photo credit: PhilWolff vlcsnap-2018-04-03-20h55m00s811 via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
GASでGoogleカレンダーの予定をまとめて登録するツールを作成しています。
前回の記事はこちら。
![](https://tonari-it.com/wp-content/uploads/reduce-160x90.jpg)
日付関連の処理を関数化したのですが、その引数を省略した際の挙動とデフォルト値の設定について解説をしました。
それで、その引数が渡されているかの判定をしてデフォルト値を設定する処理に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 を返します。 |
「論理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で論理演算子「||」を使って条件分岐の省略をつつ変数に値を代入する方法をお伝えしました。
論理演算子…奥が深いですね!
その意味をちゃんと理解しておくと、コードをオシャレに書くことができるというわけです。
ちなみに、本記事は以下の記事をたいへん参考にさせていただきまいた。ありがとうございます!
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9SmF2YVNjcmlwdCVFMyU4MSVBRSVFMyU4MCU4QyUyNiUyNiVFMyU4MCU4RCVFMyU4MCU4QyU3QyU3QyVFMyU4MCU4RCVFMyU4MSVBQiVFMyU4MSVBNCVFMyU4MSU4NCVFMyU4MSVBNiVFNyU5QiU5QiVFNSVBNCVBNyVFMyU4MSVBQiVFNSU4QiU5OCVFOSU4MSU5NSVFMyU4MSU4NCVFMyU4MiU5MiVFMyU4MSU5NyVFMyU4MSVBNiVFMyU4MSU4NCVFMyU4MSU5RiVFNCVCQiVCNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OWM4NjBmODVhZjkzZGVlYjA2OWRkMWYxM2Q4MmEzODQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBJbWFtb3R0eSZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9YjllZmM3OTgyYjI2OWVjZjFiMDI2ZDQ3MjlmMjYwMzc&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4g5qCq5byP5Lya56S-44Op44Kv44K5&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%23212121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=63ca623447db96362d4b6c00c67a88ff)
これで、イベントを追加する一連のシリーズは終了です。
また、別の便利なツールを紹介していきますね。
どうぞお楽しみに!