みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
このシリーズでは初心者のノンプログラマー向けに「Google Apps Scriptを使ってゴミ出しLINE Botをつくる」をお題として連載を進めております。
前回の記事はこちら。
GASでつくるゴミ出しLINE Botの「本体」のスクリプトを紹介しました。
ただ、コード内で呼び出している一部の自作関数については、まだ触れていませんでしたね。
今回はその部分を解説して、ゴミ出しLINE Botの完成としましょう。
ということで、【初心者向け】GASで日付から何のゴミの日かを調べる関数のつくり方をお伝えします。
では、行ってみましょう!
前回のおさらい
前回紹介したスクリプトがこちらになります。
function notyfyTakingOutTrash() {
const url = 'https://api.line.me/v2/bot/message/push';
const token = '**********'; //「ゴミ出し通知くん」のチャネルアクセストークン
const message = getMessageAboutTrash_(new Date());
if (!message) return;
const payload = {
to: '*****', //ユーザーID
messages: [
{ type: 'text', text: message }
]
};
const params = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + token
},
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(url, params);
}
シリーズの前半で作成した「Hello Bot」のスクリプトの一部を修正することで、本体部分は完成させることができるんでしたね。
ただ、5行目にあるメッセージを生成する「getMessageAboutTrash_関数」については、その中身が謎のベールに包まれたままでした。
今回は、その残りの部分を解説していきます。
今日が何のゴミの日か返す関数
getMessageAboutTrash_関数は、日付からその日が何のゴミの日か判定して、それに応じてメッセージを返す関数です。
上記スクリプトでは、「new Date()」つまり今日の日付を表すDateオブジェクトが引数として渡されていましたね。
なので、当日の日付から「本日は●曜日!☓☓ゴミの日ですよ~」というメッセージを返すということになります。
実際の関数の中身はこちらになります。
function getMessageAboutTrash_(date) {
const weekOfMonth = getWeekOfMonth_(date);
const dayOfWeekString = getDayOfWeekString_(date);
if (['月曜日', '水曜日', '金曜日'].includes(dayOfWeekString)) return `本日は${dayOfWeekString}!燃えるゴミの日ですよ~`;
if (dayOfWeekString === '火曜日') return `本日は${dayOfWeekString}!資源ゴミの日ですよ~`;
if (dayOfWeekString === '木曜日' && weekOfMonth % 2 === 0) return `本日は${dayOfWeekString}!燃えないゴミの日ですよ~`;
}
日付をDateオブジェクトとして受け取って、今回の場合は以下のような判定を行いメッセージを返しています。
- 月曜日、火曜日、金曜日のいずれか: 「本日は●曜日!燃えるゴミの日ですよ~」
- 火曜日: 「本日は火曜日!資源ゴミの日ですよ~」
- 2の倍数回目の木曜日: 「本日は木曜日!燃えないゴミの日ですよ~」
- それ以外: 何も返さない、つまりundefined
プライベート関数とは
まず、関数名の最後にアンダースコア記号「_」が付与すると、その関数はプライベート関数となります。
プライベート関数というのは、プロジェクトの外からは呼び出せない関数のことで、スクリプトエディタのプルダウンに表示されなくなります。
トリガーで設定することも、スクリプトエディタのプルダウンに表示することもしないのであれば、プライベート関数にしておくとよいです。
そうすれば間違えて選択してしまうこともないですからね。
曜日が何回目かを調べる
2行目のgetWeekOfMonth_関数は、Dateオブジェクトとして与えられた日付dateの曜日が、その次で何回目のその曜日なのかを調べる関数です。
その内容はこちらです。
function getWeekOfMonth_(date) {
return Math.floor((date.getDate() - 1) / 7) + 1;
}
getDateメソッドは、Dateオブジェクトの「日」を返す関数ですね。
計算式がちょっとややこしいかも知れませんが、以下のように場合分けで考えれば良いです。
- 1~7: 1
- 8~14: 2
- 15~21: 3
- 22~28: 4
- 29~31: 5
日が7以下であれば、そこから1を引いて7で割った数は1未満ですから、floorメソッドで小数点以下を切り捨てれば常に0になります。それに1を足すことで、つまり1回目となるわけです。
日が8から14の間であれば、そこから1を引いて7で割った数は1以上2未満ですよね。以下同様に考えればOKです。
曜日の日本語表記を取得する
つづいて、3行目のgetDayOfWeekString_関数は、曜日の日本語表記を取得する関数で、以下になります。
function getDayOfWeekString_(date) {
const dayOfWeeks = ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'];
const dayOfWeek = date.getDay();
return dayOfWeeks[dayOfWeek];
}
3行目のgetDayメソッドは、Dateオブジェクトの「曜日」を0から6の整数で返す関数です。
日曜日であれば0、以降順番に整数を返します。
つまり、その整数をインデックスとして配列dayOfWeeksの要素を取り出せば、該当の曜日の日本語表記文字列を取得できるというわけです。
まとめ
以上、【初心者向け】GASで日付から何のゴミの日かを調べる関数のつくり方についてお伝えしました。
最後に、GASでつくるゴミ出しLINE Botのコードをまとめておきますね。
function notyfyTakingOutTrash() {
const url = 'https://api.line.me/v2/bot/message/push';
const token = '**********'; //「ゴミ出し通知くん」のチャネルアクセストークン
const message = getMessageAboutTrash_(new Date());
if (!message) return;
const payload = {
to: '*****', //ユーザーID
messages: [
{ type: 'text', text: message }
]
};
const params = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + token
},
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(url, params);
}
function getMessageAboutTrash_(date) {
const weekOfMonth = getWeekOfMonth_(date);
const dayOfWeekString = getDayOfWeekString_(date);
if (['月曜日', '水曜日', '金曜日'].includes(dayOfWeekString)) return `本日は${dayOfWeekString}!燃えるゴミの日ですよ~`;
if (dayOfWeekString === '火曜日') return `本日は${dayOfWeekString}!資源ゴミの日ですよ~`;
if (dayOfWeekString === '木曜日' && weekOfMonth % 2 === 0) return `本日は${dayOfWeekString}!燃えないゴミの日ですよ~`;
}
function getWeekOfMonth_(date) {
return Math.floor((date.getDate() - 1) / 7) + 1;
}
function getDayOfWeekString_(date) {
const dayOfWeeks = ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'];
const dayOfWeek = date.getDay();
return dayOfWeeks[dayOfWeek];
}
このnotyfyTakingOutTrash関数を、時限式のトリガーとして設置して、毎日動作するようにすればよいですね。
トリガーについては以下の記事をご参考ください。
以上、ゴミ出しLINE Botについてそのつくり方をお伝えしてきました。
ぜひご活用くださいね。
連載目次:【初心者向け】GASでゴミ出しLINE Botをつくる
われわれ日本人がもっとも使っているといってもいいアプリ「LINE」。Google Apps Scriptを使うと、LINEを使ったツールをつくりこともできます。このシリーズでは、初心者向けに「ゴミ出しLINE Bot」のつくりかたをお伝えしていきます!- GASでLINEにメッセージを送るためのMessage APIの超初心者向け基礎知識
- 初心者向けLINE Developersコンソールとそれにログインする方法
- 【初心者向け】GASでゴミ出しLINE Botをつくるための「チャネル」とその作成
- 初心者向けLINE Botの友だち登録とユーザーID・アクセストークンの取得
- 初心者向けGASを使ってLINEではじめてのプッシュメッセージを送るスクリプト
- 初心者向けGASでLINEにプッシュメッセージを送るスクリプトを徹底解説
- 初心者向けGASでつくるゴミ出しLINE Bot用のチャネル作成と準備
- 初心者向けGASでつくるゴミ出しLINE Botの本体部分のスクリプト
- 【初心者向け】GASで日付から何のゴミの日かを調べる関数のつくり方 for ゴミ出しLINE Bot