
photo credit: ucooperativadecolombia Así celebró la estructura nacional el mes del medio ambiente via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
GASでGoogleカレンダーの複数の予定をまとめて登録するツールを作成しています。
前回の記事はこちら。

日付関連の処理を関数化してスクリプトをスッキリさせる例についてお伝えしました。
さて、その関数化した関数なのですが、呼び出すときの引数が省略された場合にデフォルトの値を設定するように工夫していたんですね。
今回は、引数が省略された場合には仮引数はどうなってしまうのか、またその際の不都合を回避するためにはどうすべきかについて解説をしていきます。
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; }
スプレッドシートに入力してある予定リストをもとに、デフォルトのGoogleカレンダーにイベントを追加していくというものです。
関数createEventsがメインの関数で、その中の日付関連の共通処理を関数化して分離したものが関数addTimeになります。
引数が省略された場合の仮引数の値
さて、上記のスクリプトですが8,9行目で関数addTimeをそれぞれ呼び出していますね。
それで、その引数の数に注目をすると
- startTimeを求めるときには、引数が2つ
- endTimeを求めるときには、引数が3つ
となっています。
一方で、関数addTimeのほうは、その受け皿として仮引数はdate, time, howLongの3つがありますよね。
つまり、startTimeを求めるときには、最後の引数が省略されているわけですが、その仮引数howLongの値ってどうなっちゃってるんですかね?
引数が省略されたら仮引数はundefinedに
試しに、28行目の前に以下のステートメントを挿入して試してみましょう。
Logger.log(howLong);
そうすると、以下のようにログ出力がされます。
そうなんです、GAS(というかJavaScript)では、関数呼び出しのときに引数を与えられていない仮引数の値は「undefined」になるのです。
undefinedというのは「未定義」を表す特殊な値です。
引数のデフォルト値を設定する
このままにしておくと、関数addTime内の以降のgetHoursメソッドなどでエラーを起こしてしまうので、引数が省略されたときにデフォルト値を設定しておくと良いということになります。
その部分が、以下のif文の処理ということですね。
if(!howLong) { howLong = new Date(0,0,0,0,0,0); }
このif文のように、変数自体をif文の条件式に指定した場合は、その変数の値が真偽値に型変換されます。
そして、Dateオブジェクトであればnullまたはundefinedでない限りはtrueの判定になります。
一方で、undefinedはfalseになりますから、その場合にif文の処理が実行され、「0」を表すDateオブジェクトが生成されてhowLongにセットされるということになります。
なぜ引数で与えずにデフォルト値の処理を入れるか
なお、そもそも関数addTimeへの第3引数を省略せずに「new Date(0,0,0,0,0,0)」を指定する方法もあります。
ですが、多くの場合、指定すべき引数の数は減らせたほうが良いはずです。
例えば、関数addTimeを第3引数を「new Date(0,0,0,0,0,0)」で何回も使用することがあるとしたら、都度指定するのはどう考えても面倒ですもんね。
まとめ
以上、Google Apps Scriptで関数の引数を省略した場合の挙動とデフォルト値の設定方法についてお伝えしました。
GAS(というかJavaScript)では、関数の引数は省略できること、また省略した場合の仮引数はundefinedになるということですね。
さて、デフォルト値を指定するif文ですが、実はさらにスマートに記述することができます。
次回、それについて解説をしていきますね。
どうぞお楽しみに!