GASを使ってSlackにメンション付きで投稿したい

はじめに

Google Apps Script から Slack API を呼んでメンション付きで特定のチャンネルに投稿してみたのでまとめます。

Slack API

Incoming Webhooks の URL を取得

まずは、 Incoming Webhooks の設定をする必要があります。

このページに従って進めれば簡単につくれます。
api.slack.com

具体的には、まず、まだ持っていないならここから Slack App を作ります。
続いて、 Incoming Webhooks を Activate します。offからonにするだけ。
最後に、Add New Webhook to Workspace を押して、投稿したいチャンネルを選んだら、Webhook用のURLが用意されます。

メンション付きで投稿してみる

丁寧にサンプルも用意されているので試しにSlackに投稿してみます。
成功すれば、curlの返却としては ok が返ってきて、確かにslackに投稿されているのが確認できます。

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

続いて、 @ohshige というユーザにメンション付きで送ってみます。
確かに投稿はできていますが、メンションとしては有効になっていないことがわかります。

curl -X POST -H 'Content-type: application/json' --data '{"text":"@ohshige\nHello, World!"}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

メンション付きで投稿するためには、まずそのユーザのメンバーIDというものが必要になります。
そのユーザのプロフィールの「...」を選択すると「メンバーIDをコピー」という箇所があるので、そこからコピーすると9文字程度の文字列が取得できます。

f:id:ohshige:20190609182345p:plain:w400

メンバーIDが「ABCXXXXXX」だったとすると、メンションするためには <@ABCXXXXXX> と記述する必要があります。
これで、メンション付きで投稿できます。

curl -X POST -H 'Content-type: application/json' --data '{"text":"<@ABCXXXXXX>\nHello, World!"}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

Google Apps Script から Slack に投稿する

Google Apps Script の詳しい使い方は省きますが、関数内で UrlFetchApp.fetch() を使うだけです。

以下のようにコードを記述します。

function doGet(e) {
    var data = {
    'text': '<@ABCXXXXXX>\nHello, World!'
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(data)
  };
  UrlFetchApp.fetch('https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX', options);
}

あとは、公開して、払い出されたURLにGETでリクエストすればSlackにメンション付きで投稿されます。

おわりに

今はもうエンジニアでなくてもGASやSlack Botなどを使って簡単に効率化できるようになっていて、良い時代だと思います。
使えるものはどんどん使って便利な日々にしていきたいです。