SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

自分自身で課題を解決するDX事例紹介

検索がしんどいPDF情報をLINE Bot化で使いやすくしてみよう

自分自身で課題を解決するDX事例紹介 第2回

Google Apps Script の更新

 さて、記事の冒頭でもお伝えしていた、簡単な検索のロジックを作成していきます。商店街のデータをCSVにし、「データ」というシートを作ってそこに貼り付けます。

図20:GoogleAppsScriptの更新1
図20:GoogleAppsScriptの更新1

 Google Apps Scriptを以下のように書き換えます。

js
//LINE developerで発行した、自分のCHANNEL_ACCESS_TOKENを入れる
var CHANNEL_ACCESS_TOKEN = 'LINE developerで発行した、自分のCHANNEL_ACCESS_TOKENに書き換えてください'; 
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';

function doPost(e) {
  //LINEから送られてくるデータを解析する
  var json = JSON.parse(e.postData.contents);

  //返信するためのリプライトークン取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  //送られたLINEメッセージを取得
  var user_message = json.events[0].message.text;  

  //送られたメッセージをそのままオウム返し
  //var reply_messages = [user_message];
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ');
  var target_rows = searchData(sheet, user_message, 6); // 6行目は「取扱商品名」
  var search_results = [];
  for(var i = 0; i < target_rows.length; i++){
    search_results.push("店名:" + sheet.getRange(target_rows[i],2).getValue() + ', 住所:' + sheet.getRange(target_rows[i],4).getValue());
  }
  var reply_messages = randomSelect(search_results);
 
  // メッセージを返信
  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);
}

// シートからデータを検索(部分一致)
function searchData(sheet, val, col){
  var dat = sheet.getDataRange().getValues();
  var target_rows = []; 
  for(var i = 1; i < dat.length; i++) {
    if(dat[i][col-1].indexOf(val) != -1){
      target_rows.push(i+1);
    }
  }
  return target_rows;
}

// 検索結果がたくさんあると送信できないので、検索結果からランダムに3つを取り出す
function randomSelect(array){
  var randomSelect = [];
  while(randomSelect.length < 3 && array.length > 0){
    const rand = Math.floor(Math.random() * array.length);
    randomSelect.push(array[rand]);
    array.slice(rand, 1); // 結果が重複しないように、元の配列からは削除
  }
  return randomSelect;
}

 すでにデプロイしてあるので、「デプロイの管理」からバージョンを選択し、デプロイを押してください。

図21:GoogleAppsScriptの更新2
図21:GoogleAppsScriptの更新2
図22:GoogleAppsScriptの更新3
図22:GoogleAppsScriptの更新3

 これで以下のように、キーワードで検索した結果を表示してくれるようになります。

図23:GoogleAppsScriptの更新4
図23:GoogleAppsScriptの更新4

 返却する値をカスタマイズしたい場合は、messagesを変更してください。以下のようなメッセージをシミュレートできるサイトも提供されているので、活用しましょう。

まとめ

 以上が、検索用のLINEBotを簡単に作れる方法でした。今回は説明ばかりで実装はものすごく簡素ですが、LINEBotに自分の位置情報を投げ、一番近いお店を検索してあげたり、検索結果のお店の位置情報を返却してあげたりすることで、スムーズにお店まで道案内をさせるなどさまざまな使い方が可能です。汎用的な作りにしているので、いろいろな形で活用いただけたらうれしいです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
自分自身で課題を解決するDX事例紹介連載記事一覧

もっと読む

この記事の著者

桑原 陸也(クワバラ リクヤ)

 地方の大学で経済学を学んだ後、IT業界に入った文系エンジニア。日本初のプロトタイプ専門スクール「プロトアウトスタジオ」の第1期生。現在はフリーランス として金融業界エンジニアをしています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/13475 2021/01/22 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー