開発情報・ナレッジ

投稿者: 学生インターン 2026年6月12日 (金)

Slackによる即時申請承認システム

学生インターンシップです! スパイラル株式会社の学生インターンとして、SPIRALを学習しながらユーザー目線で質問に答える活動をしています。 補足情報や調査結果の提供を行い、皆様のお役立てができればと思っています!
※学生が学びの一環として調査・まとめた内容です。
 正確な仕様や最新情報は、公式リファレンスをご確認ください。

はじめに

日々の教務の中で、たった数行の確認と返信だけの申請に対してわざわざメールを開いて返信するのが面倒だと思ったことはありませんか?
そこで今回はこれらの課題を解決すべく、SPIRALver.2×n8nを連携した「Slackによる即時申請承認システム」を作成します。
Slackに送信された申請内容に対し、ボタン一つで承認からメール通知までを完結させることで、申請関連業務の効率化とスピードアップを目指します!
所要時間は60分ほどで作成できるので、ぜひお試しください!

事前準備

連携を始める前に、以下のアカウントとサービスを用意しておく必要があります。

・n8nアカウント(リンクで14日間無料トライアル可能(2026年2月10日現在))

登録はこちらから

SPIRALの設定

フォーム作成の設定

今回はSPIRALver.2を使用して、申請内容を収集する申請フォームを作成します。

1. 右上の歯車から「アプリ管理」をクリックします。
2.「アプリ管理」の「+」ボタンからアプリを作成します。
3. 作成したアプリにDBを作成します。
  今回は簡単に下記3つの項目を作成します

表示名 識別名 タイプ
名前 f_name テキスト
メールアドレス f_mail メールアドレス
申請内容 f_request テキストエリア

4. 右上の歯車から「サイト管理」をクリックします。
5.「サイト管理」の「+」ボタンからサイトを作成します。
6.「ページ」の「+」ボタンからページを作成します。
7. 作成したページの「ブロック設定」から登録フォームを作成します。
  選択するアプリとDBには先ほど作成したものを選択してください。
  続くフィールド選択では、先ほど作成した氏名とご意見のフィールドを「使用」へ追加し、作成をクリックします。

これでアプリ作成からフォーム作成まで完成しました。

トリガ設定

次にフォームからDBに登録された情報をn8nに渡すためのトリガ設定を行います。

1. 作成したDBからトリガ設定をクリックします。
2. 非同期アクション設定の「+」をクリックし、PHP実行をクリックし作成します。
3. 下記コードを参考にPHPに張り付け、必要であれば識別名などをご自身の設定値に変更し保存します。
// 予約データの取得($SPIRALから必要な情報を取得)
$record = $SPIRAL->getRecord();

$reservationData = array(
    'form_id' => $record["item"]["_id"],
    'form_name' => $record["item"]["f_name"],
    'form_mail' => $record["item"]["f_mail"],
    'form_content' => $record["item"]["f_content"],
    
);

// n8nに送信するためのWebhook URL
$n8n_webhook_url = ' n8nで取得したURLを張り付けてください ';


// cURLを使用してn8nにデータを送信
$ch = curl_init($n8n_webhook_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reservationData));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 送信実行
$response = curl_exec($ch);
curl_close($ch);
?>
4. トリガの作成が完了したら、アクションの「有効化」をクリックし、実行可能にしておきます。
  これでトリガ設定が完成し、SPIRAL側の設定が完了しました。

Slackの設定

Slack API公式サイトにアクセスし、申請内容を送信するチャットの作成とn8nとSlackを連携します。

1. Slack API公式サイトにアクセスし、右端の「Create New App」をクリックします。
2. 「From scratch」を選択し、チャット名とワークスペースを入力してAPPを作成します。
3. 作成されたAPP内のFeaturesから「OAuth & Permissions」をクリックします。
4. Scopes内のScopesに「chat:write」を追加します。
5. OAuth & Permissionsのページ上部の「install to Workspace」をクリックするとxoxb-から始まる「Bot User OAuth Token」が発行されます。
  発行されたBot User OAuth Tokenは後ほど使用するため、コピーして保管しておきます。

最後にSlack内に設置するボタン設定を行います

1. 後ほど作成するn8n内の「webhook」に表示される「Production URL」をコピーします。
2. Slack APIで作成したAPP内の「Interactivity & Shortcuts」をクリックします。
3. Interactivityを「On」にし、Request URLに先ほどコピーした「Production URL」を張り付けます。
4. 最後に「Save Changes」をクリックし設定を保存します。
  これでSlack側の設定が完了しました。

n8nの設定

n8nにログインし、SPIRALまたはSlackと連携設定を行います。
始めにn8nを用いて、SPIRALから必要な情報を取得します。

1. n8nにログインし、右端の「+」ボタンをクリックします。
2. 右クリックし、「add node」から「webhook」を選択します。
 webhookにより、SPIRALからのデータをn8nで受け取ることが出来ます。
 webhookの設定は以下の通りです。 


HTTP Method : POST
Path : spiral-webhook
Authentication : none
Respond:Immediately

3. webhook内に設定されているproduction URLを、SPIRALのPHPに張り付けます。
4. 作成したwebhookの隣にスプレッドシートの「Append row in sheet」nodeを追加します。
5. Append row in sheetによって、SPIRALから得た申請情報を記録します。
  適当なスプレッドシートを作成し、下記Append row in sheetの設定を行います。


Credential to connect with : 作成したスプレッドシートのアカウントを接続
Resource : Sheet Within Document
Operation : Append Row
Document : 作成したスプレッドシート名
Sheet : 作成したスプレッドシート内のページ名
Mapping Column Mode : Map Each Column Manually

6. 作成したAppend row in sheetの隣にSlackの「Send a message」nodeを追加します。
  Send a messageでは、SlackにSPIRALから得た情報とボタンを送信します。
  Send a messageの設定は以下の通りです。


Credential to connect with : 送信先のSlackアカウント
Resource: Message
Operation : Send
Send Message To : Channel
Channel: Slack取得できる送信先チャンネルのIDを入力
Message Type : Blocks
Blocks : 下記コード参照


{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "📢 *【承認依頼】*\n申請内容を確認し、以下のボタンから回答してください。\n申請者:{{ $json['申請者名'] }}\n申請内容:{{ $json['ステータス'] }}"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "承認する ✅",
            "emoji": true
          },
          "style": "primary",
          "value": "{{ $json.ID }}:approve",
          "action_id": "approve_button"
        },
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "承認しない ❌",
            "emoji": true
          },
          "style": "danger",
          "value": "{{ $json.ID }}:reject",
          "action_id": "reject_button"
        }
      ]
    }
  ]
}

ここまでで、SPIRALで取得した情報をスプレッドシートに記録し、Slackに送信する設定が完了しました
次に、Slackからクリックされたボタンを読み取り、申請結果をメールで送信する設定を行います。

1. 先ほど作成したコードの同じページ内で右クリックし、「add node」から「webhook」を選択します。
2. webhookにより、Slackからのボタンメッセージをn8nで受信します。
  webhookの設定は以下の通りです。


HTTP Method : POST
Path : slack-interaction
Authentication : none
Respond: When Last Node Finishes
Response Date : First Entry JSON

3. 作成したwebhookの隣にスプレッドシートの「Get row(s) in sheet」nodeを追加します。
 スプレッドシートに格納された情報をGet row(s) in sheetでもう一度読み込みます。
 設定は以下の通りです。


Credential to connect with : Google Sheets account
Resource: Sheet Within Document
Operation : Get Row(s)
Document : 作成したスプレッドシート名
Sheet : 作成したスプレッドシート内のページ名
Mapping Column Mode : Map Each Column Manually

4. 作成したGet row(s) in sheetの隣に「if」nodeを追加します。
 Slackのボタンから受けとった承認するか、承認しないかで場合分けします。
 設定は以下の通りです。 


Conditions
(fx) : {{ $('Webhook').item.json.boby.payload ? JSON.parse($('Webhook').item.json.boby.payload).actions[0].value.split(':')[1] : ""}}
T : is equal to
(fx) : approve


5. 作成したifのTureにGmailの「Send a message」nodeを追加します。
 承認するだった場合、申請に対して承認することを伝えるメールを送信します。
 設定は以下の通りです。 


Credential to connect with : 送信するメールアカウント
Resource: Message 
Operation : Send
To : {{ $('Get rows(s) in sheat1').item.json.Email}}
Subject : ご申請いただいた件について
Email Type : Text
Message : ご提出いただいた以下の申請につきまして、内容を確認し承認しました。
     申請内容 : {{ $('Get row(s) in sheet1').item.json["ステータス"] }}
     本件については、このまま進めていただいて問題ございません。
     引き続き、よろしくお願いいたします。


6. 作成したGmailのSend a messageにSlackの「Send a message」nodeを追加します。
 確認のために、承認したことをSlackに送信します。
 設定は以下の通りです。


Credential to connect with : 送信先のSlackアカウント
Resource: Message 
Operation : Send
Send Message To : 送信先のSlackチャンネル
Channel :  送信先のSlackチャンネルID
Message Type : Simple Text Message
Message Text : 承認を受け付けました

7. 4で作成したifのFlaselに「if」nodeを追加します。
 このifでは「承認しない」をだった場合を場合分けします
 設定は以下の通りです。


Conditions
(fx) : {{ $('Webhook').item.json.boby.payload ? JSON.parse($('Webhook').item.json.boby.payload).actions[0].value.split(':')[1] : ""}}
T : is equal to
(fx) : reject


8. 5で作成したifのTureにGmailの「Send a message」nodeを追加します。
 承認しないだった場合、申請に対して承認しないことを伝えるメールを送信します。
 設定は以下の通りです。 


Credential to connect with : 送信するメールアカウント
Resource: Message 
Operation : Send
To : {{ $('Get rows(s) in sheat1').item.json.Email}}
Subject : ご申請いただいた件について
Email Type : Text
Message : ご提出いただいた以下の申請につきまして、内容を確認いたしましたが、
     いったん差し戻しと指していただきます。
     申請内容 : {{ $('Get row(s) in sheet1').item.json["ステータス"] }}
     詳細については担当者までご確認の上、お手数ですが再度申請をお願いいたします。


9. 8で作成したGmailのSend a messageにSlackの「Send a message」nodeを追加します。
 確認のために、承認したことをSlackに送信します。
 設定は以下の通りです。


Credential to connect with : 送信先のSlackアカウント
Resource: Message 
Operation : Send
Send Message To : 送信先のSlackチャンネル
Channel :  送信先のSlackチャンネルID
Message Type : Simple Text Message
Message Text : 却下しました。

これで、n8nの設定が完了しました。

動作確認

申請フォームに以下の内容を送信しました。


申請者:テスト花子
申請内容:業務用マウスの購入

フォーム送信後、Slackにメッセージが届き、承認するまたは承認しないボタンを押すと以下のような確認メッセージが届きました。

また、フォーム送信者のメールアドレスにも次のようなメールが届きました。

まとめ

今回は、Slackのボタン機能を使用した即時申請承認システムを作成しました。
このシステムを活用することで、申請に対してボタン一つで簡単かつ、いち早く対応することが可能となります。
スプレッドシートやドライブなどをさらに活用することで、貸出申請や、資料チェックなどへの応用やすることができ、さらなる業務効率化に期待できます。
ローコード同士でとても分かりやすく視覚的に操作することができるので皆様もぜひお試しください。
解決しない場合はこちら コンテンツに関しての
要望はこちら