RPAエンジニアの雑記

RPA(Blue Prism)について色々記載してます。

(BluePrism)ポケモン図鑑を作る ~Part13 Event APIの追加とGAS記述編~

はいどうも。おむおむです。

psping、便利!
docs.microsoft.com
www.amazon.co.jp

さて、前回はプロセスをWebサービスとして公開しました。
newgraduate19-rpa.hatenablog.com

今回は、Slack Event APIGASを組み合わせて
諸々の処理をする仕組みを作っていきたいと思います。
(今回もBlue Prismは出てきません、、、)

Eventを追加する

まず、SlackのEventを追加します。

Event SubscriptionsSubscribe to bot events
Add Bot User Eventapp_mentionを選択します。
f:id:newgraduate19:20200709225803p:plain

required scopeapp_mentions:readがありますが、
Save Changesをクリックして画面上部に表示される
reinstall your appをクリックして、承認すると
自動的にbotのscopeに追加されます。
f:id:newgraduate19:20200709230539p:plain

そして、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からはこんな感じでメンションしてみます。
f:id:newgraduate19:20200712132531p:plain

すると、A1セルにこんな感じでテキストが入ります。
f:id:newgraduate19:20200712132754p:plain

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をやる機運が高まっている

今月中には書ききるぞ!

って先月も言ってた気がする。。。