■使用方法
1.「要員設定」の画面下部「ユーザースクリプト」タブを開きます。
2.「使用しない」のチェックを外し、VBScript もしくは JavaScript の好きな方を選択します。
3.下図はVBScript での例
’ここに記述します
の行を削除してスクリプトを記述します。
多くの方はスクリプト(プログラム)に不慣れと思われますので、後記のテンプレートをコピー/貼り付け後、必要な部分のみ変更(ID番号やグループ番号、勤務番号 など)することをお奨めします。
ホームページなどを作ってJavaScriptに慣れている方は、JavaScriptを使用してください。
JavaScriptの方が短く記述できる利点もあります。
4. 構文チェック − 入力後は「構文チェック」ボタンを押して構文(文法)チェックが行えます。
エラーが発生した場合は、エラーメッセージ、および、エラーコードを参考に、入力文字を修正します。
スクリプト内で使用している関数(ID番号(),勤務番号)等)については、スクリプト関数仕様を参照して下さい。
2.「使用しない」のチェックを外し、VBScript もしくは JavaScript の好きな方を選択します。
3.下図はVBScript での例
’ここに記述します
の行を削除してスクリプトを記述します。
多くの方はスクリプト(プログラム)に不慣れと思われますので、後記のテンプレートをコピー/貼り付け後、必要な部分のみ変更(ID番号やグループ番号、勤務番号 など)することをお奨めします。
ホームページなどを作ってJavaScriptに慣れている方は、JavaScriptを使用してください。
JavaScriptの方が短く記述できる利点もあります。
エラーが発生した場合は、エラーメッセージ、および、エラーコードを参考に、入力文字を修正します。
スクリプト内で使用している関数(ID番号(),勤務番号)等)については、スクリプト関数仕様を参照して下さい。
■記述例
VBScriptでの記述例
以下のデータと条件で設定します。
データ
夜勤:勤務番号 = 5
武士:グループ番号 = 10
徳川家斉:ID番号 = 340
徳川家慶:ID番号 = 341
条件
「武士」グループは期間内で「夜勤」の回数が3回を超えてはいけない。
データ
夜勤:勤務番号 = 5
武士:グループ番号 = 10
徳川家斉:ID番号 = 340
徳川家慶:ID番号 = 341
条件
「武士」グループは期間内で「夜勤」の回数が3回を超えてはいけない。
関数のパラメータや使用方法
■スクリプトの意味
今まさに割り当てようとしている人の勤務について判定しています。
もし、
グループ番号が「10 武士」 かつ
勤務が「5 夜勤」 かつ
「5 夜勤」の期間内の割り当て日数が3日を越える
という条件を満たす場合には、−1(不可)を返却値としています。
これにより、条件を全て満たす人に、この勤務は割り当てられません。
もし、
グループ番号が「10 武士」 かつ
勤務が「5 夜勤」 かつ
「5 夜勤」の期間内の割り当て日数が3日を越える
という条件を満たす場合には、−1(不可)を返却値としています。
これにより、条件を全て満たす人に、この勤務は割り当てられません。
■関数の意味
グループ番号() : 今、割り当てようとしている人のグループ番号を返します。
勤務番号() : 今、割り当てようとしている勤務番号を返します。
勤務番号() : 引数(この場合は「5 夜勤」)で指定された勤務の期間内の割り当て日数を返します。
他の各種関数などについては下記を参照
要員設定−ユーザースクリプト
勤務番号() : 今、割り当てようとしている勤務番号を返します。
勤務番号() : 引数(この場合は「5 夜勤」)で指定された勤務の期間内の割り当て日数を返します。
他の各種関数などについては下記を参照
要員設定−ユーザースクリプト
■テンプレート
下記のテンプレート(薄い黄色の部分)をコピーして使用できます。
(フィールド内を3回連続クリックするとすべて選択されます。または右クリックメニューから「すべて選択」)
貼り付けた後、必要な箇所(ここではグループ番号の「10」や勤務番号の「5」)を変更して下さい。
上図は、1.2 のVBS例を貼り付けた後の様子
・VBS(VBScript)/JS(JavaScript) のどちらかを使用
(チェックされている方のスクリプトが使用される)
・スクリプトは何個でも追加可能
注: VBS は VBScript に、JS は JavaScrript の方に貼り付け
違った方に貼り付けると実行時にエラーとなります。(「構文チェック」で確認可)
以下、コピーして御利用下さい。
データ
mod:余りを求める演算子
%:余りを求める演算子
(フィールド内を3回連続クリックするとすべて選択されます。または右クリックメニューから「すべて選択」)
貼り付けた後、必要な箇所(ここではグループ番号の「10」や勤務番号の「5」)を変更して下さい。
上図は、1.2 のVBS例を貼り付けた後の様子
・VBS(VBScript)/JS(JavaScript) のどちらかを使用
(チェックされている方のスクリプトが使用される)
・スクリプトは何個でも追加可能
注: VBS は VBScript に、JS は JavaScrript の方に貼り付け
違った方に貼り付けると実行時にエラーとなります。(「構文チェック」で確認可)
以下、コピーして御利用下さい。
データ
勤務番号
番号 略称 勤務名
1 日 日勤
2 早 早出
3 遅 遅出
5 夜 夜勤
6 明 夜勤明け勤務
ID番号 徳川家斉 = 340
徳川家慶 = 341
グループ番号 武士 = 10
VBS:VBScript JS:JavaScript
用語 ・以下 指定の数値およびそれより小さい値 例:2以下の日数→2日,1日,0日
番号 略称 勤務名
1 日 日勤
2 早 早出
3 遅 遅出
5 夜 夜勤
6 明 夜勤明け勤務
ID番号 徳川家斉 = 340
徳川家慶 = 341
グループ番号 武士 = 10
VBS:VBScript JS:JavaScript
用語 ・以下 指定の数値およびそれより小さい値 例:2以下の日数→2日,1日,0日
1.勤務回数制限例
1.1 「夜勤」は期間内に4回以下とする
VBS
JS
1.2 「武士」の「夜勤」は期間内で3回以下とする
VBS
JS
1.3 「340 徳川家斉」さんは「夜勤」最高2回以下
VBS
JS
1.4 「340 徳川家斉」さんと「341 徳川家慶」さんは「夜勤」2回以下
VBS
JS
1.5 「武士」グループは一日の「日勤」人数を1人以下 - 実例集
VBS
JS
1.6 IDが340〜344の人は土曜日の出勤回数を2回までとする 土曜日=7
VBS
JS
1.7 「武士」グループは土曜日の出勤回数を2回以下とする
VBS
JS
1.8 「武士」グループは土日の夜勤を禁止 土曜日=7 日曜日=1 夜勤=5
VBS
JS
1.9 休日における出勤日数を制限(8日以下)する
1.10 シフトパターンの回数を制限する
2連続の日勤は、期間内で最大1回までとする
パターン個数() 関数の仕様と使い方/作成例
2番目以降のパラメータで、シフトパターンを記述
例:1:日勤 2:早出1 4:遅出 5:夜勤 の場合
1 , 1 「日勤 日勤」
1 , 1 , 1 「日勤 日勤 日勤」
1 , 2 , 4 , 5 「日勤 早出1 遅出 夜勤」
パターン個数() 関数の仕様と使い方/作成例
2番目以降のパラメータで、シフトパターンを記述
例:1:日勤 2:早出1 4:遅出 5:夜勤 の場合
1 , 1 「日勤 日勤」
1 , 1 , 1 「日勤 日勤 日勤」
1 , 2 , 4 , 5 「日勤 早出1 遅出 夜勤」
VBS
JS
2.指定期間内勤務回数制限
2.1 「340 徳川家斉」さんは一週間に「夜勤(No=5)」1回以下 日曜基点 - 実例集
VBS
JS
2.2 「武士(No=10)」グループは一週間に「夜勤(No=5)」1回以下 日曜基点
VBS
JS
2.3 期間指定(1日〜9日)にてID=340は、「午」(No=6)の回数を1回以内
3.期間指定の指定勤務回数制限
a. 連続勤務制限
a.1 「340 徳川家斉」さんだけ早出の連続勤務3日まで
割り当てようとしているのが、ID=340で早出(=2)の場合、
当日が4日連続する早出のどの日かで場合分けして条件設定
下記は、最終日、3日目、2日目、初日の場合として判定
当日が4日連続する早出のどの日かで場合分けして条件設定
下記は、最終日、3日目、2日目、初日の場合として判定
VBS
JS
b. 連続勤務日数制限
b.1 連続勤務は6日まで
VBS
JS
b.2 例外:指定ID 「340 徳川家斉」さんだけ連続勤務は4日まで、以外は3日まで
VBS
JS
c. 連続勤務不可条件
c.1 IDが344より大きい人は、遅出勤務の翌日に日勤を禁止
前日/翌日の勤務を判定する場合は注意が必要です。
各種の禁止条件は、初期割当時だけでなく、最適化などの勤務入替時にも呼ばれます。
すなわち、連続する勤務の判定される順序は不定です。
よって、「当日が[日勤]で前日が[遅出]となる場合には不可」だけの場合(下記例2行目)、
初期割当時は条件に沿いますが、最適化や確保完了後の入替処理で、連続性が崩れることになります。
「当日が[遅出]で翌日勤務が[日勤]となる場合には不可」を追加(下記例3行目)すると、どの順序で判定されても条件を満たします。。
各種の禁止条件は、初期割当時だけでなく、最適化などの勤務入替時にも呼ばれます。
すなわち、連続する勤務の判定される順序は不定です。
よって、「当日が[日勤]で前日が[遅出]となる場合には不可」だけの場合(下記例2行目)、
初期割当時は条件に沿いますが、最適化や確保完了後の入替処理で、連続性が崩れることになります。
「当日が[遅出]で翌日勤務が[日勤]となる場合には不可」を追加(下記例3行目)すると、どの順序で判定されても条件を満たします。。
VBS ダウンロードサンプルページ
JS
c.2 複複数種「日勤」の組み合わせで3連続禁止
「3種類の日勤」勤務(−,=,〇)がある時、どの日勤でも「3日以上になる組合せ」を禁止。
例:右記はいずれも不可 −−− , === , 〇〇〇 , −=〇 , −〇− , =〇− 等。
連続勤務禁止パターンに可能な組合せを全て列記することでも可能ですが、組合せ数は27通り(=3x3x3)になり、かなり面倒です。
スクリプトを利用すると、割とシンプルに記述できます。下図 緑色−=〇が日勤
スクリプトの意味:
また、3以下だけの判定で済むように見えますが、
if 勤務番号() <= 3 then とすると、休み(自動割り当て)が勤務番号が「0」なので、初日から条件を満たしてしまい、割り当て不可となってしまいますので注意!
勤務種別表:
勤務種別番号を工夫(日勤が種別表の番号で最後に)すれば、スクリプトが簡素になります。
例:右記はいずれも不可 −−− , === , 〇〇〇 , −=〇 , −〇− , =〇− 等。
連続勤務禁止パターンに可能な組合せを全て列記することでも可能ですが、組合せ数は27通り(=3x3x3)になり、かなり面倒です。
スクリプトを利用すると、割とシンプルに記述できます。下図 緑色−=〇が日勤
スクリプトの意味:
割り当て予定の勤務番号が1以上3以下の場合、
前日の勤務番号が1以上3以下、かつ、前々日の勤務番号が1以上3以下の場合は割り当て不可 @
前日の勤務番号が1以上3以下、かつ、翌日の勤務番号が1以上3以下の場合は割り当て不可 A
翌日の勤務番号が1以上3以下、かつ、翌々日の勤務番号が1以上3以下の場合は割り当て不可 B
最初の割り当て時のみであれば(@)のみで可ですが、スクリプトは割り当て成功後の最適化時にも呼ばれるため、前後の勤務状態(AB)も考慮する必要があります。前日の勤務番号が1以上3以下、かつ、前々日の勤務番号が1以上3以下の場合は割り当て不可 @
前日の勤務番号が1以上3以下、かつ、翌日の勤務番号が1以上3以下の場合は割り当て不可 A
翌日の勤務番号が1以上3以下、かつ、翌々日の勤務番号が1以上3以下の場合は割り当て不可 B
また、3以下だけの判定で済むように見えますが、
if 勤務番号() <= 3 then とすると、休み(自動割り当て)が勤務番号が「0」なので、初日から条件を満たしてしまい、割り当て不可となってしまいますので注意!
勤務種別表:
勤務種別番号を工夫(日勤が種別表の番号で最後に)すれば、スクリプトが簡素になります。
4.特定日/曜日禁止
a. 特定日禁止
a.1 「武士」は休日に「夜勤」禁止
VBS
JS
a.2 「武士」は11日から20日まで「夜勤」禁止
VBS
JS
a.3 「武士」は奇数日の「夜勤」禁止
VBS
mod:余りを求める演算子
JS
%:余りを求める演算子
b. 特定曜日禁止
b.1 「武士」は月曜と火曜に「夜勤」禁止 − 曜日() は日〜土が1〜7に対応
VBS
JS
b.2 第n週の勤務制限(使用例)
VBS
4.5 IDが 341,342 の人は、それぞれ、第2週、第3週目の勤務不可
JS
5.勤務時間制限
5.1 「340 徳川家斉」さんと「341 徳川家慶」さんは、期間内の総勤務時間は155時間まで
VBS
JS
6.六曜指定(先勝,友引・・・)
6.1 「341 徳川家慶」さんは「仏滅」不可
旧暦変換 関数のパラメータ
戻り値 パラメータ(変換種別)により戻り値が異なる
0:旧暦日付 - yyyymmdd の文字列形式
1:六曜 - 先勝 友引 先負 大安 仏滅 赤口
2:閏 - 0:平月 1:閏月
3:干支 - 0〜59: 甲子〜癸亥
下記の例では六曜(先勝、先負・・・)が返される
戻り値 パラメータ(変換種別)により戻り値が異なる
0:旧暦日付 - yyyymmdd の文字列形式
1:六曜 - 先勝 友引 先負 大安 仏滅 赤口
2:閏 - 0:平月 1:閏月
3:干支 - 0〜59: 甲子〜癸亥
下記の例では六曜(先勝、先負・・・)が返される
6.2 グループ番号10「武士」は「友引」不可
7.勤務間隔
7.1 特定の勤務について、その間隔を個人単位に指定します。
7.2 全員が「日勤」間隔は「4日以上」
8.勤務/グループ組み合わせ
8.1 ベテラン日勤が0人の場合は、新人の早出は不可
8.2 勤務を同じ日に割り当てない(340,341 は、同じ日に「日勤」不可)
勤務種別 1:日勤
ID:340 徳川 家斉 341 徳川 家慶
ID:340 徳川 家斉 341 徳川 家慶
VBS
JS
実際の作成例
8.3 グループ間でのメンバー組み合わせ禁止
夜勤入り(< ≪)にて、
「グループ2」(だいだい色)と「グループ3」(緑色)のメンバーが同じ日に組まないようにしたい
シフト表:
「グループ2」と「グループ3」のメンバーが、「夜勤入り」(< ≪ )で同じ日に組まれていません。
分かりやすくするため、「夜勤入り」のみ色付けしています。
スクリプト
意味:
シフト表:
「グループ2」と「グループ3」のメンバーが、「夜勤入り」(< ≪ )で同じ日に組まれていません。
分かりやすくするため、「夜勤入り」のみ色付けしています。
スクリプト
意味:
割り当てようとしている勤務が「夜勤入り」(< ≪))の場合
割り当てようとしているグループが「グループ2」(だいだい色)の場合
「グループ3」(緑色)に「<」または「≪」が既に割り当てられいる場合、「割り当て不可」
割り当てようとしているのが「グループ3」(緑色)の場合
「グループ2」(だいだい色)に「<」または「≪」が既に割り当てられいる場合、「割り当て不可」
割り当てようとしているグループが「グループ2」(だいだい色)の場合
「グループ3」(緑色)に「<」または「≪」が既に割り当てられいる場合、「割り当て不可」
割り当てようとしているのが「グループ3」(緑色)の場合
「グループ2」(だいだい色)に「<」または「≪」が既に割り当てられいる場合、「割り当て不可」
8.4 メンバー間の組み合わせ回数制限(同じメンバーで「夜勤」を期間内に1回まで)
10.複雑な組み合わせ
10.1 「340 〜 441」の人は休日の「夜勤」は最高1回まで
10.2 ID番号が500番台以上の人は「夜勤」最高3回まで
VBS
JS
10.3 「340 徳川家斉」「341 徳川家慶」さんは、全勤務で同じ日に同じ勤務は不可
VBS
JS
11.複数勤務の合計回数制限
11.1 複数勤務の合計回数を制限
期間内で、勤務の回数を制限するには「勤務日数()」関数が利用できます。
同じく、複数の勤務で合計回数を制限するときにも同様に使用します。
ここでは、グループ(=10)において、早出1(=2)、早出2(=3)の合計回数を「3回以下」に制限します。
(=3回を超える場合は割当不可)
割り当てようとしているグループ番号が「10」の場合、
早出1(No=2)と早出2(No=3)の勤務の
合計日数が「3」日を超える場合は、割当不可 としています。
作成結果例 橙色が「グループ(No=10)」、右側の赤枠内が、早出1と早出2の割当日数。
「3」日以下に制限されています。
同じく、複数の勤務で合計回数を制限するときにも同様に使用します。
ここでは、グループ(=10)において、早出1(=2)、早出2(=3)の合計回数を「3回以下」に制限します。
(=3回を超える場合は割当不可)
VBS
JS
割り当てようとしているグループ番号が「10」の場合、
早出1(No=2)と早出2(No=3)の勤務の
合計日数が「3」日を超える場合は、割当不可 としています。
作成結果例 橙色が「グループ(No=10)」、右側の赤枠内が、早出1と早出2の割当日数。
「3」日以下に制限されています。
11.2 最少回数(複数勤務の合計回数)を指定
A.指定グループに対して、単一勤務の最少回数を指定
単一勤務の場合、メンバー組み合わせ必須(グループ)で指定出来ますが、ユーザースクリプトを利用しても可能です。
考え方:指定グループ以外に対して、指定勤務の回数の上限を制限することで、
指定グループに対する最小回数を指定します。
( 指定グループへの割り当て数=要求数−指定グループ以外への割り当て数 )
考え方:指定グループ以外に対して、指定勤務の回数の上限を制限することで、
指定グループに対する最小回数を指定します。
( 指定グループへの割り当て数=要求数−指定グループ以外への割り当て数 )
・指定グループ以外のメンバーで構成されるグループを作成(No=40)
・要求数とユーザースクリプトを指定
早出1(△)の要求数を「2」人としています。
割当ようとしている人のグループがNo=40(武士以外の全て)で、勤務が「△」の時
グループ(No=40)への「△」(No=2)の割り当て人数合計が1を超える場合 → 割当不可
割当ようとしている人のグループがNo=40(武士以外の全て)で、勤務が「△」の時
グループ(No=40)への「△」(No=2)の割り当て人数合計が1を超える場合 → 割当不可
VBS
JS
・作成結果
B.指定グループに対して、複数勤務の最少合計回数を指定
12.グループ内勤務組み合わせ制限
12.1 特定グループ内で日勤と遅出の同時割り当て不可
グループ(10)において
グループ内の誰かに「日勤:日」が割り当てられている場合は、
そのグループ内の他のメンバーに「遅出:▲」を割り当てない。
同じく、「遅出:▲」が割り当てられたら、他のメンバーには「日勤:日」を割り当てない。
グループ内の誰かに「日勤:日」が割り当てられている場合は、
そのグループ内の他のメンバーに「遅出:▲」を割り当てない。
同じく、「遅出:▲」が割り当てられたら、他のメンバーには「日勤:日」を割り当てない。
VBS
JS
作成結果例
12.2 全グループで、同一グループ内での日勤と遅出の同時割り当て不可
★スクリプトの記述について
一度に多数のスクリプトを入力すると、エラーになった場合に何処が間違っているかを切り分けるのが困難です。
ひとつ追加したら構文チェックをして、OKであれば、次を追加するようにしてください。
ひとつ追加したら構文チェックをして、OKであれば、次を追加するようにしてください。
複雑な条件 − 個人単位の連続勤務日数制限
個人単位に条件を設定したい場合などは、プログラムとして記述した方が分かり易くなります。
下記はVBScript例。 個人単位に連続勤務日数制限を行います。
select case ID番号() case 3: if 連続勤務日数()>7 then JudgeKinmu=-1 case 4: if 連続勤務日数()>5 then JudgeKinmu=-1 case 5: if 連続勤務日数()>6 then JudgeKinmu=-1 case else end select
既定値を-1として、条件を満たす場合にはそのまま関数を抜け、
条件を全て満たさない場合のみ、0で返す方法もあります。
この方式は、条件を満たした行以降は実行されないので、スッキリした形式になります。
JudgeKinmu=-1 select case ID番号() case 3: if 連続勤務日数()>7 then exit function case 4: if 連続勤務日数()>5 then exit function case 5: if 連続勤務日数()>6 then exit function case else end select JudgeKinmu=0
■実例サンプル
■エラーメッセージ
構文エラーが発生すると、下図のようなメッセージが表示されます。
行および文字に表示される数値を参考に、エラー発生箇所を特定します。
下図では、「7行目」「7文字目」でエラーが発生しています。
下の例では「ID番号)」にて左かっこ「(」が欠落しています。
行および文字に表示される数値を参考に、エラー発生箇所を特定します。
下図では、「7行目」「7文字目」でエラーが発生しています。
下の例では「ID番号)」にて左かっこ「(」が欠落しています。