はじめに
LINE を使用して YES/NOチャートを行うBOTを作成しました。
質問にYES/NOで答えると次の質問に進みます。最終的に結果が表示されます。
スプレッドシートでは、IDと質問内容、YES選択時のID、NO選択時のIDを指定します。
YES選択時のIDが次の質問内容を表示するIDとなります。
(typeのconfirm
は質問、message
は結果メッセージ)
事前準備
- GoogleDriveにてGoogleAppsScriptを開いて、以下のスクリプトを実装します。
-
LINE_CHANNEL_TOKEN
にLINE Messaging APIで発行したトークンを指定します。 -
SSID
にスプレッドシートのIDとSSN_USER
にシート名を指定します。
main.gs
/**
* YES/NOチャート
*/
const LINE_CHANNEL_TOKEN = '*****'; // LINE NOTIFYのアクセストークン
const SSID = '*****';
const SSN_USER = 'user';
const SSN_FAQ = 'faq';
フォロー登録
フォロー解除
リプライ
ユーザーがYES/NOを選択するとLINE Messaging API
からGASにPOSTが通知されます。GASでは、IDが通知されます。そのIDから質問または結果をLINE Messaging API
にPOSTで返します。
main.gs
/**
* メッセージイベント
* @param {Object} reqEvent
*/
function executeMessage(reqEvent) {
let msgList = [];
let user = getUser(reqEvent.source.userId);
if (user) {
if (reqEvent.message.type === 'text') {
let msg = createMsg(reqEvent.message.text);
if (msg) {
msgList.push(msg);
sendLineReply(reqEvent.replyToken, msgList);
}
}
}
}
/**
* FAQ IDからメッセージを生成する
* @param {String} faqId
*/
function createMsg(faqId) {
let msg = null;
let faq = getFaq(faqId);
if (faq) {
switch (faq.type) {
case 'message':
msg = {
'type': 'text',
'text': String(faq.text),
}
break;
case 'confirm':
msg = {
'type': 'template',
'altText': String(faq.text),
'template': {
'text': String(faq.text),
'type': 'confirm',
'actions': [{
'type': 'message',
'label': String(faq.yes.text),
'text': String(faq.yes.id)
},
{
'type': 'message',
'label': String(faq.no.text),
'text': String(faq.no.id)
}
],
},
}
break;
}
}
return msg;
}
/**
* FAQを取得する
* @param {String} faqId
*/
function getFaq(faqId) {
let faqList = getFaqList();
for (let i in faqList) {
let faq = faqList[i];
if (faq.id == faqId) {
return faq;
}
}
return null;
}
/**
* FAQ一覧を取得する
*/
function getFaqList() {
let faqList = [];
let lastRow = faqSheet.getLastRow();
if (2 < lastRow) {
faqList = faqSheet.getRange(2, 1, lastRow, 7).getValues();
faqList = faqList.map((row) => {
return {
id: row[0],
type: row[1],
text: row[2],
yes: {
id: row[3],
text: row[4],
},
no: {
id: row[5],
text: row[6],
},
}
});
}
return faqList;
}
/**
* LINEに応答メッセージを送信する
* @param {String} replyToken リプライトークン
* @param {Object} msgList メッセージリスト
*/
function sendLineReply(replyToken, msgList) {
let url = 'https://api.line.me/v2/bot/message/reply';
let options = {
'method': 'post',
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': `Bearer ${LINE_CHANNEL_TOKEN}`
},
'payload': JSON.stringify({
replyToken: replyToken,
messages: msgList
})
};
let response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText('UTF-8'));
}
-
execute
関数では、LINE Messaging APIからの通知内容により、処理を振り分けしています。message
の場合は、YES/NO選択内容を解析します。 - 質問または結果メッセージを作成して
sendLineReply
関数でLINE Messaging APIにPOSTします。
参考リンク
さいごに
ソースコードをGitHubに公開しています。
以上です。