ゲームをこどもにプレゼントするにあたって契約書と使用時間管理BOTを作った

##きっかけ
こどもが10歳のプレゼントにあつ森が欲しいという。
ゲーム漬けになること間違いなしなので、①使用のルールを契約で決めるとともに②使用時間を管理するためのLine Botを作った。

###①契約書
使用の決まり等を[契約書](https://drive.google.com/file/d/1BZFTCZ7OLUcBe3Yn4wE5nddgx64c4oh4/view?usp=sharing)にまとめて家族4人（長女（甲）、私（乙）、次女（丙）、妻（丁））で署名。

ポイントは、勉強や習い事の練習やお手伝いなど"お仕事"を行った時間だけゲームができるというところ。（第四条参照）
若干親に都合が良いルールと思いますが、10歳の長女もはじめての『契約書』という大人のワードに圧倒され？重要なルールであることを認識している様子だったのと、なにより『何か契約書って楽しそう！』とワクワクしていたので、良しとしました。

```
第四条（ソフトの使用）
　１．甲は甲の妹である〇〇〇〇（以下、丙【へい】）と一緒にソフトを使用するものとする。
　２．甲及び丙はソフトを使用するために、勉強、〇〇〇の練習、お手伝い等（以下、お仕事）を実施し、お仕事を行った時間だけ、ソフトを使用できるものとする。
　３．甲及び丙はソフトの使用前後に、乙もしくは母である〇〇〇〇（以下、丁【てい】）に開始と終了を報告する。
　4．甲及び丙はお仕事の実施前後に、乙もしくは丁に開始と終了を報告するものとし、開始と終了の間の時間を、お仕事の時間として認める。
　5．乙及び丁はお仕事の実施を直接確認できない場合は、事後にお仕事内容の報告を求めることができる。
　6．乙及び丁から促されて実施したお仕事については、お仕事の時間に算入されない。
　7．甲及び丙はお仕事の日時・内容を記録する。
　8．乙はお仕事の時間とソフトの使用時間を記録する。
　9．Youtubeやテレビの閲覧等、他の用途に充当したお仕事の時間はソフトの使用には充てられない。
　10．甲及び丙は、ソフトの使用前に他の遊び道具等の後片付けを命じられた場合は、乙もしくは丁が作業の完了を確認するまでソフトを使用できない。
```

第五条は決まりを破ると使用禁止、5回以上破ると没収して売却という、厳しい内容です。
署名前の契約書の読み合わせで、5歳の次女は『没収』という言葉の響きで泣き出してしまいました（笑）

```
第五条（ソフトの使用禁止）
　１．第四条の各項に違反した場合は、ソフトの使用を禁止する。
　2．甲と丙の間で喧嘩が生じた場合は、ソフトの使用を禁止する。
　3．甲及び丙が決められた就寝時間（夜9時）までにお布団に入って寝ていない場合は次の日のソフトの使用を禁止する。
　4．ソフトの使用禁止期間は乙が決定する。
　5．5回以上使用禁止を課せられ、改善が見られない場合はソフトを没収のうえ乙が売却する。なお、売却代金は乙のものとする。
```

###②使用時間管理のLine Botの作成
[GASで簡単な予定通知LINE botを作ってみる。](https://www.nakakamado.com/2020/06/gas-line-bot.html)の投稿を参考にしながら、簡単なLINEボットを作成。
機能としては以下の2つのみ。
・お仕事およびゲームの開始・終了の報告
・報告された時間をGoogle SpreadSheetに記録

お仕事時間に応じたメッセージの変更などいろいろ手を加えたいですが、まずはスモールスタートで。

##効果
こどもが自分のスマホで開始・終了を報告するのですが、『このBotあほやな』とか言いながらもまあまあ楽しみながらやっている様子です。
今日は運用初日なのでその効果はのちほど報告する、かもしれません。

###参考
以下、汚いですがコードを参考に記載しておきます。
[LINEのMessaging APIのアクセストークン]
[連携するGoogle SpreadSheetのID]
の2つを各自の環境に置き換えればそのまま使用できるはずです。

```コード.gs
var channel_access_token = "[LINEのMessaging APIのアクセストークン]";

function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      reply(event);
    } else if(event.type == "follow") {
      follow(event);
    } else if(event.type == "unfollow") {
      unFollow(event);
    }
 });
}
// 入力されたメッセージに応じて記録
function reply(e) {
  var postMsg = e.message.text;
  var replytext = "";
  var date = new Date();
  var stime="";
  if(postMsg == "勉強開始"||postMsg == "勉強終了"||postMsg == "〇〇開始"||postMsg == "〇〇終了"||postMsg == "ゲーム開始"||postMsg == "ゲーム終了"||postMsg == "お手伝い開始"||postMsg == "お手伝い終了") {
    stime = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
    replyText = stime +"に"+ postMsg+"したことを記録したよ。";//
    if(postMsg == "勉強終了")
    {
      replyText = replyText+"\n勉強頑張ったね✍";
    }else if(postMsg == "○○終了")
    {
      replyText = replyText+"\n○○頑張ったね！";
    }else if(postMsg == "お手伝い終了")
    {
      replyText = replyText+"\nお手伝い頑張ったね！";
    }else if(postMsg == "ゲーム終了")
    {
      replyText = replyText+"\nゲームは楽しかったかな？ゲームを楽しむためにもお仕事頑張ろう！";
    }
    
      var spreadsheet = SpreadsheetApp.openById("[連携するGoogle SpreadSheetのID]");
      var sheet = spreadsheet.getActiveSheet();
      var userId = e.source.userId;
      var options = {"headers" : {"Authorization" : "Bearer " + channel_access_token}};
      var json = UrlFetchApp.fetch("https://api.line.me/v2/bot/profile/" + userId , options);
      var displayName = JSON.parse(json).displayName;
      //var r = sheet.getLastRow()+1;
      var columnBVals = sheet.getRange('A:A').getValues(); // A列の値を配列で取得
      var r = columnBVals.filter(String).length+1;  //空白を除き、配列の数を取得
      sheet.getRange(r,1).setValue(displayName);
      sheet.getRange(r,2).setValue(postMsg);
      sheet.getRange(r,3).setValue(stime);
  } else{
    replyText ="お仕事の開始前後には『勉強開始』、『勉強終了』、『○○開始』、『○○終了』、『お手伝い開始』、『お手伝い終了』と話しかけてね！\nゲームを開始前後には『ゲーム開始』、『ゲーム終了』と話しかけてね！"
  }
  
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text") ? replyText : "テキスト以外は返せません")
      }
    ]
  };
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}


/* フォローされた時の処理 */
function follow(e) {
  
}

/* アンフォローされた時の処理 */
function unFollow(e){
  
}
```
上記コードは[こちら](https://www.takeiho.com/messaging-api-gas)を参考にさせていただきました。