はじめに
こんな感じのSlackアプリを作る方法です。
経費申請をActionから行う必要は全く無いので、記事用のいい例が思いつかなかっただけです。(経費申請ならInteractive messages
を使ったほうが自然そう)
今回はGoogle App Script
で処理自体は書いていきます。
作成方法
処理を書くファイルの作成
今回はGoogle App Script
を使用するので、Google Drive
からGoogle App Script
を選択してスクリプトファイルを作成する。
一旦このまま何もせずにウェブアプリケーションとして導入...
をクリックする。
アプリケーションにアクセスできるユーザー
を全員(匿名ユーザーを含む)
にして導入
をクリックする。
現在のウェブアプリケーションのURL
はどこかにコピーしておく。
Slack App側の設定
アプリの作成
slack apiにアクセスし、
右上のYour Apps
をクリックし、Create New App
をクリックする。
作成するアプリの情報を入力してCreate App
をクリックする。
Incoming Webhooksの設定
メッセージをSlackに投稿するための設定。
左側のメニューからIncoming Webhooks
をクリックし、Activate Incoming Webhooks
をOn
に変更する。
下の方のWebhook URLs for Your Workspace
のAdd New Webhook to Workspace
をクリックする。
メッセージの投稿先のチャンネルを選択し、許可する
をクリックする。
投稿先のチャンネルを選択し、許可する
をクリックする。
Interactive Componentsの設定
今回はメッセージのメニューから申請画面を立ち上げるのでその設定を行う。
左側のメニューからInteractive Components
をクリックし、Interactivity
をOn
に変更する。
Request URL
にはGoogle App Script
をウェブアプリケーションとして公開したときのURLを入力する。
Actions
のところからCreate New Action
をクリックし、以下を入力して登録する。
-
Action Name
・・・メニューに出てくるアクション名 -
Short Description
・・・短いアクションの説明 -
Callback ID
・・・このアクションが行われた際のペイロードに含まれるコールバックID
Bot Userの設定
今回のアプリで使用するボットを作成する。
左側のメニューからBot Users
をクリックし、以下を入力して登録する。
OAuth & Permissionsの設定
どのAPIの使用を許可するかなどの設定。
アプリの再インストール
以下のようなメッセージが上に出ていると思うので、click here
をクリックしてワークスペースにアプリを再インストールする。
処理の作成
Google App Script
を編集して、具体的な処理を作成する。
/**
* Slackからのリクエストを受ける処理
*/
function doPost(e) {
var params = e.parameter;
var data = params.payload;
var json = JSON.parse(decodeURIComponent(data));
var type = json.type;
var trigger_id = json.trigger_id;
var response = {};
if (type === 'message_action') {
// メッセージアクションがあった場合の処理
var url = 'https://slack.com/api/dialog.open';
// トークン
var token = 'xoxp-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx';
var payload = {
"token": token,
"trigger_id": trigger_id,
"dialog": JSON.stringify({
"callback_id": "dialog",
"title": "経費申請",
"submit_label": "申請",
"notify_on_cancel": true,
"state": "Limo",
"elements": [
{
"type": "text",
"label": "申請者名",
"name": "name",
},
{
"type": "text",
"label": "金額",
"name": "amount",
"subtype": "number"
}
]
})
};
var headers = {
"Authorization": "Bearer " + token
};
var options = {
"method" : "post",
"headers": headers,
"payload" : payload
};
UrlFetchApp.fetch(url, options);
return ContentService.createTextOutput();
} else if (type === 'dialog_submission') {
// ダイアログでサブミットボタンを押したときの処理
var url = '[Incoming Webhooksで作成したWebhook URL]';
var payload = {
"attachments": [{
"color": "#36a64f",
"pretext": "以下で経費の申請がありました。",
"fields": [
{
"title": "申請者名",
"value": json.submission.name,
"short": false
},
{
"title": "金額",
"value": json.submission.amount,
"short": false
}
]
}
]
};
var options = {
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(payload)
};
response = UrlFetchApp.fetch(url, options);
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
}
スクリプトに出てくるトークンはOAuth & Permissions
のOAuth Access Token
に記載されているものを指定。
再度、新しいバージョンのウェブアプリケーションとして公開し直さないといけないため、プロジェクトのバージョン
をNew
にして登録する。
アプリの画像などを設定する
アプリのアイコン画像などを設定する。
slack api
の左側のメニューからBasic Information
をクリックし、Display Information
でアプリ名やアプリ画像を設定する。
動作確認
するとダイアログが表示されるので、情報を入力して、申請
をクリックする。
おわりに
ダイアログがなかなか表示できなくてAuthorizationヘッダーつけないといけないことに気づくまで時間がかかった。
今回は単に申請内容をSlack上に投稿する形にしましたが、実際はGASからスプレッドシートに書き込んだり、その他のサービスを経由してどっかに登録したり・・・をすれば良いと思います。