ユーザー固有の勤務制限

既定で用意されている勤務制限には、
・連続勤務禁止(2個の勤務)
・連続勤務禁止パターン(最大7個)
・メンバー組み合わせ禁止パターン(個人/グループ)
・勤務不可条件(個人単位)
・曜日単位の条件設定
などがありますが、これだけでは条件設定が不可能(または不足)な場合があります。

その場合、ユーザー様が独自のスクリプト(プログラム)を作成して、固有の勤務制限を設定することができます。

少々のプログラミング知識が必要になりますが、下記にテンプレートも用意しています。

使用できるスクリプトは、VBScript または JavaScript

メニュー
スクリプトの記述場所
実行タイミング
 実行中のスクリプト内容
スクリプト内で可能なこと
制限事項
入力方法
 初期状態
 構文チェック
テンプレート
スクリプトの動作確認
実例サンプル集
関数仕様

全て展開 折り畳む

スクリプトの記述場所

要員設定」から「ユーザースクリプト」タブを選択し、下図の 青枠 内にスクリプトを記述します。
 緑枠 内は、シフト作成ツール固有の関数仕様(パラメータ等)


スクリプトの実行タイミング

本体プログラムが各個人に可能な勤務の候補を決定後、この関数(JudgeKinmu)が呼び出されます。
また、最適化時(入替判定)、勤務日数自動調整時(割当可判定)にも呼び出されます。

この関数が−1を返却すると、本体プログラムは決定していた勤務を不可として、ほかの勤務(またはメンバー)を探すことになります。
0を返す(既定値)と勤務可能と判断し、その勤務を割り当てます。

実行中のスクリプト内容を見たい場合

返却値で -1111 を返すと、内部で使用している提供関数が変換された形式のスクリプト内容を表示できます。
詳細は、「実行中のスクリプト内容表示」を参照。

スクリプト内で可能なこと

条件判定

スクリプト内では、その言語で記述できる様々な条件判定が設定できます。

提供関数

本体プログラムから提供する各種関数を使用可能
(上図右側の緑枠内の各種関数)

例:勤務人数()
「勤務人数()」関数は、勤務番号とグループ番号を指定して、
そのグループに指定の勤務が割り当てられている(または割り当てようとしている)人数を返します。
勤務人数(勤務番号,グループ番号)
 引数:
  勤務番号: 勤務を数値で指定
  グループ番号:グループを数値で指定
  if((勤務人数,1,30)+勤務人数(2,30)+勤務人数(3,30)+勤務人数(4,30))>1{return -1;}  
これは、グループ番号30にメンバーに割り当てられている勤務番号1〜4の人数合計が1より大きい場合、勤務不可(-1)を返します。
すなわち、グループ番号30のメンバーには、勤務1〜4のそれぞれの勤務で2名以上が同時に割り当てられない とこと指示します。

スクリプトでの制限事項

・関数に渡すパラメータは即値

上記の勤務人数のような提供関数に渡すパラメータは1,2,3・・・のような即値
(constなどの定数値や、var,dim などで定義された変数は不可)

入力方法

初期状態

下図はスクリプトが入力されていない状態を表しています。

// ここにスクリプトを記述します。

の部分を消去して、スクリプト(プログラム)を入力します。


構文チェック

入力後、構文チェック ボタンをクリックすると、簡単な 文法チェック が行われます。
エラーが表示されたら修正後、再度「構文チェック」を行います。

入力したスクリプトを使用しない場合は「使用しない」にチェックします。
チェックが入っている場合、何も実行するプログラムがなくてもスクリプトを実行しますので、プログラムが多少遅くなります。

テンプレート


スクリプトの動作確認


実例サンプル集

ダウンロードして実際に試せる実例です。
拡張シフト表」にコピーして使用します。


関数仕様項目を 全て展開 折り畳む

[xx] 省略可 を意味する。 [当日]は「割り当て予定日」と同義

:下記関数への入力パラメータには「変数」の使用不可。  即値(1 , 2 , 3 等)のみ可。

ID番号()    割り当て予定のIDを返す
ID番号()   テンプレート
 機能 : 割当て予定のIDを返す
 書式 : ID番号()
 引数 : 無し
 戻り値: メンバーID
グループ番号() 割当て予定者のグループ番号を返す
グループ番号()   テンプレート
 機能 : 割当て予定者のグループ番号を返す
 書式 : グループ番号()
 引数 : 無し
 戻り値: グループ番号
グループ所属() 割当て予定者がグループに所属しているか?
グループ所属()
 機能 : 割当て予定者が指定グループに所属しているかを返す
 書式 : グループ所属([Grp1][,Grp2][,Grp]…)
 引数 : 調べたいグループの番号をカンマ区切りで複数指定可
 戻り値: 指定のいずれかのグループに所属していたら True
      いずれにも所属していない場合は False
 使用例: グループ所属(10,11,50)
      10,11,50 のいずれかに所属していたらTrueが返る。
勤務番号()   割り当て予定の勤務番号を返す
勤務番号()   テンプレート
 機能 : 割当て予定の勤務番号を返す
 書式 : 勤務番号([ID][,日にち])
 引数 : ID番号(省略可)
    : 日にち(省略可)
 戻り値: 勤務番号を返す
 使用例 勤務番号()   割り当て予定の人/日の勤務番号
     勤務番号(340,5) 指定の人/指定日の勤務番号
日()      割り当て予定日の日にちを返す
日()   テンプレート
 機能 : 割当て予定の日にちを返す
 書式 : 日()
 引数 : 無し
 戻り値: 日にちを表す数値
  例: 2020/10/5 がシフト割り当て予定日の場合、「5」が返る。
月()      割り当て予定日の月を返す
月()
 機能 : 割当て予定の月を返す
 書式 : 月()
 引数 : 無し
 戻り値: 月を表す数値
  例: 2020/10/5 がシフト割り当て予定日の場合、「10」が返る。
年()      割り当て予定日の年を返す
年()
 機能 : 割当て予定の年を返す
 書式 : 年()
 引数 : 無し
 戻り値: 年を表す数値
  例: 2020/10/5 がシフト割り当て予定日の場合、「2020」が返る。
月日数()    該当月の末日を返す
月日数()
 機能 : 該当月の末日を返す
 書式 : 月日数()
 引数 : 無し
 戻り値: 日にち
予定休み数()  個人条件で入力された予定休み日数を返す
予定休み数()
 機能 : 個人条件の予定休み数を返す
 書式 : 予定休み数([ID])
 引数 : ID番号 省略可(省略時は割り当て予定のID番号が対象)
 戻り値: 日数
曜日()     割り当て予定日の曜日を返却
曜日()    テンプレート 実例集
 機能 : 曜日を返却
 書式 : 曜日()
 引数 : 無し
 戻り値: 曜日を表す数値 1〜7 → 日曜〜土曜 に対応
週番号()    第何週目かを返す
週番号()
 機能 : 月初から数えた週番号を返却
 書式 : 週番号([基準曜日])
 引数 : 基準曜日。省略,0,1:日曜基準 2:月曜基準 3:火曜 ・・・・
 戻り値: 1以上の数値

 週通番(1900/1/1 からの通番)を求めるには、週番号() の代わりに
    Int( Dateserial(年(),月(),日()-1 )/7 ) とします。(日曜起点)
     月曜起点の場合は、赤字部分を -2火曜起点は -3 とします。)

記述例 1 週番号とID指定で割当

仕様:IDが341と342の人は、それぞれ第2週目、第3週目の勤務が不可



作成結果例

赤枠がスクリプトで指定した不可日


記述例 2 グループに隔週で割当

仕様:グループ1020隔週で「」を必須割当

使用する機能
 ・グループ指定:10,20を補助グループで「1」に指定 → 一括してメンバー必須指定可
 ・必須条件指定:「午」をグループ「1」に、「2」名必須で割当
 ・要員割当て
 ・ユーザースクリプト → 各グループを隔週で禁止

グループ指定
青枠でグループ1020を補助グループに指定



必須割当条件
勤務「6:午後」は「1:倒幕志士」に「」名の割りてを必須とする


・要員割当てとユーザースクリプト
毎日「6:午」を2名要求


スクリプトの意味
割当てようとしている勤務が「6:午後」の場合、
 週番号(3:火曜起点)が偶数(番号を2で割った余りが0)の場合
  グループが「10」 → 割当て不可
 奇数(1)の場合
  グループが「20」 → 割当て不可

mod は、余りを求める演算子。 例: a mod b → a を b で割った余りが返される。

作成結果例
赤枠がスクリプトで指定した割当て 「」が隔週で割り当てられている

休平日()    当日の休平日区分を返却
休平日()   テンプレート
 機能 : 当日の休平日区分を返却
 書式 : 休平日([相対日])
 引数 : 相対日:省略可(既定:当日)
       -2:前々日 -1:前日
       0(省略):当日
       1:翌日 2:翌々日
     (参照可能範囲:前月初日〜翌月末日)
戻り値: 0-平日,1-祝日,2-固定休
前日勤務()   当日からn日前の勤務を返す
前日勤務()   テンプレート 実例集
 機能 : 当日からn日前の勤務を返す
 書式 : 前日勤務( 相対日 [, ID] )
 引数 : 相対日 1-前日 2-前々日
       (参照可能範囲:前月下旬10日、当月内)
     ID 調べたい人のID(省略時は割り当て予定)
 戻り値: 勤務番号

 注意:本関数を利用して連続する勤務を制限する場合は注意が必要。テンプレート参照
翌日勤務()   割り当て予定日のn日後の勤務を返す
翌日勤務()   実例集
 機能 : 割り当て予定日のn日後の勤務を返す
 書式 : 翌日勤務( 相対日 [, ID] )
 引数 : 相対日 1-翌日 2-翌々日
       (参照可能範囲:当月内)
     ID 調べたい人のID(省略時は割り当て予定)
 戻り値: 勤務番号

 注意:本関数を利用して連続する勤務を制限する場合は注意が必要。テンプレート参照
直近勤務()   一番近い日の勤務番号を返す
前日勤務()
 機能 : 一番近い日の勤務番号を返す
 書式 : 直近勤務( ID [,方向])
 引数 : 引数 :ID:調べたい人のID(省略時は割り当て予定) 省略可
     方向:調べる方向(0または省略:前日方向 1:後日方向) 省略可
 戻り値: 勤務番号

 例:下記のようなシフト(5日目の割り当て●予定)の場合
    勤務番号 A=10 B=11 C=12

       1 2 3 4 5 6 7 8 9 〜
  100 XX A B 休 休 ● 休 休 休 C 〜
  102 YY A 休 休 休 B 休 C 休 C 〜

   直近勤務()   → 11
   直近勤務(,1)  → 12
   直近勤務(102) → 10
   直近勤務(102,1)→ 12
開始時刻()   指定勤務の開始時刻を返す
開始時刻()
 機能 : 指定勤務の開始時刻を"時"単位の小数形式で返す
 書式 : 開始時刻( [勤務番号] )
 引数 : 勤務番号:省略時は割り当てようとしている勤務(開始時刻(勤務番号())と同一)
 戻り値: 小数形式で表した時
     "8:00" → 8 "8:30" → 8.5 "8:15" → 8.25

例:割り当てようとしている勤務の開始時刻が12時より後の場合は「割り当て不可」
終了時刻()   指定勤務の終了時刻を返す
終了時刻()
 機能 : 指定勤務の終了時刻を"時"単位の小数形式で返す
 書式 : 終了時刻( 勤務番号 )
 引数 : 勤務番号:省略時は割り当てようとしている勤務
 戻り値: 小数形式で表した時
     "8:00" → 8 "8:30" → 8.5 "8:15" → 8.25
勤務回数()   指定勤務の期日内回数
勤務回数()
 機能 : 指定期日内での勤務割り当て回数を返す
 書式 : 勤務日数( 勤務番号[,開始日] [,終了日] [,ID] )
 引数 : 勤務番号:調査する勤務番号 省略時は全勤務が対象
     開始日:調査期間の開始日 省略時は期間初日
     終了日:同、終了日    省略時は期間末日
     ID : 調査対象者のID 省略時は割り当て予定者のID
 戻り値: 勤務回数

 注意 :下旬で回数制限すると、確保不可の可能性増大

使用例

IDにより回数制限する期間を指定
 432,435,438,439,441 1日〜9日   「不可    A
 572,573,574,575,576 10日〜19日 「回まで  B
 729,730,731,732,733 20日〜29日  勤務回まで  C

作成したシフト表
 枠内が上記 A,B,C の制限を受けている


使用したスクリプト ID指定


グループで指定する場合は下記のように記述

 VbScript 「Select Case」コマンド リファレンス

勤務の分散化

勤務種別表で「勤務間隔」を指定する方法の他に、本関数を使用することも可能
下図は、「」および「」を期間内で分散化したもの

それぞれ青枠には、「」および「」が共に1回しか割り当てられない。
青枠 内も同様。
あわせて、期間内で分散化されている。


使用したスクリプト

勤務日数()   指定勤務の総日数
勤務日数()   テンプレート
 機能 : 指定勤務の総日数
 書式 : 勤務日数( 勤務番号 [, 集計区分] [, ID])
 引数 : 勤務番号:カウントする勤務番号 省略時は全勤務が対象
     集計区分: 1〜7 日曜〜土曜 10 休日 11 平日
           省略時は全ての日が対象
     ID : 調べたい人のID 省略時は割り当て予定ID
 戻り値: 総勤務日数
勤務時間()   指定勤務の総時間を返す
勤務時間()   テンプレート
 機能 : 指定勤務の総時間を返す
 書式 : 勤務時間( [勤務番号] )
 引数 : 勤務番号:集計する勤務番号
      省略時は全勤務が対象
 戻り値: 総勤務時間
週間勤務日数() 当日を含む週内の勤務日数を返す
週間勤務日数()   テンプレート 実例集
 機能 : 当日を含む週内の勤務日数を返す
 書式 : 週間勤務日数( 勤務番号 [, 基点曜日] )
 引数 : 勤務番号: カウントする勤務番号
      省略時は全勤務が対象
     基点 : 起点曜日を表す数値(省略時は0)
         0:日曜 1〜7:日曜〜土曜
 戻り値: 日数

 ★「週刊勤務日数一覧」(シフト表解析)を使用して、作成済みのシフト表から解析可


記述例

勤務指定例:日勤制限-週内2日まで(日曜基点)

作成例:日曜基点の1週間(赤枠)



記述スクリプト:日勤(1)が2日を超えると不可

勤務指定例:勤務制限-全ての勤務を週内5日まで(日曜基点)

作成例:日曜基点の1週間(赤枠)



記述スクリプト:全ての勤務(勤務を省略)が5日を超えると不可
連続勤務日数() 当日前後の連続する勤務日数を返す
連続勤務日数()   テンプレート 実例集
 機能 : 当日が勤務の場合に、前後の連続する勤務日数を返す
 書式 : 連続勤務日数( [ID] )
 引数 : ID番号  省略可(省略時は割り当て予定のID)
 戻り値: 日数
連続休み日数() 当日前後の連続する休み日数を返す
連続勤務日数()
 機能 : 当日が休みの場合に、前後の連続する休み日数を返す
 書式 : 連続休み日数( [ID] )
 引数 : ID番号  省略可(省略時は割り当て予定のID)
 戻り値: 日数
休日勤務日数() 休日の勤務日数を返す
連続勤務日数()
 機能 : 休日(定休日+祝日)における勤務日数を返す
 書式 : 休日勤務日数( [ID] )
 引数 : ID番号  省略可(省略時は割り当て予定のID)
 戻り値: 日数

 使用例

下図のように休日出勤(赤枠出)数が4〜10日と偏りが生じています。




ユーザースクリプトで、休日出勤が8日を超える場合に不可とすると・・・




全員が8日以下(6,7,8)の休日出勤に収まりました。

過去指定勤務連続数() 前日以前の連続する勤務日数を返す
過去指定勤務連続数()  実例集 夜勤3,4連続必須(翌日を休み)
 機能 : 前日以前の連続する勤務日数を返す
 書式 : 過去指定勤務連続数( [勤務番号] )
 引数 : 勤務番号  省略可(省略時は割り当て予定の勤務が対象)
 戻り値: 日数(当日は含まない)
最小勤務間隔() 指定勤務間の日数を返す
最小勤務間隔()
 機能 : 当日を起点として指定された勤務日までの日数を算出
 書式 : 連最小勤務間隔( 勤務番号 [, ID] )
 引数 : 勤務番号
     ID:省略可(省略時はすべての人が対象)
 戻り値: 日数(当日を0とする)
記述例

勤務指定例:ID=340 〜343の人の日勤の間隔を4日以上とする

'下記4名の「日勤」間隔は、3日以内は不可
'VB Script での記述例

if 最小勤務間隔(1,340)<=3 then JudgeKinmu=-1
if 最小勤務間隔(1,341)<=3 then JudgeKinmu=-1
if 最小勤務間隔(1,342)<=3 then JudgeKinmu=-1
if 最小勤務間隔(1,343)<=3 then JudgeKinmu=-1
if 最小勤務間隔(1,344)<=3 then JudgeKinmu=-1

作成結果

(日勤)の間隔が4日以上となっている。

補足

全員を対象する場合は、最小勤務間隔の第2パラメータを省略します。
ユーザースクリプト(最小勤務間隔-全員対象)を参照

もしくは、「勤務種別設定-勤務間隔」で指定。
勤務人数()   当日の指定勤務が割り当てられている人数
勤務人数()
 機能 : 当日の指定勤務が割り当てられている人数を返却
 書式 : 勤務人数( 勤務番号 [, グループ番号] )
 引数 : 勤務番号    勤務番号を表す数値
     グループ番号 グループ番号を表す数値(省略可)
 戻り値: 人数

記述例
ベテラン日勤が0人の場合は、新人の早出は不可
'VB Script での記述例
if 勤務人数(1,1)=0 and 勤務人数(2,3)>0 then JudgeKinmu=-1
作成結果
作成例サンプルファイル
勤務ID()    指定勤務が割り当てられているID
勤務ID()  実例集「同じ人と同じ勤務での2連続禁止」
 機能 : 指定勤務が割り当てられている人のIDを返却
 書式 : 勤務ID( 勤務番号 )
 引数 : 勤務番号 検索したい勤務の番号
 戻り値: 最初に見つかった人のID(見つからなかったら0)
組合せ回数()  メンバー間の勤務組合せ回数
組合せ回数
 機能 :指定勤務で指定ID間の組合せ回数を返す
 書式 :組合せ回数 勤務番号 , ID1 , ID2 )
 引数 :勤務番号
     ID1 ID番号1
     ID2 ID番号2
 戻り値:回数

 ★「組合せ回数一覧」(シフト表解析)を使用して、作成済みのシフト表から解析可


 例1:同一日に340341が勤務1となる組合せ回数をまで
if 組合せ回数(1,340,341) >1 then JudgeKinmu = -1

 例2:同一日に340341の組合せで、勤務と勤務の回数合計をまで
if ( 組合せ回数(2,340,341) +組合せ回数(3,340,341) ) >3 then JudgeKinmu = -1

 例3:下図は青枠内のメンバーで、「日勤」の組合せを期間内に1回までとして制限

  ・作成結果

青枠内の人の組合せで、赤枠がを日勤同日勤務。最大一回となっている。

  ・スクリプト:(340〜344での2人の組み合わせを全て記述)

Option Explicit
function JudgeKinmu()'勤務可能判定

	if 組合せ回数(1,340,341)>1 then JudgeKinmu=-1
	if 組合せ回数(1,340,342)>1 then JudgeKinmu=-1
	if 組合せ回数(1,340,343)>1 then JudgeKinmu=-1
	if 組合せ回数(1,340,344)>1 then JudgeKinmu=-1

	if 組合せ回数(1,341,342)>1 then JudgeKinmu=-1
	if 組合せ回数(1,341,343)>1 then JudgeKinmu=-1
	if 組合せ回数(1,341,344)>1 then JudgeKinmu=-1

	if 組合せ回数(1,342,343)>1 then JudgeKinmu=-1
	if 組合せ回数(1,342,344)>1 then JudgeKinmu=-1

	if 組合せ回数(1,343,344)>1 then JudgeKinmu=-1

end function


必要人数()   要員設定で入力した勤務ごとの必要人数
必要人数()
 機能 : 要員設定で入力した勤務ごとの必要人数を返却
 書式 : 必要人数( 勤務番号 )
 引数 : 勤務番号を表す数値
 戻り値: 引数の勤務に必要な人数
割当済人数()  指定勤務に割当済みの人数を返す
割当済人数()
 機能 : 指定勤務に割当済みの人数を返す
 書式 : 割当済人数( 勤務番号 )
 引数 : 勤務番号を表す数値
 戻り値: 引数の勤務に割当済の人数

例:下記は、全メンバーで勤務番号(=7)の割り当てを1名以下にする


  意味
   割り当てようとしている勤務番号が7で、
   既に割り当てられている勤務番号(=7)が1個以上の場合、割り当て不可
出勤判定()   指定勤務が出勤勤務か公休などの休みかを返す
出勤判定()   実例集
 機能 : 指定勤務が出勤勤務か公休などの休みかを返す
 書式 : 出勤判定( 勤務番号 )
 引数 : 勤務番号
 戻り値: true-出勤 false-休み
試行回数()   全確保処理中の試行回数を返す
試行回数()
 機能 : 全確保処理中の試行回数を返す
 書式 : 試行回数()
 引数 : 無し
 戻り値: 確保処理中 - 試行回数を返す( >0 )
       確保済み - 0
全員確保成功() 全確保処理中の試行回数を返す
全員確保成功()
 機能 : 全員の確保が成功したかを判定
 書式 : 全要員確保成功()
 引数 : 無し
 戻り値: true: 確保成功 false: 未
旧暦変換()   当日の日付を旧暦に変換
旧暦変換()   テンプレート
 機能 : 当日の日付を旧暦に変換
 書式 : 旧暦変換( 変換種別 )
 引数 : 変換種別 0:旧暦日付 1:六曜 2:閏 3:干支
 戻り値: 変換種別により戻り値が異なる
      0:旧暦日付 - yyyymmdd の文字列形式
      1:六曜   - "先勝" "友引" "先負" "大安" "仏滅" "赤口"
      2:閏月   - ""(平月) "閏"(閏月)
      3:干支   - "甲子"〜"癸亥"
×
PageTop