
ワークフローを設計する際、つい「申請→承認→完了」という単純なステップの接続だけに意識が向きがちです。しかし実際には、休暇申請のようなシンプルなプロセスであっても、以下のような問題が発生することがあります。
- 上長が承認した後に、申請内容の問題(スケジュールの重複など)が発覚する
- チームのシフトバランスが崩れてしまう
- 日程変更が必要になった際に、やり取りが増えてしまう
本記事では、これらの問題が発生する前に軽減するために、標準のBPMNアイコンと少量のコーディングを用いて、Questetra BPM Suite上で構築する「スマートな」休暇申請ワークフローをご紹介します。
基本となる考え方は次の通りです。
機能するワークフローに複雑なロジックは不要です。必要なのは、適切なタイミングで適切なチェックを行うことです。
スマートな休暇ワークフローの目的
本ワークフローでは、単なる申請と承認にとどまらず、以下の要件を満たすことを重視して設計しています。
- 不備や問題を含んだまま申請が後続へ回るのを未然に防ぐ
- 不要な手作業でのチェックを減らす
- 遅延を自動的に処理する
- 申請者の負担を増やさない(使い勝手を維持する)
ワークフローの全体像
全体の構成は以下の通りです。
- 人が行う工程: 休暇内容の入力
- スクリプトタスク: カレンダーの空き状況を確認
- 排他ゲートウェイ: 希望日は空いているか?
- 人が行う工程: 上長による承認
- タイマー境界イベント: エスカレーション
- Google カレンダー:イベントの追加/メッセージ送信中間イベント(メール):更新と通知

以下、各ステップを設計の観点から詳しく見ていきます。
1. 人が行う工程 - 必要な情報を正しく収集する
最初のステップは人が行う工程で、申請者が必要事項を入力します。
代表的な入力項目:
- 休暇の日程
- 理由
- 不在時の連絡先(バックアップ担当者)
設計のポイント:フォームはシンプルに保ちましょう。申請方法が簡単であるほど、システムが形骸化せず、社内に定着しやすくなります。

このステップには、次のような設計上の意図が込められています。
ワークフローを効果的に機能させるには、プロセスの開始時点で正確なデータを収集することが重要です。
2. スクリプトタスク - カレンダーの空き状況を確認する
このステップこそが、ワークフローを「スマート」にする部分です。
上長が手作業でスケジュールを確認するのを待つのではなく、自動工程(スクリプトタスク)を組み込み、希望日がすでに予定で埋まっていないかどうかを自動でチェックします。
このステップの処理内容:
- 希望日を確認する
- カレンダーシステム(本例ではGoogleカレンダー)を照会する
- その日が「予定で埋まっている」か「空いている」かを判定する
実装上の補足:カレンダーの空き状況を確認するための専用のBPMNアイコンは存在しないため、外部サービスを呼び出して空き状況を判定するスクリプトタスクを使用します。
スクリプトタスクの技術的な詳細については、以下のコードブロックをご参照ください。
スクリプト(クリックして開く)
/*
* Questetra スクリプトタスク
* 申請された休暇期間が、既存のGoogleカレンダーの予定と重複していないかを確認する
*
* 入力:
* q_start_date (日付)
* q_end_date (日付)
*
* 出力:
* q_availability (選択項目、単一選択)
* - 選択肢ID: YES
* - 選択肢ID: NO
*
* 重要:
* - CALENDAR_ID を実際のIDに置き換えてください
* - ACCESS_TOKEN の取得方法を実際の方法に置き換えてください
* - 選択項目 q_availability の選択肢IDが、正確に「YES」「NO」であることを前提としています
*/
const CALENDAR_ID = "YOUR CALENDAR ID";
// 1) ワークフローのデータ項目から日付を取得する
const startDate = engine.findDataByVarName("q_start_date");
const endDate = engine.findDataByVarName("q_end_date");
if (startDate === null || endDate === null) {
throw new Error("q_start_date または q_end_date が未入力です。");
}
// 2) 開始日00:00:00から終了日23:59:59までの範囲を作成する
const timeMin = startDate.toString() + "T00:00:00+09:00";
const timeMax = endDate.toString() + "T23:59:59+09:00";
// 3) Google Calendar Events APIへのリクエストを作成する
const url =
"https://www.googleapis.com/calendar/v3/calendars/" +
encodeURIComponent(CALENDAR_ID) +
"/events";
let request = httpClient.begin();
request = request.authSetting("YOUR APP NAME");
request = request.queryParam("timeMin", timeMin);
request = request.queryParam("timeMax", timeMax);
request = request.queryParam("singleEvents", "true");
request = request.queryParam("orderBy", "startTime");
const response = request.get(url);
const status = response.getStatusCode() + "";
const body = response.getResponseAsString() + "";
engine.log("カレンダー確認ステータス: " + status);
if (status !== "200") {
throw new Error("Google Calendar APIエラー: " + status + "\n" + body);
}
// 4) レスポンスを解析する
const json = JSON.parse(body);
const events = json.items || [];
// 5) 空き状況を判定する
// 該当期間に予定が1件でも存在する場合は NO とする
const availableFlag = (events.length === 0) ? "YES" : "NO";
// 6) 選択項目 q_availability に結果を保存する
const result = new java.util.ArrayList();
result.add(availableFlag);
engine.setDataByVarName("q_availability", result);
engine.log("休暇の空き状況: " + availableFlag);
engine.log("検出された予定件数: " + events.length);
要件に応じたコードはAIを使って簡単に生成できるため、プログラミングに不慣れな設計者でも、複雑な自動化を容易に実装できます。
3. 排他ゲートウェイ - 希望日は空いているか?
自動工程の後には、排他ゲートウェイ(XOR分岐)を用いて、空き状況に応じてワークフローを分岐させます。
- 日程に空きがある場合 → 承認へ進む
- 日程が埋まっている場合 → 申請者に差し戻す

ここでは、以下の設計原則が適用されています。
早い段階でシステムによる判定を行うことが、ワークフローを「スマート」に保つ鍵となります。
補足:ゲートウェイの後には、「日時の更新」という名前の[データ更新]工程があります。これは、「開始日」および「終了日」に入力された日付を日時型のデータ項目に変換するだけの処理です。これにより、後続の[Googleカレンダー:イベントの追加]工程でこれらの値を選択できるようになります。これは、承認された申請を外部カレンダーに登録するために必要な処理です。
4. 人が行う工程 - 上長による承認
日程に問題がなければ、申請は上長承認(人が行う工程)に進みます。
- データの妥当性確認(空き状況のチェックなど)をシステムに任せることで、上長は「承認すべきかどうか」の意思決定に専念できます。
- これにより、承認プロセス全体がより迅速かつスムーズになります。
設計上のポイント:問題のある申請を事前にフィルタリングしておくことで、承認者の負担が軽減されます。
5. タイマー境界イベント - 承認の遅れを自動的にフォローする
承認業務において、タスクの滞留(承認待ちによる放置)はよくある課題です。
この問題に対応するため、承認タスクにはタイマー境界イベントを付加します。
- 上長が一定時間内(例:2日以内)に対応しなかった場合
→ 自動的に他の承認者(本例では部門長)にエスカレーションされます
この仕組みを取り入れることで、以下のような効果が得られます。
- 信頼性が向上する
- 特定の担当者のもとで承認作業が滞る(ボトルネックになる)のを防ぐことができる
また、対応可能なユーザーが存在しない場合にタスクをエスカレーションするためのエラー境界イベントを設定することもできます。
6. 自動工程(カレンダー追加とメール通知)
承認後、Googleカレンダー:イベントの追加が実行され、以下が行われます。
- 申請者が入力した日程を用いてカレンダーを更新する
同時に、メッセージ送信中間イベント(メール)により、以下が行われます。
- 確認メールを送信する
- 関係するチームメンバーに通知する
こうしたシステム上の処理は、自動工程に適しています。
以上で、休暇スケジュールの自動登録(承認時)、あるいは申請者への差し戻し(却下時)をもって、一連のワークフローが完了します
このワークフローの何が「スマート」なのか
シンプルな構成でありながら、この設計には次のような大きなメリット(導入効果)があります。
1. 問題を早期に発見できる
上長の承認待ちになる前に、システムがスケジュールの重複を自動検知(ブロック)します。
2. 手作業が減る
上長がわざわざカレンダーを開いて、手作業で空き状況を確認する手間をゼロにできます。
3. 遅延が自動的に処理される
自動エスカレーションにより、申請処理が滞ることなく確実に次の工程へ進みます。
4. 申請者の負担は増えない
裏側でシステムが動くため、ユーザー側は今まで通りシンプルな申請を行うだけで済みます。
ワークフロー設計者への重要なポイント
前述の通り、カレンダー確認のための専用BPMNアイコンは用意されていません。
BPMNは「具体的なシステム操作」よりも、「誰が(あるいは何が)その処理を担うかという役割分担」をモデル化することに主眼を置いています。
- 人が行う工程は、担当者によって操作や判断が行われるポイントを表します
- 自動工程は、システムによって機能やロジックが適用されるポイントを表します
- ゲートウェイは、これらの工程の結果に基づいてケースの流れを制御します
本ワークフローでは、空き状況の確認はスクリプトタスクによって行われ、希望日が定められた条件に照らして評価されます。その後、ゲートウェイによってタスクが適切に振り分けられます。
ワークフロー設計者にとって重要なのは、どこで判断を行うかを定義すること、責任を負う主体を明確にすること、そしてその後のプロセスの流れを決定することです。
まとめ
ワークフローの最適化は、シンプルな設計変更によって実現可能です。
自動工程を戦略的に配置し、判断ポイントを見直すことで、休暇申請のようなワークフローアプリの利便性は大きく向上します。
プログラミングなどの高度なITスキルを持たない担当者でも、こうした業務改善は十分に実現できます。
自動工程、スクリプトタスク、およびAPI連携に関する詳細情報は、関連する開発者向けブログシリーズをご参照ください。



