Gasでゴミ出し通知のアレコレ
何ヶ月も放置してたマメBOTのゴミ出し通知バグ…
去年の8月くらいに作ってたLINEのBOTの改良話です^p^
一年たった今では結局ほとんど自分の掃除リマインダーになりましたが父親の錯乱頻度は以前に比べて減ってる気がしているので俺は満足です。家族みんなが心穏やかに暮らせるならそれでええんや。あとはご飯関係の錯乱か…早く丸くなってくれないかな。中華と家庭菜園攻めきつい( ˘ω˘ )笑
BOTはゴミ出し周りをこれ以降もちょいちょい弄ってたんですが、最終週の挙動だけずっと変だったんですよね。5週目があると収集ない時にもわんわん言っちゃってて。おのれ第5週め!
で「もう頭使いたくネ」ってなったのでやる気出るまで放置してたんですが、ふらっと調べてみたらなんと!
第n週の計算式の情報が結構たくさん出てるじゃーあないですか!!なぜ作った時に色々見つけられなかったのか(
ということで向き合ってきました。採用技術の大元の記事は↓
特定の月の特定の曜日を取得する
https://
我が家のマメBOTとはいささか記述の相性が悪かったのでちょっと改変しつつ組み込み
const holiday = ["12/30","12/31","01/01","01/02","01/03"];//年末年始などの例外日を指定
const tomorrow_dates = new Date() + 1;//明日の日付全般の情報を取得
const tomorrow_year = tomorrow_dates.getFullYear();//明日が属する年
const tomorrow_month = tomorrow_dates.getMonth() + 1;//明日が属する月(取得した月は0始まりらしいので+1)
const tomorrow_date = tomorrow_dates.getDate();//明日の日付
const tomorrow_day_num = tomorrow_dates.getDay();//明日の曜日番号(0が日曜)
const tomorrow_week = Math.ceil((tomorrow_dates - day_num + 6) / 7);//よく紹介されてるMath.floorと+7のやつだと第5週も第4週としてカウントされてたのでこっちで…
const tomorrow = Utilities.formatDate(tomorrow_dates, 'Asia/Tokyo', 'MM/dd');//明日の月と日を00/00形式へフォーマット
const push_days = [];//n曜日格納用配列
function pushTomorrowDays(days){//明日が属する月のn曜日一覧取得の関数
for (let i = 1; i <= 31; i++) {
const tmpDate = new Date(tomorrow_year, tomorrow_month, i);
if (tomorrow_month !== tmpDate.getMonth()) break;
if (tomorrow_day_num !== days) continue;
push_days.push(Utilities.formatDate(tmpDate, 'Asia/Tokyo', 'MM/dd'));
}
};
function notice_cans_and_wastePaper(){//ビンカンか古紙かを判定して実行
if (!holiday.includes(tomorrow)){//明日がholidayに含まれていなければ発動
pushTomorrowDays(4);//push_daysに明日が属する月の木曜日だけ格納
switch (tomorrow_week) {
case 1:
case 3:
if (push_days[(1||3)] === tomorrow) {//第一木曜か第三木曜ならビンカン通知
pushMessage(noticeMess[3]);//ここはお好きな処理へ変更
}
break;
case 2:
case 4:
if (push_days[(2||4)] === tomorrow) {//第二木曜か第四木曜なら古紙通知
pushMessage(noticeMess[4]);//ここはお好きな処理へ変更
}
break;
default:
break;
}
}
}
上手く動いてくれるといいなぁ〜
21/07/30:全然上手くいってなかった
普通にnewDateのとこ間違えてた((
setDate(hoge.getDate+1)の式を参考にしようとしたんだけど、それだと月末とか年末は月と年が翌日とずれちゃわない…?てなってわけわかんないことしてた。MDNちゃんと読もうね
const dates = new Date();//日付全般を取得(他のとこで現在時刻も扱ってるから…)
const tomorrow_dates = new Date();
tomorrow_dates.setDate(dates.getDate() + 1);//明日の日付全般を取得?
こっちには月と年はそのままとか書いてあるけど、これとかこれとかMDN見た感じではsetDateしておけば更新してくれてそうな言い回しだからとりあえずこれで様子見てみよか…多分正しく動く、はず。いつになったら完全に理解できるんだか^p^!
const tomorrow_dates = new Date(tomorrow_dates.setDate(dates.getDate() + 1));//明日の日付全般を取得?
余談ですがnewDateしてあれば良さそうだからこっちで行けたらもっとスッキリしてていいな〜て思たけど、やっぱり入れ子になってるとダメぽい。()まで読み切らないとnewDateされないから「いやsetするDateどこよ…」てなるってことですよね…まずはnewDate。PCの気持ちになれば至極当たり前なんだけど人間だからすぐ忘れちゃう。覚えておこ〜。