LinebotとGASとアニメで1日100フレーズの英文を3ヶ月復習してみた

## はじめに

この記事では、「英語を勉強している」という大義によって、他にやるべきことがあるにも関わらず、アニメや映画を見ることを正当化し、一見意識高そうに堕落する方法を紹介しています

## やりたいこと

「ねえ、確率の計算って知ってる？」
<img width="480" alt="Screen Shot 2019-05-06 at 0.08.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/bbdd5116-7b38-9e76-e310-4999fcc08c88.png">
「かずまが3回連続で勝つとかすごく無茶振りなんですけどー笑」
<img width="480" alt="Screen Shot 2019-05-06 at 0.09.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/2503edae-613b-893a-0c4a-3e2d5a7a6d53.png">
「スゥー。俺、じゃんけんで負けたことねえから」
<img width="480" alt="Screen Shot 2019-05-06 at 0.09.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/784adfd8-5483-fd40-b4ad-f2ec7cf2df6a.png">
みたいな英語のフレーズをスラスラと言えるようになりたい

出典:[KONOSUBA -God's blessing on this wonderful world! 2 Episode 7 – An Invitation for This Knucklehead!][3]
[3]:https://www.crunchyroll.com/konosuba-gods-blessing-on-this-wonderful-world/episode-7-an-invitation-for-this-knucklehead-727601

※違法サイトは使っておりません。英語ネイティブ向けの有料ストリーミングサービスからの引用です

## 作ったもの

スプレッドシートに入れた英文を15分ごとにLINEに通知してくれるlinebot

英語を見て、対応する日本語を忘れてしまっていた場合、リンクをクリックする
<img width="885" alt="Screen Shot 2019-05-06 at 1.56.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/1a97f6ce-efbd-29f7-9ac5-52c7e59b9340.png">


該当行にジャンプするので、対応する日本語を復習する
<img width="1196" alt="Screen Shot 2019-05-05 at 23.37.22 copy.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/48020467-b57a-efae-32d9-a3ed87177c70.png">

15分ごとに通知するようにすれば1日100フレーズ復習できます
これで3ヶ月で最低限冗談言い合いながら会話できるようになりました

夜寝てる間には通知が30ほどたまるので、朝にまとめて復習します
寝る前と寝起きすぐの復習は記憶の定着率がいいそうです。

## linebot(Line Messaging API)の登録

[Line Developers][4]から登録できます
登録方法は[富士通さんの解説がわかりやすかったのでご参考ください][1]
記事の頃から見た目が少し変わってますがわかる範囲だと思います

botのchannel accsess tokenと自分のuser idの取得、botへの友達登録まで済ませてください

<img width="804" alt="Screen Shot 2019-05-06 at 1.12.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/ed716172-7fcf-710a-96ec-c4d00a50489a.png">
<img width="1262" alt="Screen Shot 2019-05-06 at 1.15.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/002ece76-c382-4dfc-1ba6-2f11a115bb8a.png">
<img width="1320" alt="Screen Shot 2019-05-06 at 1.14.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/debda6a5-0d92-348f-c3be-14f62a91a03c.png">
<img width="289" alt="Screen Shot 2019-05-06 at 0.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/f9747b43-3b60-3e37-ff8e-a0ddf0316eda.png">


## スプレッドシート作成

なんでもいいので名前をつけて新規作成しましょう。作れたら1行目はスクショのようにします。

<img width="1197" alt="Screen Shot 2019-05-05 at 23.50.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/055fc55b-2cb2-57bb-7eda-6f174fa12e42.png">

A列は復習したい外国語、B列は対応する日本語、C列は通知がどこまでされたかを表す数字です。
C列は最初は1と記入しておいてください。1つ通知が送られると数字が1ずつ加算されます

タイにいたためタイ語も入ってることご容赦ください。本来はタイ語が話せないという死活問題を解決することに始まり、英語に派生しました。ちなみに、タイ語は会話ができればよかったので発音記号とひらがなで覚えてました

## gasの記述

[こちらの方][2]のスクリプトを参考にさせていただきました
コメントなど大変わかりやすかったため一部そのままのところもあります。ありがとうございます

Google Spread Sheetは1シートに対して1つのスクリプトを紐づけることができます
海外にかぶれてブラウザが英語設定なのもご容赦ください。

<img width="1194" alt="Screen Shot 2019-05-06 at 0.36.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/b283d291-c8a1-0290-3ceb-4dbc0bbd2daf.png">

開けたらJavascriptを記述していきましょう
<img width="1198" alt="Screen Shot 2019-05-06 at 0.46.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/8f1652a0-23e1-89ab-286d-2899a58e4501.png">

画像を参考にbotのchannel access tokenとuser id、スプレッドシートのリンクの3つを自分のものに変えてお使いください
z,y,zの羅列の部分です

```javascript:https：//script.google.com/hogefuga
/**
 * @OnlyCurrentDoc
 */

// LINE Developersに書いてあるChannel Access Token
var access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// 自分のユーザーIDを指定します。LINE Developersの「Your user ID」の部分です
var to = "yyyyyyyyyyyyyyyyyyyyyyyyy";

function text_message(text){
  return {
    "type": "text",
    "text": text
  }
}

function choose_in_order(arrayData,isChange){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var arrayIndex = sheet.getRange(1,3,1,1).getValue();
  var index = arrayIndex+1;
  if(isChange == true){
    if(index < sheet.getLastRow()){
      sheet.getRange(1,3,1,1).setValue(arrayIndex+1);
    }else{
      sheet.getRange(1,3,1,1).setValue(1);
    }
  }
  return index+':'+arrayData[arrayIndex-1][0];
}

function getEngs() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(2,1,sheet.getLastRow()-1);
  var values = range.getValues();
  return values;
}

function getJaps() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(2,2,sheet.getLastRow()-1);
  var values = range.getValues();
  return values;
}

function messagePush(){
//これは皆同じなので、修正する必要ありません。
  var url = "https://api.line.me/v2/bot/message/multicast";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };
  
  var eng = choose_in_order(getEngs(),true);
/* 日本語も添えて送りたければこちらコメントアウト外してください
  var jap = choose_in_order(getJaps(),true); */

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var arrayIndex = sheet.getRange(1,3,1,1).getValue();
  
  var postData = {
    "to" : [to],
    "messages" : [
     text_message(eng+'\n'+'https://docs.google.com/spreadsheets/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/edit#gid=0&range=A'+arrayIndex)
// スプレッドシートではurlにrangeというクエリをつけることで指定したセルに飛ぶことができます
    ]
  };


/* 日本語も添えて送りたければこちらコメントアウト外して代わりにお使いください
  var postData = {
    "to" : [to],
    "messages" : [
      text_message(eng+'\n'+jap+'\n'+'https://docs.google.com/spreadsheets/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/edit#gid=0&range=A'+arrayIndex)
    ]
  }; */

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };

  return UrlFetchApp.fetch(url, options);
}
```

再掲
<img width="1262" alt="Screen Shot 2019-05-06 at 1.15.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/002ece76-c382-4dfc-1ba6-2f11a115bb8a.png">
<img width="1320" alt="Screen Shot 2019-05-06 at 1.14.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/debda6a5-0d92-348f-c3be-14f62a91a03c.png">

## 15分おきに通知(メッセージ送信)の設定

最後に、あるタイミングでスクリプトを走らせるバッチの設定です

<img width="311" alt="Screen Shot 2019-05-06 at 1.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/d11886ab-d057-2fc6-c2b7-c4f83a6e0b6d.png">
<img width="1152" alt="Screen Shot 2019-05-06 at 1.05.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/7a6dd76e-3a53-62ce-8eff-321c8dc1475e.png">

同じように設定してください
15分おきだと多いと感じる方はここで変更することができます
<img width="726" alt="Screen Shot 2019-05-06 at 1.04.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/043d024d-5764-3810-efbb-e3e14c231e9e.png">

編集リクエスト、解説して欲しいところなどのコメントお待ちしております

## 参考

[事前準備 LINE Messaging APIアクセストークンの取得 | 富士通][1]
[1]:https://jp.fujitsu.com/solutions/cloud/k5/playground/webhandson/preparation/06.html

[GASとLINE Messaging APIでpushメッセージのLINEbotを作る！ | Qiita][2]
[2]:https://qiita.com/n_oshiumi/items/a1a02e03093825f41e01

[KONOSUBA -God's blessing on this wonderful world! 2 Episode 7 – An Invitation for This Knucklehead! | Crunchyroll][3]
[3]:https://www.crunchyroll.com/konosuba-gods-blessing-on-this-wonderful-world/episode-7-an-invitation-for-this-knucklehead-727601

[4]:https://developers.line.biz/ja/