【GAS】SlackのスラッシュコマンドをGASで処理する方法

Google Apps Script

GASとSlackの連携のなかで、スラッシュコマンドをGASで処理する方法の紹介です。
スラッシュコマンドをGASで受けられると、Google DriveとかGmailとか、Googleが提供しているアプリ群との連携の幅が広がりそうですね。

Appの作成と設定

こちらのページがとても参考になりました。

【2021年版】GASとSlack APIでボットを作成しチャンネルにメッセージを自動投稿する方法 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
Google Apps Script(GAS)とslack APIを活用することで、簡単にボット投稿が実装可能です。 今回、Slack APIを利用したGASによるSlackボット...

GASボット という名前で App を作成しました。

スラッシュコマンドの設定

こちらについても、以下のサイトを参考に行うことができます。

404 Not Found

以下の画像のようにスラッシュコマンドを設定しました。

上記画像の Request URL は、Slack上で /gas と送信した時に行われる POST Request の送信先です。ここに、後述で行うウェブアプリのデプロイで取得したURLを記載します。

このURLにはPOSTでRequestが送信されることに注意です。なので、後述するGAS側でも doPost 関数で受けてあげる必要があります。

GASコード

ここからが本題です。
まずはコードの全体をお見せします。

function doPost(e) {
  const command = e.parameter.text;
  const message = `コマンドを受け付けました。 ${command}`;

  return ContentService
    .createTextOutput()
    .setMimeType(ContentService.MimeType.TEXT)
    .setContent(message);
}

先述したように、doPost 関数で POST Request を受ける形となっています。

このコードをウェブアプリとしてデプロイします。
この時に、アクセスできるユーザーは 全員 にしておかないと、Slackからの POST Request を受け取ることができないので注意が必要です。

デプロイしたURLはスラッシュコマンドの設定で使ってください。

では、詳細を噛み砕いていきますね。

data payload

スラッシュコマンドによって送信された POST Request には以下のような data payload が含まれています。
(参考:https://api.slack.com/interactivity/slash-commands#app_command_handling

token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
&api_app_id=A123456

このpayloadの中にある、 text がポイントです。
text には、以下のようにスラッシュコマンドを入力した場合、 command test という文字列が入ってきます。

/gas command test

これをGAS側では以下のように受け取ります。

const command = e.parameter.text;

戻り値はテキスト形式

Slack側への Response はテキスト形式にしてやるといい感じなので、以下のように ContentService.createTextOutput() を使うと、テキスト形式のレスポンスを作ることができます。

ContentService
    .createTextOutput()
    .setMimeType(ContentService.MimeType.TEXT)
    .setContent(message);

これを return してあげる形になります。

結果

こんな形で、スラッシュコマンドを送信すると、、、

返事がきちんと返ってきます。

終わりに

SlackのスラッシュコマンドをGASで処理する方法についてでした。
色々と応用が効く内容だと思うので、是非とも試してみてください!

タイトルとURLをコピーしました