13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめに

LINE を使用して YES/NOチャートを行うBOTを作成しました。
質問にYES/NOで答えると次の質問に進みます。最終的に結果が表示されます。
faq_3.png

faq_2.png

faq_1.png

スプレッドシートでは、IDと質問内容、YES選択時のID、NO選択時のIDを指定します。
YES選択時のIDが次の質問内容を表示するIDとなります。
(typeのconfirmは質問、messageは結果メッセージ)

faq.png

事前準備

詳しくはこちら

  1. 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に公開しています。

以上です。

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?