Google Apps Scriptを利用する
今回の記事では前回実際に記述したGASで利用できるメソッドや関数について書いていきます。
※ GASを利用したBOT(LINE, Twitterなど)の作成について、GAS以外での環境の準備についてはこちら
GASでのデバッグ
GASの開発環境ではJavaScriptでデバッグの時に使用しているconsole.logが使用できないようです。その代わりにLogger
というものが用意されているようなのでこれを使用します。
function test(){ Logger.log("test"); }
console.logのように.logで文字列を入力するとログを残すことができる。
この関数を作成し保存、メニューの「関数を選択」でtestを選択し、その左にある三角を押す。
これにより関数を実行することができる。実行後には何も表示されないが、そのまま MacOSで「⌘ + return」でログの表示ができる。
そこに実行時間とtestの文字列が表示されていたら正しいログが出力できている。
GASにアクセス(HTTP method: GET)するための関数の作成
function doGet() { return ContentService.createTextOutput("success"); }
説明は前の記事
メソッドの名前からの想像と、ブラウザで開いた時に文字列を確認できることから引数で指定した文字列をページに表示できる。
スプレッドシートに書き込むための関数
LINE BOTのAPIでは、ユーザーから送られたメッセージがPOSTでWebhookAPIに送信される。
デバッグで使っていたLoggerは実行環境での確認には使用できるが、実際にLINEのAPIを通して送られてくるWebhookのデータの中身は閲覧できない。
その為、データをスプレッドシートに書き込む関数を作成。
- GASを作成する前に作ったスプレッドシートを開いて、1つ目のシート名(下の方にある)を"シート1"から、"webhook"に名称変更
- 関数を使用してスプレッドシートに書き込みを行うにはスプレッドシートのIDが必要。GASで参照するために控えておく。
- IDはスプレッドシートのURLに含まれている。
https://〜省略〜/d/{ここがID}/edit#gid=0
GASで任意のテキストをシートにまとめるための関数を作成
var spreadsheet = SpreadsheetApp.openById("{シートID}"); function appendToSheet(text){ var sheet = spreadsheet.getSheetByName('webhook'); sheet.appendRow([text]); }
appendTosheet(text)
を実行することで、スプレッドシートに送信されたテキストを書き込むことができる。変数spreadsheet
自体は他の関数でも使用することがあるため、関数の外で宣言して一番先にしておく方が取り回しがしやすいです。
変数spreadsheet
とsheet
はそれぞれこれまで準備してきた中で設定してきた名前を用いているので、それらを呼び出して取得し、変数に代入していることがわかります。
appendRow()
では変数sheet
(webhookシート)に引数で渡された値をシートのレコードに追加している。
動作確認するためにdoGet関数でappendTodsheet()
関数を呼び出し。
function doGet() { appendToSheet("test"); }
メニューバーの「実行」から「関数を実行」→「doGet」をクリックすると、その場でコード動作確認ができる。
※ この時「アプリが確認されていない」という別ウィンドウが表示されてしまった場合は「詳細」→「{BOT名}(安全ではない)に移動」をクリックすることでGoogleアカウントへのアクセスに対してドライブのスプレッドシートなどの編集や削除ができるようにリクエストをする画面が出てきます(今回、BOTは自分で作っているものなので許可しています)。
許可した後にID指定先のスプレッドシート(今回はwebhookという名前のシート)を開いて、シートに文字列が入力されていれば成功(今回は関数呼び出しの引数に"test"
という指定された文字列を送信しているので test
と入力されている)。
POSTに反応する関数の作成
GETと同じようにdoPost
という関数で作成することができます。
- POSTで送信されたデータの中で、LINE APIで利用できる部分の取得
webhookData
- そこから送信されたテキストを取得
message
- メッセージに対してBOTがメッセージを返信するのに、送られてきたメッセージのtokenの取得が必須
replyToken
- BOTが自発的にメッセージを送信する場合には機能に差がある。
これらを利用してPOSTが実行された場合に必要な情報を返すコード
function doPost(e) { var webhookData = JSON.parse(e.postData.contents).events[0]; var message,replyToken; message = webhookData.message.text; replyToken = webhookData.replyToken; return sendLineMessageFromReplyToken(replyToken,message); }
returnでの返り値にはAPIを叩く関数が記述されており、そちらの実行結果が返り値となる。
このsendLineMessageFromReplyToken()
では取得したトークンreplyToken
とテキストmessage
を引数として渡している。
受け取った情報を元に送信元に返信を行う関数sendLineMessageFromReplyToken()
では
var channel_access_token = "管理画面から取得したアクセストークン"; function sendLineMessageFromReplyToken(token,replyText){ var url = "https://api.line.me/v2/bot/message/reply"; var headers = { "Content-Type" : "application/json; charset=UTF-8", "Authorization" : "Bearer " + channel_access_token }; var postData = { "replyToken" : token, "messages" : [{ "type" : "text", "text" : replyText + "なるほど、やりますねぇ!" }] }; var options = { "method" : "POST", "headers" : headers, "payload" : JSON.stringify(postData) }; return UrlFetchApp.fetch(url, options); }
コードの参考はLINE公式APIリファレンス-Messaging APIに載っています。
今回は応答メッセージを送るの辺りが該当箇所に近いのかな。
- 1行目は変数宣言し、発行したトークンを代入。
- 2行目のfunctionから下は、先ほどのAPIが呼び出された時の処理の内容が書かれている。
- 変数
url
には応答メッセージ用のAPI URLを代入。これは決まったURLのようです。 - 変数
headers
はJSONリクエストについて。Content-Type
ヘッダにはtext/json
もしくはapplication/json
というMIMEタイプを指定する必要がある。charset=UTF-8
はHTMLとかでもよく見る文字コードってやつ。"Authorization" : "Bearer "
の部分はAuthorizationヘッダを用いた認証(BASIC, Digest, Bearer)。Bearerでの認証はトークンを用いて認証をすることを想定して行うことが多いようです。HTTPでのヘッダにスキームとして指定でき、今回のようにトークンをセットにして指定する。形式はtoken68と決められているようです。 - 変数
postData
には引数で受け取ったreplyToken(送信元のwebhookDataのトークン)や本文が代入されている。 - 変数
options
にはHTTPメソッドの形式と最初に宣言したHTTPヘッダの内容、トークンや本文などをJSONの文字列に変換されたものが代入されています。 - 最後の
return
ではGASから外部APIにデータを送信する場合のUrlFetchApp
のfetch
メソッドを利用。
- 変数
これで、LINEの管理画面から取得するアクセストークンと前述のリプライトークン、送りたいテキストをLINE APIの形式に沿って送信することで返信できる。自分形の要約では普通にLINEで投稿するとbotがその形式にそって返信するって感じ
この時、リプライトークンを利用して送信先を指定しているため、返信相手の指定は必要ない
。
完了したら
一通り入力できたら内容を保存し、更新して公開。LINE BOTが実際に動作するか、確認してみる。(ここでもアカウント外部へのアクセスに対して許可するための画面が出てます)
うまく動作しない場合
※ Loggerやスプレッドシート書き込みを利用して送信されている内容などを確認し、デバッグを行っていく。
function appendToSheet(text){ var sheet = spreadsheet.getSheetByName('webhook'); sheet.appendRow([text]); } function doGet(test) { appendToSheet(test); } // 調べたい変数などを関数を利用して書き出す 〜省略〜 var webhookData = JSON.parse(e.postData.contents).events[0]; doGET(webhookeData); 〜省略〜
実際に送信された内容をスプレッドシートに書き出すならこんな感じか。
複数ある場合は
参考にさせていただいた記事
プログラミング初心者でも無料で簡単にLINE BOTが作れるチュートリアル
一つ一つ説明が丁寧で、実装にあたりとても助かりました。
基本的な使い方や使用できるメソッド等をもっと学習して色々と機能を追加したい所存。
したらな❗️ 👋