Help us understand the problem. What is going on with this article?

映画レビューの記録・共有をLINE BOTで行ってみる

何をつくりたいのか。

・LINE BOTとGoogle Apps Script(GAS)の勉強
・内容としては、LINE BOT経由で内容をスプレッドシートに送信
映画レビューを、LINE BOTに話すとスプレッドシートに送られて、仲間同士で共有できる仕組みを作ります。

図1.jpg

完成後

映画レビューをLINE BOTに話すと
S__22683708.jpg

カテゴリごとに分割されて、スプレッドシートに格納されます。
キャプチャ最終.JPG

LINE Developersの設定

・Webブラウザから「LINE Developers」を検索
・右上の[ログイン]を押してページ遷移
・[LINEアカウントでログイン]
すると、こんな感じの画面になります。
キャプチャ.JPG

英語版だったので、日本語にして、プロバイダーの横の作成ボタンをクリック。
プロバイダー名の欄に管理者名を登録します。

キャプチャ1.JPG

チャンネル作成、真ん中のAPIをクリック。

キャプチャ2.JPG

登録情報を入力していきます。

キャプチャ_4.JPG

同意して進んだら、API設定をクリック
キャプチャ6.JPG

応答メッセージの編集をクリックして、応答メッセージをオフ、webhookをオンにします。

キャプチャ7.JPG

キャプチャ8.JPG

先ほどの画面で、アクセストークン[発行]します。

キャプチャ9.JPG

管理者用Googleアカウント作成とスプレッドシートの設定(GAS)

・アカウント作成
・ドライブを開く
・新規作成->googleスプレッドシートを開く

スクリプトエディタを開きます。
(複数のGoogleアカウントでログインしている状態だと、うまくいかないかも)
きゃぷ10.jpg

元のコードを削除して、下記のコードを貼り付けます。以下のサイトを参考にして作成しました。
アイデアを記録・想起する LINE Bot を作ってみました。

GASのコード

はじめに、アクセストークンなどLINEとの接続部分の設定。
CHANNEL_ACCESS_TOKEN = ‘xxxxxxxxx’のxxxxxx…を削除し、line developersで発行していたトークンをコピーし、xxxx…の部分に貼り付けます。

main.gs
var CHANNEL_ACCESS_TOKEN = 'xxxxxxxxxxxxxxx'; // please set your channel access token
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';#LINE Developer Document記載のAPIURL
var line_endpoint_profile = 'https://api.line.me/v2/bot/profile';

この処理で分割したメッセージを、スプレッドシートに追加しています。

main.gs
function addToSpreadSheet(time,m1,m2,m3,m4,m5,m6) {
  var today = new Date();
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getSheets()[0];
  sheet.appendRow([today,m1,m2,m3,m4,m5,m6]);
}

BOTがメッセージを受け取った後に、分割する部分。

main.gs
function doPost(e) {
  //JSONをパース
  var json = JSON.parse(e.postData.contents);  
  //返信用のトークンを取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  var time = json.events[0].source.userId;
  //送信されたメッセージを取得
  var user_message = json.events[0].message.text;  
  //返信するメッセージを配列で用意
  var reply_messages;
  var spreadSheet;
  var str1='映画レビュー';
  var str2='【投稿者】';
   if(user_message.indexOf(str1)!=-1 && user_message.indexOf(str2)!=-1){
    //メッセージに映画レビュー、【投稿者】というフォーマット形式のデータが入っていた場合分割する
    var str;
    str = user_message[0];
    var i=0;
    for(i=1;i<=user_message.length;i++){
     str += user_message[i];
    }

    var reg = /【投稿者】.*?\n/;
    var m1 = str.match(reg);
    m1 = m1.join('');//配列の要素を結合して文字列に変換
    m1 = m1.replace(/【投稿者】/g,'');//不要な情報の削除
    m1 = m1.replace(/\n/g,'');//改行の削除

    var reg = /【映画名】.*?\n/;
    var m2 = str.match(reg);
    m2 = m2.join('');//配列の要素を結合して文字列に変換
    m2 = m2.replace(/【映画名】/g,'');//不要な情報の削除
    m2 = m2.replace(/\n/g,'');//改行の削除

    var reg = /【ジャンル】.*?\n/;
    var m3 = str.match(reg);
    m3 = m3.join('');//配列の要素を結合して文字列に変換
    m3 = m3.replace(/【ジャンル】/g,'');//不要な情報の削除
    m3 = m3.replace(/\n/g,'');//改行の削除

    var reg = /【評価】.*?\n/;
    var m4 = str.match(reg);
    m4 = m4.join('');//配列の要素を結合して文字列に変換
    m4 = m4.replace(/【評価】/g,'');//不要な情報の削除
    m4 = m4.replace(/\n/g,'');//改行の削除

    var reg = /【良かった点】.*?\n/;
    var m5 = str.match(reg);
    m5 = m5.join('');//配列の要素を結合して文字列に変換
    m5 = m5.replace(/【良かった点】/g,'');//不要な情報の削除
    m5 = m5.replace(/\n/g,'');//改行の削除

    var reg = /【悪かった点】.*/;
    var m6 = str.match(reg);
    m6 = m6.join('');//配列の要素を結合して文字列に変換
    m6 = m6.replace(/【悪かった点】/g,'');//不要な情報の削除
    m6 = m6.replace(/\undefined/g,'');

    addToSpreadSheet(time,m1,m2,m3,m4,m5,m6);
    reply_messages = [ m1 + 'さん\n' + m2 + 'のレビューありがとうございます。'];
}

   else {
    reply_messages = ['error'];
   }

BOTが、メッセージを返信する部分。
返信がないと、きちんと反映されているのか不安になりますよね。

main.gs
  //メッセージを返信
  var messages = reply_messages.map(function (v) {
    return {'type': 'text', 'text': v};    
  });    
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': messages,
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

アプリケーション公開へ

公開→ウェブアプリケーションとして導入

きゃぷ13.jpg

公開範囲を設定、連携を許可し、URLをコピーします。

キャプチャ14.JPG

ここから安全ではないページと表示されますが、そこをクリックして同意してください。

キャプチャ15.JPG

もう一度、公開からウェブアプリケーションとして導入を押すと、このURLが発行されます。コピーして、Project versionをnewバージョンに選択して更新します。コードを書き換えた際も、毎回更新します。

キャプチャ16.JPG

コピーしたURLをline developersのチャネル基本設定画面のwebhookの欄に貼り付けます。

キャプチャ17.JPG

webhookの利用を、そのままonにします。

キャプチャ18.JPG

そして、LINE Developersのチャネル基本設定画面のQRコードを携帯で読み取って、BOTをLINEに追加します!

実際に試してみる

スプレッドシートの1行目に、投稿日時等の情報を書いておいて、LINEBOTに、このフォーマットを使って、内容を書き込んで送信すると

映画レビュー
【投稿者】
【映画名】
【ジャンル】
【評価】
【良かった点】
【悪かった点】

S__22683708.jpg

キャプチャ最終.JPG

無事に、スプレッドシートに反映されました。

さいごに

スプレッドシートのURLを共有しておけば、仲間同士で共有する事ができます。グループラインへの招待をDepelopersで有効にしておけば、グループで発信して会話を楽しみ、スプレッドシートでも後から見返す事ができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした