習慣化をGASとLINE BOTで支援するアカウントを作成

# 実装する機能
1. 所定の文字を打つと日付とgoogle formのリンクがLINEに送信される。
2. 毎日、決まった時間に日付とgoogle formのリンクがLINEに送信される。
3. google formに送信すると、その内容の一部がLINEに送信される。

### 事前準備
・Message APIの設定（アクセストークン、ユーザIDがコードにおいて必要です。）
[【シリーズ第1話】LINE Messaging APIのプロバイダーとチャネルを作成する方法](https://www.yukibnb.com/entry/linemessagingapi_account)
・スプレッドシートの作成（スプレッドシートID、シート名がコードの中で必要です。）
・送信したいgoogle formの準備

#### コード内で必要な情報をまとめると以下の7つです。
・アクセストークン
・ユーザID（LINE Developersの「Basic settings」ページの最下部に書いてあります。）
・対応表スプレッドシートのスプレッドシートID
・対応表スプレッドシートのシート名
・google formの結果を表示するスプレッドシートのスプレッドシートID
・google formの結果を表示するスプレッドシートのシート名
・送りたい内容（google formのURL）

### 機能1,2の実装

応答の対応表をスプレッドシート上で作り、そのスプレッドシートのツールタブからGASのコードを作成します。
トリガーはpush_message関数について毎日に設定しました。

参考サイト（ありがとうございます）
[【シリーズ第4話】コピペでOK！スプレッドシートの語句を返信するLINE BOTをGASで作成する方法(実践編)](https://www.yukibnb.com/entry/linemessagingapi_gas)

[LINE BOTでメッセージを送る（push message）決まった時間に自動的に](https://www.pre-practice.net/2017/11/line-botpush-message.html)

[GoogleAppsScriptで日付をフォーマットする](https://qiita.com/yasuyuki_tsuda/items/11e882076e2dc9fdee16)

``` .js
//LINE Messaging APIのチャネルアクセストークン
var LINE_ACCESS_TOKEN = "";

//スプレッドシートID
var ss = SpreadsheetApp.openById("");

//シート名
var sh = ss.getSheetByName("");

//ユーザーID
var USER_ID = "";


//返信する機能の部分を作成
//LINE Messaging APIからPOST送信を受けたときに起動する
// e はJSON文字列
function doPost(e){
  if (typeof e === "undefined"){
    //動作を終了する
    return;
  } else {
    //JSON文字列をパース(解析)し、変数jsonに格納する
    var json = JSON.parse(e.postData.contents);

    //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する
    replyFromSheet(json)
  }
} 

//返信用の関数replyFromSheet
// data には変数jsonが代入される
function replyFromSheet(data) {
  //返信先URL
  var replyUrl = "https://api.line.me/v2/bot/message/reply";
   
  //シートの最終行を取得する
  var lastRow = sh.getLastRow();
   
  //シートの全受信語句と返信語句を二次元配列で取得する
  var wordList = sh.getRange(1,1,lastRow,2).getValues();
   
  //受信したメッセージ情報を変数に格納する
  var reply_token　= data.events[0].replyToken; //reply token
  var text = data.events[0].message.text; //ユーザーが送信した語句
 
  //返信語句を格納するための空配列を宣言する
  var replyTextList = [];
  
  //LINEで受信した語句がシートの受信語句と同じ場合、返信語句をreplyTextにpushする
  for(var i = 1; i < wordList.length; i++) {
    if(wordList[i][0] == text) {
    　replyTextList.push(wordList[i][1]);
    }
  }
  

  //LINEで受信した語句がシートの受信語句と一致しない場合、関数を終了する
  if(replyTextList.length < 1) {
    return;
    
  //replyTextListのLengthが5より大きい場合、messageLengthを5にする
  //※※一度に最大5つの吹き出ししか返信できないためです※※
  } else if(replyTextList.length > 5) {
    var messageLength = 5;
  } else {
    var messageLength = replyTextList.length;
  }
  
  //"messages"に渡す配列を格納するための空配列を宣言する
  //[{"type": "text", "text": "返信語句その1"},{"type": "text", "text": "返信語句その2"}....]
  var messageArray = [];
  var day = new Date();
  var date = Utilities.formatDate( day, 'Asia/Tokyo', 'yyyy年M月d日')
  messageArray.push({"type": "text", "text": date});
  
  //replyTextListに格納されている返信語句を最大5つ、messageArrayにpushする
  for(var j = 0; j < messageLength; j++) {
    messageArray.push({"type": "text", "text": replyTextList[j]});
  }
  
  var headers = {
    "Content-Type": "application/json; charset=UTF-8",
    "Authorization": "Bearer " + LINE_ACCESS_TOKEN,
  };
  
  var postData = {
    "replyToken": reply_token,
    "messages": messageArray
  };

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
    
  //LINE Messaging APIにデータを送信する
  UrlFetchApp.fetch(replyUrl, options);
}


//毎日リマインドが送られてくる部分の機能を作成
function push_message() {
  var day = new Date();
  var date = Utilities.formatDate( day, 'Asia/Tokyo', 'yyyy年M月d日')
  message = " ${date}\n ~~~~~~~~~~".replace('${date}',date);//~~~~のところにgoogle gormのURLを入れます。
  var postData = {
    "to": USER_ID,
    "messages": [{
      "type": "text",
      "text": message,
    }]
  };

  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };
  var response = UrlFetchApp.fetch(url, options);
}
```



### 機能3の実装
google formの回答表示ページにあるスプレッドシート表示ボタンからスプレドシートを作成し、そのシート上でGASスクリプトを作成します。
トリガーはフォーム送信時に設定してあります。

参考サイト（ありがとうございます）
[Googleフォームで入力したデータをスプレッドシートに追加しGmailで知らせる](https://www.atmarkit.co.jp/ait/articles/1708/28/news021.html)
機能1,2で作った決まった文章をLINEに送信する機能をgoogle formに応用しました。

``` .js
//LINE Messaging APIのチャネルアクセストークン
var LINE_ACCESS_TOKEN = "";

//スプレッドシートID
var ss = SpreadsheetApp.openById("");

//シート名
var sh = ss.getSheetByName("");

//ユーザーID
var USER_ID = "";


function sendFormSpreadSheet(e){
  var date=e.namedValues["n（日）"];
  var name=e.namedValues["読んだ本の名前"];
  var body=date+"日:\n"+name;
  var postData = {
    "to": USER_ID,
    "messages": [{
      "type": "text",1
      "text": body,
    }]
  };

  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
  };

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




function push_message() {
  var day = new Date();
  var date = Utilities.formatDate( day, 'Asia/Tokyo', 'yyyy年M月d日')
  message = " ${date}\n ~~~~~~~~~~~~~~~~~~~".replace('${date}',date);//~~~~のところにgoogle gormのURLを入れます。
  var postData = {
    "to": USER_ID,
    "messages": [{
      "type": "text",
      "text": message,
    }]
  };

  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };
  var response = UrlFetchApp.fetch(url, options);
}
```


# 参考

[【シリーズ第1話】LINE Messaging APIのプロバイダーとチャネルを作成する方法](https://www.yukibnb.com/entry/linemessagingapi_account)

[【シリーズ第2話】LINE Messaging APIのチャネルアクセストークンを発行しよう](https://www.yukibnb.com/entry/linemessagingapi_channelaccesstoken)

[【シリーズ第3話】LINE BOTに返信させる語句をスプレッドシートに入力する](https://www.yukibnb.com/entry/linemessagingapi_sheet)

[【シリーズ第4話】コピペでOK！スプレッドシートの語句を返信するLINE BOTをGASで作成する方法(実践編)](https://www.yukibnb.com/entry/linemessagingapi_gas)

[LINE BOTでメッセージを送る（push message）決まった時間に自動的に](https://www.pre-practice.net/2017/11/line-botpush-message.html)

[Googleフォームで入力したデータをスプレッドシートに追加しGmailで知らせる](https://www.atmarkit.co.jp/ait/articles/1708/28/news021.html)

[GoogleAppsScriptで日付をフォーマットする](https://qiita.com/yasuyuki_tsuda/items/11e882076e2dc9fdee16)