はじめに
こちらの記事は、Part2となっております。
Part1をご覧いただいてからこちらの記事を見ていただけると
わかりやすいかと思います。
さて、前回まででゴミ出しの通知をLINEで確認することができました。
しかし、現状のままでは納得いかない通知になるかもしれません。
なのでここからは応用編ということで、もう少し機能を付け加えていきましょう。
【応用編1】第n週かで出すゴミの種類を分けて通知する
私の地域含め、毎週資源ごみの日や大型ごみの日があるわけではないですよね。
例えば、大型ごみは第4週の金曜日など。。
そのため、第n週目のm曜日が資源ごみの日などで通知が切り替わると
とても便利ですよね。
今回はそこの実装を追加していきます。
まずは下記のようなgetDays関数を用意しました。
function getDays(date, day) {
const year = date.getFullYear();
const month = date.getMonth();
const days = [];
for (let i = 1; i <= 31; i++) {
const tmpDate = new Date(year, month, i);
// 月代わりで処理終了
if (month !== tmpDate.getMonth()) break;
// 引数に指定した曜日以外の時は何もしない
if (tmpDate.getDay() !== day) continue;
days.push(tmpDate);
}
return days;
}
この関数では、まず現在の年月を取得し、該当月のすべての日をfor文で
参照し、該当月から第2引数dayに渡ってきた曜日を表す数字と、同じもの、
つまり、同じ曜日である日時情報を返しています。
例えば、第2引数dayの値が「2」である場合、該当月の中から、
火曜日の日をすべてを返しています。
ではこの関数を利用して、ゴミ出し日が火曜と金曜の場合は、
出すゴミの種類を切り替えるようにしましょう。
// 曜日の設定
var weekDayList = ["日", "月", "火", "水", "木", "金", "土"];
// 曜日毎ゴミの種類の設定
var garbageCalendar = {
"日" : "",
"月" : "可燃ごみ",
"火1" : "その他プラ",
"火" : "資源ごみ・有害ごみ",
"水" : "リサイクルプラ",
"木" : "可燃ごみ",
"金1" : "大型ごみ(予約制)",
"金" : "不燃ごみ",
"土" : "",
};
function garbageReminder() {
/*
ゴミ出しのリマインダ関数
*/
// 通知タイトルの設定
var message = "【明日のゴミ出し】\n";
// 翌日の曜日を取得
var nextDate = new Date();
nextDate.setDate(nextDate.getDate() + 1);
var nextDateNum = nextDate.getDay();
var weekDay = weekDayList[nextDateNum];
if (nextDateNum === 2 || nextDateNum === 5) {
// 翌日が火曜日か金曜日だった場合
// 第1週目、第3週目を取得
const weeks = [1, 3];
const days = getDays(nextDate, nextDateNum);
const specifiedDays = days.filter((v, i) => weeks.includes(i+1));
// 日のみを取得
for (let i = 0; i <= 1; i++){
specifiedDay = specifiedDays[i];
if (nextDate.getDate() === specifiedDay.getDate()) {
weekDay += "1";
break;
}else{
continue;
};
};
};
// ゴミの種類を取得
var garbageType = garbageCalendar[weekDay];
if (garbageType != "") {
message += "明日は「${garbageType}」の日です。\n寝る前にゴミを出さないと!".replace('${garbageType}',garbageType);
}else{
message += "明日は「ノーゴミ出しデー」です。"
};
sendToLine(message);
}
garbageCalendar配列の火曜と金曜は前回のままで2種類あります。
それぞれ1とついているほうが、第1,3週に出すゴミの種類とします。
では、コードの確認です。
今回はif文を追加したので、そちらの説明を行います。
①if (nextDateNum === 2 || nextDateNum === 5)
nextDateNumという変数には翌日の曜日を表す数字が入っていて、
これが2(火曜日)、もしくは5(金曜日)の場合、if内の処理を行います。
②const weeks = [1, 3];
garbageCalendar配列で、1とついている曜日のほうのゴミを出したい
週を指定しています。
③const days = getDays(nextDate, nextDateNum);
先ほど作成したgetDays関数を使用して、翌日と一致する曜日の日時情報を
該当月からすべて取得します。
④const specifiedDays = days.filter((v, i) => weeks.includes(i+1));
コードがややこしいのですが、③で取得した翌日と一致する曜日の日時情報に、
②で作成した配列weeksに合致する曜日をspecifiedDaysに代入しています。
⑤for (let i = 0; i <= 1; i++)内の処理
specifiedDaysには、翌日の曜日と一致する、該当月の第1,3週の日時情報が
配列で入っています。
そのため、第1週、第3週をfor文で回し、翌日と該当するほうに、
1を文字列に追加しています。
これにより、前回行ったときの、ゴミの種類を取得する処理で、
同じ曜日の中でも、第n週かによって、ゴミの種類を分けて取得することが
できるようになります。
【応用編2】グループラインで通知できるようにする
さて、先ほどまででゴミ出し通知はかなり便利な状態になってきたと思います。
応用編2では、家族やパートナーなど、同居している人とLINEグループで
共有したい場合、ただグループ追加するだけではうまく動きませんので、
うまく動かすための手順をお伝えします。
①共有したい人に作成したアカウントを友達追加してもらい、通知を行いたいグループを作成する。
②グループIDの取得
少し手間ですが、参考サイトを参考に新規GASファイルを作成してください。
チャネルアクセストークンは、作成したチャネルのチャネルアクセストークン
に書き換え、この新規ファイルをデプロイし、URLを作成したアカウントに
紐づけてください。やり方は前回の記事と同じなので参考にしてください。
紐づけができましたら、グループで適当にメッセージを送ると、
Uから始まる文字列と、Cから始まる文字列が返ってくると思いますので、
Cから始まる文字列を今回使いますので、保管しておいてください。
ちなみに、Uから始まるほうがユーザIDで、
Cから始まるほうが、グループIDとなります。
③グループIDの定義と、sendToLine関数の編集
var USER_ID_1 = ‘U*********’
上記のように、コードの上のほうにグループIDを定義してください。
次に、sendToLine関数の中で、変数urlとdataの中を下記のように変更してください。
var url ='https://api.line.me/v2/bot/message/push'; // 変更
var data = {
'to': GROUP_ID, // 変更
'messages' : [{
'type' : 'text',
'text' : message
}]
};
④再デプロイしてwebhookのURLをゴミ出しのGASに修正
上記手順でグループでのゴミ出し通知が可能となります。
次ににトリガーを出したいタイミングなどを設定して、再デプロイを
してください。(デプロイしなくても反映されますが念のため)
そしてURLを貼りなおすと、ゴミ出し通知を行ってくれるBotの完成です。
最後に
さて、いかがでしたでしょうか。
開発をしながら記事を書いたのでコードが汚かったり、
文章がわかりずらかったかもしれません。
が、しかしなかなか便利なLINEチャットボットができたのではないでしょうか?
今後は通知するものを画像にしてみたり、ゴミ出ししたかの確認要素など、
機能を追加してみようと思います。その際はまたこちらに記事を