<GAS>チャットボットの作成
解決したいこと
こちらのコードでLINEに位置情報を送った際に返答がない原因がわかりません。
LINEで位置情報検索できるチャットボットを開発しています。
解決方法を教えて下さい。
以下のコードでIDやアクセストークンは自分のもので当てはめて実行したが、うまくできませんでした。自分でも何度も時間を空けて調べた結果動きませんでした。
コードが長く見づらくて申し訳ありませんが、解決していただきたいです。
var YAHOO_APP_ID = 'Yahoo!デベロッパーネットワークのアプリケーションのClient ID'//ClientID
var LINE_BOT_CHANNEL_ACCESS_TOKEN = '自分のLINE chat botのチャネルアクセストークン'//チャネルアクセストークン
var ss = SpreadsheetApp.openById("自身で作成したスプレッドシートのID");//スプレッドシートID
var sh = ss.getSheetByName("業種コード");//スプレッドシートのシート名
var GC = sh.getRange('D2').getValue();//D2のコードをGCに代入
var LINE_REPLY_URL = 'https://api.line.me/v2/bot/message/reply';
var YAHOO_SEARCH_URL = 'https://map.yahooapis.jp/search/local/V1/localSearch';
//google検索
function getGoogleSearchUrl(query) {
return 'https://www.google.co.jp/search?q=' + encodeURIComponent(query) + '&ie=UTF-8';
}
//googleマップルート検索
function getGoogleMapRouteUrl(srcLatitude, srcLongitude, destLatitude, destLongitude) {
return 'http://maps.google.com/maps'
+ '?saddr=' + destLatitude + ',' + destLongitude
+ '&daddr=' + srcLatitude + ',' + srcLongitude
+ '&dirflg=w';
}
var Restaurant = function(name, address, googleSearchUrl, googleMapRouteUrl) {
this.name = name;
this.address = address;
this.googleSearchUrl = googleSearchUrl;
this.googleMapRouteUrl = googleMapRouteUrl;
};
//検索部分
function getNearRestaurants(latitude, longitude) {
var url = YAHOO_SEARCH_URL
+ '?appid=' + YAHOO_APP_ID
+ '&cid=d8a23e9e64a4c817227ab09858bc1330' //カセットID
+ '&dist=3' // 3 km 以内
+ '&gc=' + GC // 業種コード
+ '&results=5' // 最大 5 件
+ '&lat=' + latitude//
+ '&lon=' + longitude//
+ '&output=json&sort=dist';//json
var response = UrlFetchApp.fetch(url);
var restaurants = [];
var features = JSON.parse(response.getContentText('UTF-8'))['Feature'];
for (i = 0; i < features.length; i++) {
var name = features[i].Name;
var address = features[i]['Property'].Address;
var coords = features[i]['Geometry'].Coordinates.split(',');
var restaurant_lonitude = coords[0];
var restaurant_latitude = coords[1];
var googleSearchUrl = getGoogleSearchUrl(name + ' ' + address);
var googleMapRouteUrl = getGoogleMapRouteUrl(restaurant_latitude, restaurant_lonitude, latitude, longitude);
restaurants.push(new Restaurant(name, address, googleSearchUrl, googleMapRouteUrl));
}
return restaurants;
}
function doPost(e) {
var json = JSON.parse(e.postData.contents);
var userId = json.events[0].source.userId;
var replyToken= json.events[0].replyToken;
if (typeof replyToken === 'undefined') {
return;
}
//ヘルプ用メッセージ
var helpMessage = '位置情報を送信すると、半径3 km 以内の店舗を、最大 5 つ探して次の情報をお伝えします。\n\n'
+ '・店の名前\n'
+ '・住所\n'
+ '・検索リンク\n'
+ '・ルート案内リンク\n\n'
+ '↓こちらのボタンから位置情報\n を送信できます。';
if ('message' == json.events[0].type) {
var userMessage = json.events[0].message;
//位置情報を送ったとき
if ('location' == userMessage.type) {
var replyMessage = getNearRestaurants(userMessage.latitude, userMessage.longitude);
var columns = replyMessage.map(function (v) {
var title = v.name;
var adr = v.address;
return {
'title': title,
'text': adr,
'actions': [
{
'type': 'uri',
'thumbnailImageUrl':'',
'label': 'ここを検索',
'uri': v.googleSearchUrl
},
{
'type': 'uri',
'label': 'ここへのルート',
'uri': v.googleMapRouteUrl
}
]
};
});
var altText = '';
replyMessage.forEach(function(element, index, array) {
altText += element.name + ' | ';
});
var messages = [
{
'type': 'template',
'altText': altText,
'template': {
'type': 'carousel',
'columns': columns
}
}
];
//ヘルプが打たれた時
}else if(userMessage.text == "ヘルプ"){
messages = [{'type': 'text', 'text': helpMessage}];
//それ以外の文字「飲食店」と打てばスプレッドシートから業種コードを検索し、記録する
}else{
//シートの最終行を取得する
var lastRow = sh.getLastRow();
//シートの業種名と業種コードを二次元配列で取得する
var shopList = sh.getRange(1,1,lastRow,2).getValues();
//業種コードを格納するための空配列を宣言する
var codeList = [];
//LINEで受信した語句がシートの業種名と同じ場合、業種コードをcodeListにpushする
for(var i = 1; i < shopList.length; i++) {
if(shopList[i][0] == userMessage.text) {
codeList.push(shopList[i][1]);
}
}
//シートに出力
sh.getRange('D2').setValue(codeList);
if(codeList.length < 1) {
return;
}
var changeMessage = userMessage.text + 'を検索します。\n位置情報を送信してください。';
messages = [{'type': 'text', 'text': changeMessage}];
}
}
/*応答メッセージを送る処理。わからないなら応答メッセージを送るの部分みてhttps://developers.line.biz/ja/reference/messaging-api/*/
UrlFetchApp.fetch(LINE_REPLY_URL, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + LINE_BOT_CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': messages,
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}