テンプレート ユーザースクリプト

ユーザースクリプトを使用すると、さまざまな詳細な条件を設定できます。

  → ユーザースクリプトの概要と使用方法

全般的に特定勤務の日数を制限する場合や、特定グループ/個人に対しての特定勤務の日数制限
休平日での勤務制限や日数制限など、様々な条件の組み合わせで勤務を制限できます。

目次
使用方法 記述例
スクリプトの意味 関数の意味

テンプレート
1.勤務回数制限例
2.指定期間内勤務回数制限
3.期間指定の指定勤務回数制限
4.特定日/曜日禁止
5.勤務時間制限
6.六曜指定(先勝,友引…)
7.勤務間隔
8.勤務/グループ組み合わせ
10.複雑な組み合わせ
11.複数勤務の合計回数を制限
12.グループ内勤務組み合わせ制限

★スクリプトの記述について

実例サンプル

スクリプトの動作確認方法

エラーメッセージエラーコード
VBScriipt構文エラー
構文エラー例 実行時エラー

全て展開 折り畳む

■使用方法

1.「要員設定」の画面下部「ユーザースクリプト」タブを開きます。

2.「使用しない」のチェックを外し、VBScript もしくは JavaScript の好きな方を選択します。

3.下図はVBScript での例

’ここに記述します

の行を削除してスクリプトを記述します。

多くの方はスクリプト(プログラム)に不慣れと思われますので、後記のテンプレートコピー/貼り付け後、必要な部分のみ変更(ID番号やグループ番号、勤務番号 など)することをお奨めします。

ホームページなどを作ってJavaScriptに慣れている方は、JavaScriptを使用してください。
JavaScriptの方が短く記述できる利点もあります。

4. 構文チェック − 入力後は「構文チェック」ボタンを押して構文(文法)チェックが行えます。
  エラーが発生した場合は、エラーメッセージ、および、エラーコードを参考に、入力文字を修正します。
  スクリプト内で使用している関数(ID番号(),勤務番号)等)については、スクリプト関数仕様を参照して下さい。

■記述例

VBScriptでの記述例

以下のデータと条件で設定します。
データ
  夜勤:勤務番号 = 5
  武士:グループ番号 = 10
  徳川家斉:ID番号 = 340
  徳川家慶:ID番号 = 341

 条件
 「武士」グループは期間内で「夜勤」の回数が3回を超えてはいけない。


関数のパラメータや使用方法

■スクリプトの意味

今まさに割り当てようとしている人の勤務について判定しています。

もし、

 グループ番号が「10 武士」 かつ
 勤務が「5 夜勤」 かつ
 「5 夜勤」の期間内の割り当て日数が3日を越える


という条件を満たす場合には、−1(不可)を返却値としています。
これにより、条件を全て満たす人に、この勤務は割り当てられません。

■関数の意味

 グループ番号() : 今、割り当てようとしている人のグループ番号を返します。
 勤務番号() : 今、割り当てようとしている勤務番号を返します。
 勤務番号() : 引数(この場合は「5 夜勤」)で指定された勤務の期間内の割り当て日数を返します。

 他の各種関数などについては下記を参照

  要員設定−ユーザースクリプト



■テンプレート

下記のテンプレート(薄い黄色の部分)をコピーして使用できます。
(フィールド内を3回連続クリックするとすべて選択されます。または右クリックメニューから「すべて選択」)

貼り付けた後、必要な箇所(ここではグループ番号の「10」や勤務番号の「5」)を変更して下さい。
上図は、1.2 のVBS例を貼り付けた後の様子


VBS(VBScript)/JS(JavaScript) のどちらかを使用
 (チェックされている方のスクリプトが使用される)

・スクリプトは何個でも追加可能


: VBSVBScript に、JSJavaScrript の方に貼り付け

    違った方に貼り付けると実行時にエラーとなります。(「構文チェック」で確認可)
以下、コピーして御利用下さい。

 データ

勤務番号

番号 略称 勤務名
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 休日における出勤日数を制限(日以下)する

VBS
JS


「休日勤務日数」関数の書式

1.10 シフトパターンの回数を制限する

2連続の日勤は、期間内で最大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回以内

VBS
JS


「勤務回数()」関数仕様と使い方の例

3.期間指定の指定勤務回数制限

a. 連続勤務制限

a.1 「340 徳川家斉」さんだけ早出の連続勤務3日まで
割り当てようとしているのが、ID=340で早出(=2)の場合、
当日が4日連続する早出のどの日かで場合分けして条件設定
下記は、最終日、3日目、2日目、初日の場合として判定

VBS
JS

b. 連続勤務日数制限

b.1 連続勤務6日まで
VBS
JS
b.2 例外:指定ID 「340 徳川家斉」さんだけ連続勤務4日まで、以外は3日まで
VBS
JS

c. 連続勤務不可条件

c.1 ID344より大きい人は、遅出勤務の翌日に日勤を禁止
前日/翌日の勤務を判定する場合は注意が必要です。
各種の禁止条件は、初期割当時だけでなく、最適化などの勤務入替時にも呼ばれます。
すなわち、連続する勤務の判定される順序は不定です。

よって、「当日が[日勤]で前日が[遅出]となる場合には不可」だけの場合(下記例2行目)、
初期割当時は条件に沿いますが、最適化や確保完了後の入替処理で、連続性が崩れることになります。

当日が[遅出]で翌日勤務が[日勤]となる場合には不可」を追加(下記例3行目)すると、どの順序で判定されても条件を満たします。。

VBS ダウンロードサンプルページ

JS
c.2 複複数種「日勤」の組み合わせで3連続禁止
3種類の日勤」勤務(−,=,〇)がある時、どの日勤でも「3日以上になる組合せ」を禁止。
例:右記はいずれも不可 −−− , === , 〇〇〇 , −=〇 , −〇− , =〇− 等。
連続勤務禁止パターン可能な組合せ全て列記することでも可能ですが、組合せ数は27通り(=3x3x3)になり、かなり面倒です。
スクリプトを利用すると、割とシンプルに記述できます。下図 緑色−=〇が日勤


スクリプトの意味:
割り当て予定の勤務番号が1以上3以下の場合、
 前日の勤務番号が1以上3以下、かつ、前々日の勤務番号が1以上3以下の場合は割り当て不可 @
 前日の勤務番号が1以上3以下、かつ、翌日の勤務番号が1以上3以下の場合は割り当て不可 A
 翌日の勤務番号が1以上3以下、かつ、翌々日の勤務番号が1以上3以下の場合は割り当て不可 B
最初の割り当て時のみであれば(@)のみで可ですが、スクリプトは割り当て成功後の最適化時にも呼ばれるため、前後の勤務状態(AB)も考慮する必要があります。

また、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: 甲子〜癸亥
下記の例では六曜(先勝、先負・・・)が返される
VBS
JS
実際の作成例

6.2 グループ番号10「武士」は「友引」不可

VBS
JS
実際の作成例

7.勤務間隔

7.1 特定の勤務について、その間隔を個人単位に指定します。

全員について指定する場合は、「勤務種別設定-勤務間隔」でも可。
ID:340〜344の人の「日勤」間隔は「4日以上
VBS
JS
実際の作成例

7.2 全員が「日勤」間隔は「4日以上

最小勤務間隔の第2パラメータを省略すると全員が対象
前項(個人単位)と組み合わせも可(条件の厳しい方が適用)
VBS
JS
実際の作成例

8.勤務/グループ組み合わせ

8.1 ベテラン日勤が0人の場合は、新人早出不可

勤務種別 1:日勤 2:早出
グループ 1:ベテラン 3:新人
VBS
JS
実際の作成例
勤務種別表

作成したシフト表

ダウンロードサンプルページ

8.2 勤務を同じ日に割り当てない(340,341 は、同じ日に「日勤」不可)

勤務種別 1:日勤
ID:340 徳川 家斉  341 徳川 家慶
VBS
JS
実際の作成例
作成したシフト表:340 と 341 の「日勤」は同一日に割り当てられない。

補足:「メンバー員組み合わせ禁止」条件を使用しても可

8.3 グループ間でのメンバー組み合わせ禁止

夜勤入り( )にて、 「グループ2」(だいだい色)と「グループ3」(緑色)のメンバーが同じ日に組まないようにしたい


シフト表:
「グループ2」と「グループ3」のメンバーが、「夜勤入り」( )で同じ日に組まれていません。
分かりやすくするため、「夜勤入り」のみ色付けしています。


スクリプト

意味:
割り当てようとしている勤務が「夜勤入り」( ))の場合
 割り当てようとしているグループが「グループ2」(だいだい色)の場合
  「グループ3」(緑色)に「」または「」が既に割り当てられいる場合、「割り当て不可」
 割り当てようとしているのが「グループ3」(緑色)の場合
  「グループ2」(だいだい色)に「」または「」が既に割り当てられいる場合、「割り当て不可」

8.4 メンバー間の組み合わせ回数制限(同じメンバーで「夜勤」を期間内に1回まで)

340と341の組み合わせで「夜勤」は期間内に2回以上は禁止
勤務種別 5:夜勤
ID:340 徳川 家斉  341 徳川 家慶
VBS
JS

「組み合わせ回数」関数の仕様

10.複雑な組み合わせ

10.1 「340 〜 441」の人は休日の「夜勤」は最高1回まで

VBS
JS
実際の作成例
赤丸が休日(カレンダー日付の赤字)の夜勤
340〜441の人は、休日の夜勤は多くて「1回」に収まり、
以外の人は「2回以上」の場合も発生している。

10.2 ID番号が500番台以上の人は「夜勤」最高3回まで

VBS
JS

10.3 「340 徳川家斉」「341 徳川家慶」さんは、全勤務で同じ日に同じ勤務は不可

VBS
JS

11.複数勤務の合計回数制限

11.1 複数勤務の合計回数を制限

期間内で、勤務の回数を制限するには「勤務日数()」関数が利用できます。
同じく、複数の勤務で合計回数を制限するときにも同様に使用します。

ここでは、グループ(=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)
包含Grpに指定グループ(No=10)以外のすべてのグループを登録

・要求数とユーザースクリプトを指定

早出1(△)の要求数を「2」人としています。


割当ようとしている人のグループがNo=40(武士以外の全て)で、勤務が「△」の時
 グループ(No=40)への「△」(No=2)の割り当て人数合計が1を超える場合 → 割当不可

VBS
JS

・作成結果

「武士」(No=10)には、「△」は最少「1」人が割り当てられています。


B.指定グループに対して、複数勤務の最少合計回数を指定

複数勤務の合計回数の最少値は、メンバー組み合わせ必須では指定できません。
前項Aの考え方と同じく、指定グループ以外に対して最大値を制限することで実現します。

ここでは、武士(No=10)グループに対して、△と▽の割り当て人数をに最低2名を指定します。
(≒「武士」以外のグループへ△▽の割当合計が2名を超える場合は不可

・要求数とユーザースクリプトを指定
△と▽の要求数を、各2名とします。


割当ようとしている人のグループがNo=40(武士以外の全て)で、勤務が「△」の時
 グループ(No=40)への「△」(No=2)の割り当て人数合計が1を超える場合 → 割当不可

VBS
JS

・作成結果
赤枠の武士(No=10)に、△と▽の合計割り当て人数が、2名以上割り当てられています。


12.グループ内勤務組み合わせ制限

12.1 特定グループ内で日勤と遅出の同時割り当て不可

グループ(10)において
 グループ内の誰かに「日勤:日」が割り当てられている場合は、
 そのグループ内の他のメンバーに「遅出:▲」を割り当てない。
同じく、「遅出:▲」が割り当てられたら、他のメンバーには「日勤:日」を割り当てない。

VBS
JS


作成結果例

赤枠のグループ内では、「日」と「▲」が同時に割り当てられない。
青枠のグループでは、同時に割り当てられる場合が発生している。

12.2 全グループで、同一グループ内での日勤と遅出の同時割り当て不可

全グループにおいて
 それぞれのグループ内の誰かに「日勤:日」が割り当てられている場合は、
 そのグループ内の他のメンバーに「遅出:▲」を割り当てない。
同じく、誰かに「遅出:▲」が割り当てられたら、他のメンバーには「日勤:日」を割り当てない。

VBS
JS


作成結果例

全グループにおいて
 赤枠の全グループ内では、「日」と「▲」が同時に割り当てれていない。


★スクリプトの記述について

一度に多数のスクリプトを入力すると、エラーになった場合に何処が間違っているかを切り分けるのが困難です。
ひとつ追加したら構文チェックをして、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番号)」にて左かっこ「(」が欠落しています。


■エラーコード


 VBScript
   構文エラー  − Web
   実行時エラー − Web

 JScript
   構文エラー  − Web
   実行時エラー − Web

VBScript 構文エラー


構文エラー例

例:正常の場合


例:関数の丸括弧漏れ:関数名(xxx)の形式で認識されるので、()が無い場合はエラーとなる


例:丸括弧漏れ:if文などでの括弧漏れ の部分(閉じ括弧過剰/不足)


例:比較演算子不正:javascriptでの不等号は「 != 」(「<>」はVBでの記述)


例:比較演算子不正2:javascriptでの論理積は 「&&」 (「and」はVBでの記述)

VBScript 実行時エラー


×
PageTop