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
に都度設定する必要がある。