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

#はじまり
私の住むシェアハウスには『ゴミ当番』なるものがあります。
これは週替りで交代しながら行うもので週に4回ほど出番があります。
これまで、ゴミ当番はシェアハウスの長が冷蔵庫に貼り付けられた
ホワイトボードに住人それぞれの担当週と名前を書くことで
回していました...が

# 問題点 と 解決策
###問題点
シェアハウスには様々な生活を送る人が住んでいます。
学生もいれば社会人もいて、夜勤のある人や出張の多い人もいます。
そのため、夜遊びして家に帰ってこなかったり、夜勤前のごみ捨てを失念していたり、
当番を忘れたまま長期出張に出てしまう事件が多発していました。
ゴミが貯まると同時に住人のストレスも溜まっていきました。

###解決策
シェアハウスのLINEグループを活用して、
**ゴミ当番の人の名前を通知するbot**を作成しようと思い付きました。
そして、せっかく作るのだから名前だけでは無く、
ゴミ種別も通知する事にしました。

# どうやって解決するか
###ごみ当番の周知
GoogleSpreadSheetに記録
→記録した結果をスクショしてLINEでシェア。

これまでホワイトボードを使用していた頃と同じ、
『当番開始日』 & 『当番名』のみを記録するシンプルな形を踏襲しました。
![スクリーンショット 2018-10-15 0.25.04.png](https://qiita-image-store.s3.amazonaws.com/0/164568/6ffd250c-3da0-f2e2-2952-7d63284931b8.png)


###ごみ当番の通知
LINE Notifyを利用。

サービスの名前は過去に大炎上していた某貸し衣装会社を参考に
『ごみのひ』としました。
サービスの登録にかかる時間は5分ほどで、
簡単にアクセストークンを発行することができました。
![Screenshot_20181020-160834.png](https://qiita-image-store.s3.amazonaws.com/0/164568/7c8e7f74-0fec-4504-0b5d-cc2f3ededc69.png)

###ソースコード
日時を扱う際にはMomentというライブラリを使いました。
GASでライブラリを扱うことができると知り、
使ったみたかった...というのがMoment使用の動機です。
MomentはJavaScriptを使う方にはメジャーなライブラリらしいですね。



```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を叩くといった経験も初めてでしたが、
シンプルに実装を行うことができたかと思います。

プログラミング勉強中の身なので、
ソースコードや今回の様な課題解決手法について
ご意見がありましたらぜひお願いします。