LINE Messaging APIとGoogle Apps ScriptでLINEをインストールしていない人でもグループトークに参加できるようにする

LINEで情報共有したいけどLINEをインストールしていない人もいるんじゃないかと思って作ってみました。
#使用したもの
・Google Apps Script
・Gmail
・LINEのMessaging API（Developer Trial）
#始めに
##Google Apps Scriptの準備
Googleドライブで新規->その他->Google Apps Scriptを選択するとスクリプトファイルが作成できます。
次に、LINEから送られるJSONを受け取れるようにURLを取得します。スクリプトファイルを開き、公開->ウェブアプリケーションとして導入->更新を選択するとURLが表示されるのでこれをメモしておきます。
##LINE Messaging APIのアカウント作成
LINE Messaging API に登録する必要があります。以下のURLからDeveloper Trialでアカウントを作成して下さい。
https://business.line.me/ja/services/bot
##Botの設定
LINE@MANAGERでアカウント設定->Bot設定を選択して、Webhook送信とBotのグループトーク参加を利用する、自動応答メッセージと友達あいさつは利用しないを選択してください。
次にLINE developersのBasic informationでWebhook URLにGoogle Apps Scriptで表示されたURLを入力、Channel Access TokenはISSUEを選択して下さい。
#1.LINEのグループIDを取得する
始めにグループトークのIDを取得します。IDはグループトークに参加した時に送られるので、送られてきたIDをGASを使ってスプレッドシートに書き込みます。
[LINEのMessaging API Reference (Join event)](https://devdocs.line.me/ja/#webhook-event-object)
[GASのSpreadSheeet関連のReference](https://developers.google.com/apps-script/reference/spreadsheet/)

```
//MAIL_ADDRESSは送信先のメールアドレス
function sendMail(text) {
  try{
    var address = PropertiesService.getScriptProperties().getProperty('MAIL_ADDRESS');
   
    MailApp.sendEmail(address, 'LINE', text);
  }
  catch(e){
  }
}

//SPREAD_SHEETはスプレッドシートのURL
function writeSpread(group_id){
  var url = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET');
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheets = spreadsheet.getSheets();
  var sheet = sheets[0];
  var lastrow = sheet.getLastRow();

  sheet.getRange(lastrow+1, 1).setValue(group_id);
  sendMail('good');
}

function doPost(e) {
  var webhook = JSON.parse(e.postData.contents).events[0];
  if(webhook.type === 'join'){
    writeSpread(webhook.source.groupId);
  }
}
```

#2.グループトークのメッセージを取得してメールで送信する
グループトークに新しいメッセージが送られた時にメッセージの内容をメールで送信します。doPostにメッセージを送信する追加します。
また、このプログラムではtextメッセージしかメールで送れないようになっています。

```
function doPost(e) {
  var webhook = JSON.parse(e.postData.contents).events[0];
  if(webhook.type === 'join'){
    writeSpread(webhook.source.groupId);
  }else{
    var message_type= JSON.parse(e.postData.contents).events[0].message.type;
    if (message_type === 'text') {
      var user_message = JSON.parse(e.postData.contents).events[0].message.text;
      sendMail(user_message);
    }
  }
}
```

#3.メールで送信した文章をグループトークに送信する
メールをGmailに送信しGmailの未読となっているメールの文章を取得してグループトークに送ります。
最初にグループIDをスプレッドシートから取得していますが、1Aに書いてあるIDを取得するようにしています。
[LINEのMessaging API Reference (Push message)](https://devdocs.line.me/ja/#push-message)

```
function get_groupid(){
  var url = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET');
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheets = spreadsheet.getSheets();
  var sheet = sheets[0];
  var startrow = 1;
  var startcol = 1;
  var lastrow = sheet.getLastRow();
  var lastcol = 2;
  
  var sheetdata = sheet.getSheetValues(startrow, startcol, lastrow, lastcol);
  
  return sheetdata[0][0];
}

function Push_message(text){
  var group_id = get_groupid();
  
  //url_pushはhttps://api.line.me/v2/bot/message/push
  //CHANNNEL_ACCESS_TOKENはBotのChannel Access Token
  UrlFetchApp.fetch(url_push, {
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    },
    'method': 'post',
    'payload': JSON.stringify({
      'to': group_id,
      'messages': [{
        'type': 'text',
        'text': text
      }]
    })
  });
}
```

未読メールの文章を取得するコードです。
[GASのGmail関連のReference](https://developers.google.com/apps-script/reference/gmail/)

```
function getMail(){
  var start = 0;
  var max = 500;
  var label = 'LINE'
  var mail = GmailApp.search('label:' + label + ' is:unread', start, max); 
 
  for(var i = 0; i < mail.length; i++){
    var messages = mail[i].getMessages();
    for(var j = 0; j < messages.length; j++){
      if(messages[j].isUnread()){
        var body = messages[j].getBody();
        body = body.replace(/<div>Windows メール から送信<\/div>/g, '');
        var body_array = body.match(/<div>.+<\/div>|<div>.+<br>/g);
        body = '';
        for(var k = 0; k < body_array.length; k++){
          body += body_array[k];
        }
        body = body.replace(/<div>/g, '');
        body = body.replace(/<\/div>/g, '\n');
        body = body.replace(/<br>/g, '');
        Push_message(body);
      }
    }
     message[i].markRead();
  }  
}
```

これでメールからグループトークにメッセージを送れるようになりますが、このプログラムを定期的に実行する必要があります。
スクリプトファイルで時計のアイコンを選択して実行をgetMail,イベントを分タイマー、1分ごとに設定すると1分おきにgetMailが実行され未読メールからグループトークにメッセージを送信できます。

後はLINE Botをグループトークに招待すればメールでLINEのやり取りができます。
#最後に
一応メールでLINEのやり取りができるようになりましたが、メールからではグループトークで誰が発言したのかがわかりません。こんな遠回りなことをするよりLINEをインストールさせたほうが楽ですね。