こんな事がありました
他の人が書いたGoogleAppsScriptのコードを見ていて(と書くことによって「私じゃないよ!」を強調したい下心が見えますね)、Dateオブジェクトを渡すとその1週間後(7日後)が日本の祝日かどうかを判定する関数 isHolidayNextWeek()
がありました。
こんな感じで使われていました。
function main() {
const date = new Date("2023-10-02") // 翌週の 2023-10-09 は スポーツの日です
if(isHolidayNextWeek(date)){
console.log(`${Utilities.formatDate(date,"JST","yyyy-MM-dd")} の1週間後は祝日です`)
}
}
function isHolidayNextWeek(date) {
const nextWeekMonday = new Date(date.setDate(date.getDate() + 7));
const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
const count = calendar.getEventsForDay(nextWeekMonday).length;
if (count) return true
return false
}
↓ main()
の実行結果がこちら
2023-10-09 の1週間後は祝日です
…え。こちらの想定としては
2023-10-02 の1週間後は祝日です
でした。
これが参照渡しってやつか!!
JavaScript における「値渡し」「参照渡し」の説明は別のところで調べてもらうとして
- プリミティブは値渡し
- オブジェクトは参照渡し
のようです。
(2023-05-03追記: 正確には「JavaScriptには参照渡しは存在しない」ようです。私は「参照値という値渡し」という表現がピンと来ました。参照先)
今回の date
は オブジェクト(Dateクラスのインスタンス?) なので main()
の中の date と isHolidayNextWeek()
の中のdate は 「同じものを参照している」ということ、、、なんだろうな。
function isHolidayNextWeek(date) {
const nextWeekMonday = new Date(date.setDate(date.getDate() + 7)); // dateにsetしちゃダメ!
...
ここが date.setDate()
なので、dateにsetしちゃってるのよね。だから main()
の中のdateも7日後になっちゃってる、と。
これ、頭ではわかっててもうっかりやっちゃいそう。。。
こうすればいいよね
const nextWeekMonday = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 7);
dateオブジェクトは変更しないで、dateから取得した値によって new Date()
する、と。
これ、気をつけないと「A関数からB関数にオブジェクトを渡して、B関数の中でオブジェクトを変更しちゃうと、その変更にA関数からは気づけない」みたいなことになりますよね。