(BluePrism)ポケモン図鑑を作る ~Part13 Event APIの追加とGAS記述編~
はいどうも。おむおむです。
psping、便利!
docs.microsoft.com
www.amazon.co.jp
さて、前回はプロセスをWebサービスとして公開しました。
newgraduate19-rpa.hatenablog.com
今回は、Slack Event APIとGASを組み合わせて
諸々の処理をする仕組みを作っていきたいと思います。
(今回もBlue Prismは出てきません、、、)
Eventを追加する
まず、SlackのEventを追加します。
Event Subscriptions→Subscribe to bot events→
Add Bot User Event→app_mentionを選択します。
required scopeでapp_mentions:readがありますが、
Save Changesをクリックして画面上部に表示される
reinstall your appをクリックして、承認すると
自動的にbotのscopeに追加されます。
そして、app_mentionイベントでPOSTされるデータは
以下を参照してください。
api.slack.com
botに対してメンションされた際に
Request URLに対してPOSTされるのは以下の通りです。
{ "type": "app_mention", "user": "<botにメンションしたユーザのID>", "text": "<botのユーザID> <メンションの後のコメント>", "ts": "<タイムスタンプ>", "channel": "<チャンネルのID>", "event_ts": "<イベントのタイムスタンプ>" }
送信されてくるJSONを確認
こいつも、以前書いた記事↓のように
パースしていい感じに料理します。
newgraduate19-rpa.hatenablog.com
上の記事を参考にして、
JSONをパースして、一旦中身がどうなっているか
A1セルに書き出してみたいと思います。
function doPost(e) { var params = JSON.parse(e.postData.getDataAsString()); const cell = SpreadsheetApp.getActiveSheet().getActiveCell() cell.setValue(params) }
Slackからはこんな感じでメンションしてみます。
すると、A1セルにこんな感じでテキストが入ります。
GAS側でパースされると、「:」が「=」になったりして
厳密にはJSONではない形になるみたいですね。
あとはこいつを料理していきます。
メッセージ部分のデータの確認
今回使用したいのは
@○○のあとのメッセージ部分なので、
そこだけ上手いこと抽出するようGASを書いていきます。
まずは、先ほど送信したメッセージの部分だけを抽出し、
またA1セルに書いてチェックしてみましょう。
GASはこんな感じ↓
function doPost(e) { var params = JSON.parse(e.postData.getDataAsString()); const cell = SpreadsheetApp.getActiveSheet().getActiveCell(); var msg = params.event.text; cell.setValue(msg); }
A1セルの値はこんな感じ。
<@U0166DXN7E1> おむおむです
まあ、予想通りですね。
あとは、ここから
1. <>で囲まれた箇所の削除
2. 残った箇所の前後の空白、改行の削除
の処理を追加していきたいと思います。
正規表現を使用した置換
まず、GASでテキストの置換を行うには、
replaceメソッドを使用します。
引数としては以下の通り↓
string.replace(置換対象の文字列, 置換後の文字列)
今回は、置換対象の文字列のところに
正規表現を指定したいと思います。
詳細はこの記事読めば何となくわかります。↓
tonari-it.com
今回は、正規表現にマッチした部分を削除したいので、
replace(正規表現, '')
とします。
正規表現は、上の記事に倣って新たに
RegExオブジェクトを作成します。
別に複雑なことをしたいわけではないですが、
明確に「正規表現これやで!」とした方が後ほどわかりやすいので。
今回マッチさせたいのは、
<>で囲まれている、
一文字以上の文字列の繰り返しなので、
<.*?>としています。
具体的なコードは後ほど。
空白を削除
<>で囲まれた部分の置換に成功したら、
次は前後の空白(空白、改行)を削除します。
これも簡単、
trimメソッドを使用します。
string.trim()
って感じですね。
上の正規表現も含め、
最終的にはこんな感じになります。
function doPost(e) { var params = JSON.parse(e.postData.getDataAsString()); const cell = SpreadsheetApp.getActiveSheet().getActiveCell(); var msg = params.event.text; // 正規表現作成 const reg = new RegExp('<' + '.*?' + '>', 'g'); // 正規表現にマッチした箇所と、残った箇所のトリム msg = msg.replace(reg, '').trim(); cell.setValue(msg); }
これで、アクティブセルの中に
@アプリケーション名の後に記述したテキストが
前後をトリムされた形で取得されます。
今回はここまで!
まとめ
・GASっておもしれー
・あと3記事以内で完結させたい。。。
・ちょっとPythonをやる機運が高まっている
今月中には書ききるぞ!
って先月も言ってた気がする。。。