LINE botを使って体重管理してみた！？(Google App Script)

# 目次
* なぜこのシステムを作ったのか
* 使用するツール・環境
* ソースコードの解説等
* スプレッドシートの中身
* 使用してみた結果
* 最後に


# 1. なぜこのシステムを作ったのか
正月太りしてしまった...ダイエットせねば..
まず体重管理からしてみよう！
でも体重管理のアプリ入れても絶対入力怠るなあ...



:::note info
**じゃあLINEで体重管理bot作っちゃおう！**
:::

LINEで毎日記録すれば、怠らないよね...(多分)

それじゃあササッと作ってみよう！


# 2. 使用するツール・環境
今回はGoogle App Scriptを使用します。(以下GAS)
データはスプレッドシートに保存します。


# 3. ソースコードの解説等

```javascript
const CHANNEL_ACCESS_TOKEN = ''; 
const url = 'https://api.line.me/v2/bot/message/push';
const groupID = '';

function doPost(e) {
  const json = JSON.parse(e.postData.contents);
  const userId = json.events[0].source.userId;
  const today = new Date();
  const kanri_sheet = SpreadsheetApp.openById('').getSheetByName((today.getMonth()+1)+'月');　//今月のシート取得

//ユーザ一１の場合
  if(userId == ''){
    day_cell = 'A'
    weight_cell = 'B'
  }
//ユーザ一２の場合
    if(userId == ''){
    day_cell = 'D'
    weight_cell = 'E'
  }

  //返信するためのトークン取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  let message=json.events[0].message.text; //送られたメッセージ内容を取得
  

  if(message == '管理表見して'){
    send_message('https://docs.google.com/spreadsheets/???')
    return
  }

  if(isFinite(message) == false){
    send_message('半角数値で入力してください。')
    return
  }
  
//本日入力済みかどうか
  check_cell = kanri_sheet.getRange(day_cell +(today.getDate()+2)).getValue()
  if(check_cell.length > 1){
    send_message('本日の体重は入力済みです。')
    return
  }
  kanri_sheet.getRange(day_cell +(today.getDate()+2)).setValue(today.getDate()+'日')
  kanri_sheet.getRange(weight_cell +(today.getDate()+2)).setValue(message+'kg')


//スプレッドシートに書き込み
  send_message('登録が完了しました。')
  max_weight = kanri_sheet.getRange(weight_cell + '35').getValue()
  min_weight = kanri_sheet.getRange(weight_cell + '34').getValue()

//今月初めての書き込みの場合
  if(max_weight.length == 0){
    kanri_sheet.getRange(weight_cell + '35').setValue(message + 'kg')
    kanri_sheet.getRange(weight_cell + '34').setValue(message + 'kg')
    return
  }

//今月の最高と最低の体重を取得
  max_weight = Number(max_weight.replace('kg',""))
  min_weight = Number(min_weight.replace('kg',""))

  if(Number(message) > max_weight){ //最高の体重を更新した時
    kanri_sheet.getRange(weight_cell + '35').setValue(message + 'kg')
    send_message('今月一番重たい体重更新しちゃったよ、、、頑張ろう、、')
  }
  if(Number(message) < min_weight){ //最低の体重を更新した時
    kanri_sheet.getRange(weight_cell + '34').setValue(message + 'kg')
    send_message('今月一番体重軽いよ！！！えらい！！！！！！')
  }

//昨日の体重入力があった場合、機能との体重を比較
  if(today.getDate() != 1 & (kanri_sheet.getRange(day_cell + (today.getDate() + 1)).getValue()).length != 0){
    yester_taizyu = kanri_sheet.getRange(weight_cell + (today.getDate() + 1)).getValue()
    yester_taizyu = yester_taizyu.replace('kg',"")

    diff = Number(message) - Number(yester_taizyu)
    send_message('昨日との体重差は' + diff + 'kgです。')
    if(diff > 0){
      send_message("食べ過ぎちゃったかな！？！？！")
    }
    else{
      send_message("いいじゃんその調子！！！")
    }
  }
}

//送信部分
function send_message(message){
var response = UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'POST',
    'payload': JSON.stringify({
      'to': groupID,
      'messages':[{
        'type': 'text',
        "text" : message,
      }]
     })
   })
   Logger.log(response.getResponseCode());
}
```

# 4. スプレッドシートの中身
以下にスプレッドシートで管理しているデータを示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/ebc4b228-a45d-b28a-aaac-727892932f4b.png" width=80%>

一番下のセルに、"今月一番重い体重"と"今月一番軽い体重"を記録しています。
空白のセルは体重を入力していなかった場合となります。
また、今回は２人のデータを登録しています。


# 5. 使用してみた結果

実際に使用してみました。
友人と自分のLINEグループを作成し、botをグループに入れます。
そして、数字を送信し、体重を記録していきます。
botが個人のLINEIDを識別し、２人の体重管理を実現しています。


以下は、前日より増えた体重を入力した場合です。(チューリップがbot)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/eeaedd1a-6e8f-32ce-2bd8-2c212a225189.jpeg" width=50%>

botは無慈悲ですね...

以下は、
月で一番軽い体重を更新した時の場合です。(惑星がbot)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/5391e0c3-2a5a-4338-25ac-9fee55d18d5a.jpeg" width=50%>

褒められたら嬉しいですね(^ ^)

# 6. 最後に

今回はLINEbotで体重管理を行いました。
コピペでもできるので、是非作ってみてくださいね〜