有用なスケジュールスクリプト
ビジネスルールスクリプトは、ビジネスルールが実行するアクションを指定します。通常、スクリプトには、現在のレコードなどの、システム内のアイテムを参照するための事前定義されたグローバル変数が含まれています。グローバル変数はすべてのビジネスルールで使用できます。
スケジュールを指定して期間を計算
タイプ: ビジネスルールの更新/挿入前。
説明:ビジネス期間は、特定の「スケジュールの作成と使用」に基づいて、インシデントのオープンからクローズまでの期間を計算します。スケジュールが指定されていない場合、スクリプトはクエリによって返された最初のスケジュールだけを使用します。
スクリプトの例:
var gr_rec = new GlideRecord('incident');
gr_rec.get('ed92e8d173d023002728660c4cf6a7bc');
if (gr_rec.incident_state == 6) {
var dur = calcDurationSchedule(gr_rec.opened_at, gr_rec.sys_updated_on);
}
function calcDurationSchedule(start, end){
// Get the user
var usr = new GlideRecord('sys_user');
usr.get(gs.getUserID());
// Create schedule - pass in the sys_id of your standard work day schedule and pass in the users timezone
var sched = new GlideSchedule('08fcd0830a0a0b2600079f56b1adb9ae',usr.time_zone);
// Get duration based on schedule/timezone
return(sched.duration(start.getGlideObject(), end.getGlideObject()));
}今後の終了日を確認
タイプ:スケジュール設定済みスクリプト。
説明:このスクリプトは、今後 90 日、50 日、または 10 日以内 (契約期間フィールドでの指定に応じる) に終了する契約の終了日を夜間にチェックします。
スクリプトの例:
function contractNoticeDue(){
var now_GR = new GlideRecord("contract");
now_GR.addQuery("u_contract_status","Active");
now_GR.query();
while(now_GR.next()){
if((now_GR.u_termination_date<= gs.daysAgo(-90))&&(now_GR.u_contract_duration=="Long")){
now_GR.u_contract_status="In review";}
elseif((now_GR.u_termination_date<= gs.daysAgo(-50))&&(now_GR.u_contract_duration=="Medium")){
now_GR.u_contract_status="In review";}
elseif((now_GR.u_termination_date <= gs.daysAgo(-10))&&(now_GR.u_contract_duration=="Short")){
now_GR.u_contract_status="In review";}
now_GR.update();
}
}- 2 つの日付フィールドを比較します。
- XML ペイロードを解析します。
- ビジネスルール内のデータベースアクションを中止します。
- ビジネスルールをトリガーする操作を指定します。
- スクラッチパッドと表示ビジネスルールを使用して、ユーザーがフォームをロードする直前にフォームの値を変更します。
- 条件ビルダーの場合と同様に OR 条件を使用します。
サーバーサイドスクリプトで使用可能なシステムのスクリプティング機能を利用することもできます。
ビジネスルールフォームのオプションを使用すると、スクリプトを記述せずに条件をビルドし、フィールド値を設定して、アラートメッセージを表示できます。
ビジネスルール内のデータベースアクションの中止
前のビジネスルールスクリプトの実行中に、current.setAbortAction(true) メソッドを使用して現在のデータベースアクションをキャンセルまたは中止できます。
たとえば、前のビジネスルールが挿入アクション中に実行され、スクリプトに current.setAbortAction(true) を呼び出す条件がある場合、current に保存される新しいレコードはデータベース内には作成されません。
オートフィル機能の追加
オートフィル機能の追加は、インシデントテンプレート、自動アサイン、クイックコール、コールスクリプト、または自動入力とも呼ばれます。
選択した [サブカテゴリ] に基づいて [簡単な説明] を自動入力するとします。まず、ルックアップテーブルを作成し、キーフィールド (この場合は [サブカテゴリ]) とオートフィルされるフィールド [簡単な説明] に値を入力します。テーブルに、[サブカテゴリ] = パスワード、[簡単な説明] = パスワードリセットのレコードがあるとします。ユーザーがインシデントフォームで [サブカテゴリ] にパスワードを選択した場合、クライアントスクリプトは一致するレコードを検索し、[簡単な説明] をパスワードリセットに設定します。クライアントスクリプト設定...[タイプ] = onChange、[テーブル名] = インシデント、[フィールド名] = サブカテゴリ。
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading) { return; }
var newrec = gel('sys_row');
//Check if new record
if (newrec.value == -1) {
var lookup = new GlideRecord('u_short_desc_lookup');
lookup.addQuery('u_subcategory', g_form.getValue('subcategory'));
lookup.query();
var temp; //temp var - reusable
if (lookup.next()) {
temp = lookup.u_short_description;
if (null != temp) { //Set the form value from lookup if there is a lookup value
g_form.setValue('short_description', temp); }
else {
g_form.setValue('short_description', "" ); } }
else {
//If a lookup record does not exist based on lookup.addQuery
//Then set to UNDEFINED or NULL depending on type
g_form.setValue('short_description', ""); } }
}多くのフィールドに値を入力したり、コールスクリプトの質問を [コメント] フィールドに入力して、コールセンターの担当者が技術者に提供する適切な情報を収集することもできます。類似の機能を実行するアサインルール、テンプレート、およびウィザードが既に組み込まれています。
スクリプト例:デフォルトのクエリ前のビジネスルール
データベースクエリの前に実行されるクエリビジネスルールを使用して、ユーザーが特定のレコードにアクセスできないようにすることができます。
インシデントレコードへのアクセスを制限するデフォルトのビジネスルールの以下の例を考慮してください。
| 名前 | テーブル | 時期 |
|---|---|---|
| インシデントクエリ | インシデント | クエリ前 |
スクリプト例
if(!gs.hasRole("itil")&& gs.isInteractive()){
var u = gs.getUserID();
var qc = current.addQuery("caller_id", u).addOrCondition("opened_by", u).addOrCondition("watch_list","CONTAINS", u);
gs.print("query restricted to user: "+ u);}
平日のスケジュールスクリプト
タイプ:ビジネスルール/クライアントスクリプト
var go ='false';
var now =new Date();
// Correct time zone, which is by default GMT -7
now.setHours(now.getHours()+8);
var day = now.getDay();
// No go on Saturday or Sunday
if(day !=0&& day !=6){
// (your script here)
}現在の日付に基づく日付フィールドの設定
function setCabDate(){
var today =new Date();
var thisDay = today.getDay();
//returns 0 for Sunday, 1 for Monday, etc. thru 6 for Saturday.
var thisMon =new GlideDateTime();
thisMon.setDisplayValue(gs.beginningOfThisWeek());
var nextMon = thisMon.getNumericValue();
nextMon +=(1000*60*60*24*7);
if((thisDay <4)&&(thisDay >0))
//if today is Mon thru Wed (thisDay = 1, 2, or 3), set cab to this coming Monday.
current.u_req_cab_rev_date.setDateNumericValue(thisMon.getNumericValue());
elseif((thisDay >=4)||(thisDay ==0))
//if today is Thurs thru Sun (thisDay = 4, 5, 6, or 0), set cab to next Monday.
current.u_req_cab_rev_date.setDateNumericValue(nextMon);
}すべての日付/時刻フィールドの入力を検証するには、検証スクリプト (). このスクリプトでは日付/時刻形式がハードコードされているため、インスタンスの日付/時刻形式と一致する必要があります。インスタンスの日付/時刻形式が変更された場合は、検証スクリプトを更新する必要があります。
function validate(value){
// empty fields are still valid dates
if(!value)returntrue;
// We "should" have the global date format defined always defined. but there's always that edge case...
if(typeof g_user_date_time_format !=='undefined')return isDate(value, g_user_date_time_format);
// if we don't have that defined, we can always try guessing
return parseDate(value)!==null;}