LoginSignup
5
1

More than 1 year has passed since last update.

Google app Scriptでゴミ出し通知botを作った話(改良版)

Last updated at Posted at 2021-06-06

以前
Google app Scriptでゴミ出し通知botを作った話
というタイトルで投稿させていただいたyamk(@yamk_fuu_k)です.

以前の記事はこちら

こちらのコードで修正点に気づきましたので再投稿をします。

修正点

前回のコード全体は載せません。
間違っていた部分のみ抜粋していきます。

case 6:
      if(f===1){
        comment.push('燃やせないゴミ')
        f=0
      }
      else{
        comment.push('ペットボトル')
        f=1
      }
      break;

この部分なんですが所望の動作としては、燃えないゴミの日の次の週はペットボトル、その次の週は燃えないゴミのように、2週間を1サイクルで回そうみたいなイメージです。
運用としては翌日が何曜日かをcase文で判断して、lineに送信するという関数をgasのトリガー機能で決まった時間に送っていたというものでした。
このコード部分f=0,1となることで実行されるたびにペットボトルか、燃えないゴミかを判断できる完璧じゃん!というものです。
ですがこのコードこの部分だけちゃんと動かんのですよ。
関数内ではf=0で初期化されていて0→1,1→0という風になりますが、関数は実行のたびにf=0で初期化されていて2週間1サイクルになっていなかったのです...
以前の記事見て実装とか真似とかしてくれた方すみません...

では修正してやります

まずはコードから

function noticeGarbageDay() {
  var accessToken = 'kSVrz5Phjj7uHkU9L0CUxjErs8bG2cGr6Gydd2wwvWF'; 

  var date = new Date();
  date.setDate(date.getDate() + 1);
  var comment = [];

  const spreadsheet=SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var val = sheet.getDataRange().getValues();
  //console.log(sheet.getRange("B7").getValues());
  /*var is_the_what_weekly = Math.floor((date.getDate() - 1) / 7) + 1;*/
  var f=1;
  switch(date.getDay()) {
      case 1:
      comment.push(val[1][1])
      break;
      case 2:
      comment.push(val[2][1])
      break;
      case 3:
      comment.push(val[3][1])
      break;
      case 4:
      comment.push(val[4][1])
      break;
      case 5:
      comment.push(val[5][1])
      break;
      case 6:
      if(val[6][1]==='ペットボトル'){
        comment.push('燃やせないゴミ'),
        sheet.getRange("B7").setValue('燃えないゴミ')
      }
      else{
        comment.push('ペットボトル'),
        sheet.getRange("B7").setValue('ペットボトル')
      }
      break;

  }

  if (comment.length < 1) return;

  var text = '\n明日は' + comment.join('、') + ' の日です!\nゴミあるならだしなよ' ;

  var message = text;
  var options = {
    'method' : 'post',
    'headers': {
      'Authorization': 'Bearer ' + accessToken
    },
    'payload' : {
      'message': message
    }
  };
  var response = UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
  Logger.log(response);
}

前回との違いはせっかくgas使ってるんだから情報はスプレッドシート使って管理してやろうという点です。
スプレッドシートは以下のような感じのテーブルで書いてあります。

曜日 種類
月曜 可燃ゴミ
火曜 枝、葉
水曜 古着など
木曜 可燃ゴミ
金曜 びん、かん
土曜 不燃ゴミ

ここでペットボトルないじゃん!?ってなるかもですがご安心ください。
ちゃんと対策してあります。
このコード部分を見てください。

 case 6:
      if(val[6][1]==='ペットボトル'){
        comment.push('燃やせないゴミ'),
        sheet.getRange("B7").setValue('燃えないゴミ')
      }
      else{
        comment.push('ペットボトル'),
        sheet.getRange("B7").setValue('ペットボトル')
      }
      break;

今回はスプレッドシートの値をpushするという方針に変更しました。
このことでスプレッドシートに記載されている情報はその曜日で最後に出したゴミの種類、つまり先週のゴミの種類ということになります。
なのでもしスプレッドシートの値がペットボトルであれば、先週はペットボトルの日だったということになるので、
燃えないゴミをpushし、スプレッドシートの情報もペットボトルから燃えないゴミに書き換えるという方法で、
燃えないゴミ→ペットボトルのサイクルを実現しています。

今回、スプレッドシートからの情報の取り方の具体的な方法は説明しませんのでコード部を参照ください。
スプレッドシートの操作などは多分もっと良い情報載せてくれている人がいると思いますが、気が向いたら今後記事にします。

おわりに

今回、自分がちゃんとテストをしなかったせいで所望の動作をしていなかったことに気づくのが遅くなりました。
今後はテストもちゃんとやらないとな、と実感しました。
よければTwitter(@yamk_fuu_k)やっていますのでフォローよろしくお願いします。
気になる点等あれば質問していただければ、可能な限りお答えします!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1