Garoonのワークフロー承認時に自動で施設予約にスケジュール登録する

Garoon のワークフロー承認時に、自動で施設予約にスケジュール登録する方法を紹介します。Garoon JavaScript API および Garoon REST API を使います。

動作イメージ

利用者がワークフローで申請する。

wf-to-booking-09.jpg

担当者が申請を承認する。

wf-to-booking-10.jpg

施設予約に自動で追加される。

wf-to-booking-11.jpg

施設予約の準備

施設予約に施設を準備します。ワークフローやAPIで「施設コード」を使うため、「施設名」と「施設コード」を同一にしておきます。ワークフロー承認者が、施設に予約を追加できる権限も必要です。

wf-to-booking-01.jpg

ワークフローの準備

予約申請用のワークフローを準備します。

必須項目

申請フォームの項目として、施設予約への登録に使う次の6項目を追加します。APIプログラムから取得するため項目コードを以下の値に設定します。

予約名

施設予約の「タイトル」に転記します。

タイプ 項目名 項目コード 項目の条件
文字列(1行) 予約名 Title 必須項目にする

開始日時

施設予約の「日時」に登録します。

タイプ 項目名 項目コード 表示形式 初期値 項目の条件
日付 開始日時 From 日付と時刻 指定しない 必須項目にする

終了日時

施設予約の「日時」に登録します。

タイプ 項目名 項目コード 表示形式 初期値 項目の条件
日付 終了日時 To 日付と時刻 指定しない 必須項目にする

利用施設

選択した「施設」に予約を登録します。

タイプ 項目名 項目コード メニュー項目 項目の条件
メニュー 利用施設 Facility

直接入力

対象の施設コードを列挙

必須項目にする

メニュー項目には施設予約で設定した「施設コード」を列挙します。

wf-to-booking-02.jpg

使用部署

施設予約の「メモ」に転記します。

タイプ 項目名 項目コード 項目の条件
文字列(1行) 使用部署 Organization 必須項目にする

予約担当者

施設予約の「メモ」に転記します。

タイプ 項目名 項目コード 項目の条件
文字列(1行) 予約担当者 Name 必須項目にする

追加項目

その他の項目の追加や変更は任意です。施設予約には転記されません。例では次の2項目を追加しています。

補足資料

タイプ 項目名 項目コード 最大ファイル数
ファイル添付 補足資料 3

連絡事項

タイプ 項目名 項目コード サイズ
文字列(複数行) 連絡事項 40桁 × 3行

経路設定

「専用経路を設定する」から「承認経路」を追加します。例では次のように設定しています。

経路種別 経路変更の許可 初期値 申請者の初期値変更の許可
承認(誰か1人) 無効 (適宜) 無効

初期値には、予約を承認する組織やユーザを追加します。

APIプログラムの設置

次の Javascript ファイルを wf_to_booking.js として保存します。文字コードは UTF-8 にします。

/**
 * ワークフロー承認時に施設予約に登録するスクリプト
 *
 * 2024.1.11 申請番号、使用部署、予約担当者をメモに追加
* 2023.12.27 初版
*
* 使用方法
* https://www.cit.t.kyoto-u.ac.jp/ja/tech/blog/tips/wf-to-booking
*/ (function() { 'use strict'; (function($) { // ワークフロー承認イベントで起動 garoon.events.on('workflow.request.approve.submit.success', (event) => { // 申請内容を取得(タイトル、施設コード、開始日時、終了日時、申請番号、使用部署、予約担当者) const request = event.request; const booking_title = request.items.Title.value; const booking_code = request.items.Facility.value; const booking_start = luxon.DateTime.fromISO(request.items.From.value.date + 'T' + request.items.From.value.time + ':00').toUTC().startOf('second').toISO({suppressMilliseconds: true}); const booking_end = luxon.DateTime.fromISO(request.items.To.value.date + 'T' + request.items.To.value.time + ':00').toUTC().startOf('second').toISO({suppressMilliseconds: true}); const booking_memo = "申請番号: " + request.number + "\n使用部署: " + request.items.Organization.value + "\n予約担当者: " + request.items.Name.value;
// 登録データの作成 const booking = { "eventType": "REGULAR", "subject": booking_title, "notes": booking_memo, "visibilityType": "PUBLIC", "start": { "dateTime": booking_start, "timeZone": "Asia/Tokyo" }, "end": { "dateTime": booking_end, "timeZone": "Asia/Tokyo" }, "isStartOnly": "false", "facilities": [{ "code": booking_code }] }; // 施設予約に登録 return new garoon.Promise((resolve, reject) => { garoon.api('/api/v1/schedule/events', 'POST', booking, (resp) => { alert("施設予約に登録しました"); resolve(event); }, (err) => { alert("施設予約への登録に失敗しました"); resolve(event); }); }); }); })(jQuery); })();

上で準備したワークフローの「JavaScript / CSSによるカスタマイズ」を開きます。

wf-to-booking-03.jpg

カスタマイズの項目は「適用する」を選択します。JavaScriptカスタマイズの項目は、次の2つのURLと上で作成した wf_to_booking.js ファイルを設定します。

https://js.cybozu.com/jquery/3.6.4/jquery.min.js
https://js.cybozu.com/luxon/3.3.0/luxon.min.js

最終的に次のようになります。

wf-to-booking-04.jpg

動作確認

ワークフローの「承認」ボタンを押した際に「施設予約に登録しました」と表示され、施設予約に登録されていれば正しく設定できています。

wf-to-booking-05.jpg

「施設予約への登録に失敗しました」と表示される場合は、次の原因が考えられます。

  • 該当日時の予約が既に入っている
  • 施設に予約を追加する権限がない
  • ワークフローに設定した「施設コード」が間違っている

免責

本ページに記載の内容は2023年12月時点のものです。プログラムのご利用等によって生じたいかなる損害についても、当センターは責任を負わないものとします。