GoogleAppsScript
gas
Line
LineNotify

[LINE×GAS]シェアハウスのゴミ当番を潤滑に回した話


はじまり

私の住むシェアハウスには『ゴミ当番』なるものがあります。

これは週替りで交代しながら行うもので週に4回ほど出番があります。

これまで、ゴミ当番はシェアハウスの長が冷蔵庫に貼り付けられた

ホワイトボードに住人それぞれの担当週と名前を書くことで

回していました...が


問題点 と 解決策


問題点

シェアハウスには様々な生活を送る人が住んでいます。

学生もいれば社会人もいて、夜勤のある人や出張の多い人もいます。

そのため、夜遊びして家に帰ってこなかったり、夜勤前のごみ捨てを失念していたり、

当番を忘れたまま長期出張に出てしまう事件が多発していました。

ゴミが貯まると同時に住人のストレスも溜まっていきました。


解決策

シェアハウスのLINEグループを活用して、

ゴミ当番の人の名前を通知するbotを作成しようと思い付きました。

そして、せっかく作るのだから名前だけでは無く、

ゴミ種別も通知する事にしました。


どうやって解決するか


ごみ当番の周知

GoogleSpreadSheetに記録

→記録した結果をスクショしてLINEでシェア。

これまでホワイトボードを使用していた頃と同じ、

『当番開始日』 & 『当番名』のみを記録するシンプルな形を踏襲しました。

スクリーンショット 2018-10-15 0.25.04.png


ごみ当番の通知

LINE Notifyを利用。

サービスの名前は過去に大炎上していた某貸し衣装会社を参考に

『ごみのひ』としました。

サービスの登録にかかる時間は5分ほどで、

簡単にアクセストークンを発行することができました。

Screenshot_20181020-160834.png


ソースコード

日時を扱う際にはMomentというライブラリを使いました。

GASでライブラリを扱うことができると知り、

使ったみたかった...というのがMoment使用の動機です。

MomentはJavaScriptを使う方にはメジャーなライブラリらしいですね。


GarbageDutyNotify.gas

var garbageType = "";

//*****メイン関数*****//
function mainFunction(){
garbageTypeCheck()

//シートの値を配列で取得
var sh = SpreadsheetApp.getActiveSheet();
var lastRow = sh.getLastRow();
var values = sh.getRange(1,1,lastRow,2).getValues();

//全行を探索
for ( var i = 0; i < lastRow; i++ ){
var shDay = values[i][0];
var startDay = Moment.moment(shDay)
var dutyRange = []
//当番開始日から当番期間(dutyRange)を計算
for ( var j = 1; j < 7; j++ ){
var inRangeDay = Moment.moment(startDay).add(j,"days");
inRangeDay = Moment.moment(inRangeDay).format("YYYYMMDD");
dutyRange.push(inRangeDay);
}
startDay = Moment.moment(startDay).format("YYYYMMDD");
dutyRange.unshift(startDay);
//今日の日付(today)と当番期間(dutyRange)を元に、当番担当者(targetUser)を決定
var today = Moment.moment().format("YYYYMMDD");
if (dutyRange.indexOf(today) > -1 && garbageType != ""){
var targetUser = values[i][1];
//LINEnotifyに投稿するメッセージ(message)を作成
var message = String.fromCharCode(10) + "明日は『" + garbageType + "』ゴミの日です。"+ String.fromCharCode(10)
+ "ゴミ当番は『" + targetUser + "』さんです。";
sendHttpPost(message);
return ;
}
}
}

//*****garbageTypeを決める関数*****//
function garbageTypeCheck(){
var weeks = Moment.moment.lang('ja', {weekdays: ["日","月","火","水","木","金","土"]});
var date = Moment.moment().format("DD");
var youbi = Moment.moment().format('dddd');;
var test = Math.floor((date + 6 ) / 7)

if (youbi == "月"){
garbageType = "可燃";
}else if(youbi == "木"){
garbageType = "可燃";
}else if(youbi == "火"){
garbageType = "資源";
}else if(youbi == "水" && Math.floor((date + 6 ) / 7) == 1){
garbageType = "不燃"
}else{
garbageType = ""
}
return garbageType
}

//*****LINEnotifyに投稿内容をpostする関数*****//
function sendHttpPost(message){
var token = "Token"; //Tokenを発効して入力
var options =
{
"method" : "post",
"payload" : "message=" + message,
"headers" : {"Authorization" : "Bearer "+ token}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}



まとめ

~ある日~

LINE Notify「今日は『可燃』ごみの日です。ごみ当番は『A』さんです」

Aさん「ごめん今日出張なのでどなたかお願いできますか:sob:

Bさん「私やります:raised_hand:

Aさん「ありがとうございます!お土産買ってきます!」

というようなやり取りが行われる、非常にハートフルな世界が訪れました。

こういった利用の様子を見ることができたり、住人の皆様から「便利になった!」

というフィードバックを頂き、作ってよかったなと感じております。


さいごに

最後まで読んで頂きありがとうございます。

今回初めてGASに触れて見ました。

GASに予めスプレッドシートやドライブ、フォームといったサービスが

用意されているので、手軽に身の回りの課題を解決できそうです。

また、APIを叩くといった経験も初めてでしたが、

シンプルに実装を行うことができたかと思います。

プログラミング勉強中の身なので、

ソースコードや今回の様な課題解決手法について

ご意見がありましたらぜひお願いします。