Google Apps Script の更新
さて、記事の冒頭でもお伝えしていた、簡単な検索のロジックを作成していきます。商店街のデータをCSVにし、「データ」というシートを作ってそこに貼り付けます。
Google Apps Scriptを以下のように書き換えます。
//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;
}
すでにデプロイしてあるので、「デプロイの管理」からバージョンを選択し、デプロイを押してください。
これで以下のように、キーワードで検索した結果を表示してくれるようになります。
返却する値をカスタマイズしたい場合は、messagesを変更してください。以下のようなメッセージをシミュレートできるサイトも提供されているので、活用しましょう。
まとめ
以上が、検索用のLINEBotを簡単に作れる方法でした。今回は説明ばかりで実装はものすごく簡素ですが、LINEBotに自分の位置情報を投げ、一番近いお店を検索してあげたり、検索結果のお店の位置情報を返却してあげたりすることで、スムーズにお店まで道案内をさせるなどさまざまな使い方が可能です。汎用的な作りにしているので、いろいろな形で活用いただけたらうれしいです。
