Slackのみで稟議完結

今回作ったもの

Slackとkickflowを用いて、申請者にワークフローサービス(kickflow)を認識させる事なく、稟議を完了させる。

画像1

レシピ

トリガー:Slackワークフロー
ワークフロー:kickflow
繋ぎ込み:GoogleAppsScript

作った経緯

・特定部署しかワークフローサービス(kickflow)を利用してない → 稟議ってどうやって起票するんだっけ? → kickflowを使え?どうやってログインするの、どうやって起票するの、どうやって・・・ 
からの
Slackから稟議が起票できると良いなぁ → 私が作りました

突然、利用してないサービスをいきなり使えと言われても混乱します。
それなら、日常的に利用しているSlackで何とかしたい。
そんな気持ちで作りました。

画像2

メリット

・稟議申請者のアクセス先は、Slackのみ(起票→完了まで)
 なのでもう迷わない。
 人数分のkickflowライセンス買い足しもいらない(小声)。
・承認者もSlackのみで完結(※)
 秒速の承認を実現。
 ※一部、特殊なワークフローを組んだ場合のみ、該当パターンのAPIが作成されていないため、承認者がkickFlowへログインして作業する必要あり(2021/07/01時点)

デメリット

・GASの箇所がボトルネック(エラー吐いても申請者は成否が不明)
 そのため、申請が成功したか確認するステップが必要
→弊社では、Slackワークフローにて最初の承認者へ申請アラートを飛ばして漏れを防いでいます。

注意ポイント

今回作ったワークフローは代理申請という形になります。
個人アカウントで発行したトークンを利用するので、全稟議がトークン発行者からの申請と見なされます。

稟議は基本的に「職務権限規程」をベースに作られるため、
”誰が申請したか”
”どの規程をベースとしたワークフローを用いたか”
”誰に承認されたか”

が重要となります。
”誰が申請したか”の部分が全て代理申請となるので、
エビデンスが必要となる稟議には向いておりません。

例えば、秘書さんが役員の経費申請を代理で行うとか
経理が代理申請していた小口現金精算を、本人に申請させるとか
オリジナルワークフロー(規定関係なし)に利用するとか
そんな使い方になるかと。

作ってみよう

では実際に作っていきましょう。


今回は、
申請者はGoogleフォームから申請 → Slackの総務チャンネルに転記 → 記載された情報を元に総務がkickflowで稟議を起票 → 承認完了したら総務がSlackで申請者へ連絡

という流れで運用していた備品購入フローを

申請者はSlackワークフローから申請 → 承認完了 → 申請者のDM(Slack)へ稟議完了連絡

というフローに改善した時の物となります。
細かーく設定を記載すると仕様やAPIが変更された時に、この記事との乖離が大きくなるので、ざっくりベースです。ご了承くださいませ。
やった事は2つ
1:Slackワークフローの作成
2:スプレッドシートのトリガーとGoogleAppsScriptの作成

1:Slackワークフローの作成

作り方については、マニュアルが公式から出てますので、必要項目だけ。

トリガー:アップデートによりショートカットコマンドが見やすい位置にあるので、こちらからSlackワークフローを起動する設定がおススメ。

画像3

フォームの作成:稟議申請に必要なデータを入力させる、フォームを作成します。注意ポイントとしては、KickFlowのフィールドとSlackフォームのフィールドが同じ型で作る必要があります。
(とは言っても、現状はSlackフォームで選択できるフィールドタイプが限定的で、kickflow側と同期出来るのでそこまで気にする必要は無いかも)

画像4

通知:GASが動かなかった時でも稟議を検知出来る様にするため、「DMか特定チャンネル」にメッセージ投稿する処理を付けておきましょう。

画像5

転記するスプレッドシートの選択:転記する先のスプレッドシートを選択し、転記する内容をどの列に入力するのか指定します。
条件
・kickflowのフィールド順序と合わせる
・誰からの申請なのか分かる様に、申請したユーザ名を入力する行を作成
 (変数”ショートカット名”をクリックしたユーザ でピックアップ可能)

画像6

2:スプレッドシートのトリガーとGoogleAppsScriptの作成

1で作成したSlackワークフローを実行すると、こんな感じにスプレッドシートへ転記されます。

画像7

そこでGASを以下の様に書いて、トリガーを「スプレッドシートから - 変更時」に設定。

function Welfare_request() {

//全データを取得するシート情報を取得
var spreadsheet_id = SpreadsheetApp.openById(‘SheetID’);//スプレッドシートID格納
var sheet_name = spreadsheet_id.getSheetByName('sheet_name');//シート名を格納
const lastrow = sheet_name.getLastRow();
const Kick_Data = sheet_name.getRange(lastrow,1,1,5).getValues();

var kickflow_token = "****"; // 発行したKickflow Token
var kickflow_uri = "https://api.kickflow.com/v1/tickets"; //エンドポイントを取得

//payload の設定
const payload = {
  "status":"in_progress",
  "authorTeamId":"****",
  "workflowId":"****",
  "slipItems": [],
  "inputs":[
    {"formFieldCode”:”****,”value":Kick_Data[0][0]},
    {"formFieldCode":"****","value":Kick_Data[0][1]},
    {"formFieldCode":"****","value":Kick_Data[0][2]},
    {"formFieldCode":"****","value":Kick_Data[0][3]},
    {"formFieldCode":"****","value":Kick_Data[0][4]}
  ],
};

//paramの設定
const kick_params = {
  'method' : 'post',
  'contentType' : 'application/json',
  'payload' : JSON.stringify(payload),
  "headers": { 
    Authorization: "Bearer " + kickflow_token 
    }
};
//リクエストの処理
var kick_response = UrlFetchApp.fetch(kickflow_uri,kick_params);

}

これだけ。

後は承認者がSlack上で承認するのみ。

画像8

テスト運用が成功しただけで、リリースはこれからなのですが、これで総務や申請者の負担が減れば良いな、と思ってます。

以上です。


この記事が気に入ったらサポートをしてみませんか?