yuheijotaki.com

GASからSlack AppのBlock Kitでメッセージを送る & ボタンの値を受け取る

Block Kit を使ってGAS → Slackにメッセージを送り、Slackで押下したボタンの値を受け取る。 ※ WebhookではなくSlack APIを使用する場合。

attachments でもリッチなメッセージは送れるが、SlackはBlock Kit Builderなどを利用した blocks 押しらしい。

メッセージを送る

function sendToSlack() {
  const endpoint = 'https://slack.com/api/chat.postMessage'
  const token = 'MY-TOKEN'
  const headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + token
  }

  const blockKit = [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Block Kitのデモです。"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "ボタンの説明テキストが入ります。"
      },
      "accessory": {
        "type": "button",
        "text": {
          "type": "plain_text",
          "text": "ボタンのラベルテキスト",
          "emoji": true
        },
        "value": "MY-VALUE-01",
        "action_id": "button-action"
      }
    }
  ]

  const payload = {
    channel: 'MY-CHANNEL-NAME',
    blocks: blockKit,
  }

  const params = {
    method : 'post',
    headers: headers,
    payload : JSON.stringify(payload),
  }

  UrlFetchApp.fetch(endpoint, params)
}

payload が text の場合は、 token を payload に格納していけたが、 blocks の場合にはheaderに渡してあげないと成功しなかった。

押下したボタンの値を受け取る

function doPost(e) {
  const parameter = e.parameter
  const data = parameter.payload
  const json = JSON.parse(decodeURIComponent(data))
  const value = json.actions[0].value
  console.log(value) // 'MY-VALUE-01'
}

doPost() のGASは変更する度にデプロイし、デプロイされたGASのエンドポイントを Slack Appページ > Features > Interactivity & Shortcuts の Request URL に都度設定する必要がある。