有用なスケジュールスクリプト

  • リリースバージョン: Washingtondc
  • 更新日 2024年02月01日
  • 読む11読むのに数分
  • ビジネスルールスクリプトは、ビジネスルールが実行するアクションを指定します。通常、スクリプトには、現在のレコードなどの、システム内のアイテムを参照するための事前定義されたグローバル変数が含まれています。グローバル変数はすべてのビジネスルールで使用できます。

    警告:
    ここに記載されているカスタマイズは、特定のインスタンスで使用するために開発されたものであり、Now Support ではサポートされていません。この方法は現状のまま提供され、実装の前に完全にテストする必要があります。このカスタマイズに関するすべての質問およびコメントは、コミュニティフォーラムに投稿してください。

    スケジュールを指定して期間を計算

    タイプ: ビジネスルールの更新/挿入前

    テーブル:インシデント

    説明:ビジネス期間は、特定の「スケジュールの作成と使用」に基づいて、インシデントのオープンからクローズまでの期間を計算します。スケジュールが指定されていない場合、スクリプトはクエリによって返された最初のスケジュールだけを使用します。

    スクリプトの例:

    次の例では、インシデントステータスが解決済みに移行するときの解決期間を設定します。
    if(current.incident_state==6){
      var dur = calcDurationSchedule(current.opened_at,current.sys_updated_on);
      current.u_resolved_duration= dur;
     
      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");
    gr.addQuery("u_contract_status","Active");
    gr.query();
    while(gr.next()){
      if((gr.u_termination_date<= gs.daysAgo(-90))&&(gr.u_contract_duration=="Long")){
        gr.u_contract_status="In review";}
      elseif((gr.u_termination_date<= gs.daysAgo(-50))&&(gr.u_contract_duration=="Medium")){
        gr.u_contract_status="In review";}
      elseif((gr.u_termination_date<= gs.daysAgo(-10))&&(gr.u_contract_duration=="Short")){
        gr.u_contract_status="In review";}
      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', ""); } }
     
     }

    多くのフィールドに値を入力したり、コールスクリプトの質問を [コメント] フィールドに入力して、コールセンターの担当者が技術者に提供する適切な情報を収集することもできます。類似の機能を実行するアサインルール、テンプレート、およびウィザードが既に組み込まれています。

    スクリプト例:デフォルトのクエリ前のビジネスルール

    データベースクエリの前に実行されるクエリビジネスルールを使用して、ユーザーが特定のレコードにアクセスできないようにすることができます。

    警告:
    ここに記載されているカスタマイズは、特定のインスタンスで使用するために開発されたものであり、Now Support ではサポートされていません。この方法は現状のまま提供され、実装の前に完全にテストする必要があります。このカスタマイズに関するすべての質問およびコメントは、コミュニティフォーラムに投稿してください。

    インシデントレコードへのアクセスを制限するデフォルトのビジネスルールの以下の例を考慮してください。

    表 : 1. デフォルトのビジネスルールでのインシデントレコードへのアクセスの制限
    名前 テーブル 時期
    インシデントクエリ インシデント クエリ前

    スクリプト例

    この例では、ユーザーが [問い合わせユーザー(Caller)] または [作成者] フィールドにリストされている itil ロールを持っている場合を除き、インシデントレコードにアクセスできません。そのため、セルフサービスユーザーがインシデントのリストを開くと、自分が送信したインシデントしか表示されません。
    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);}
    注:
    ユーザーに表示されるレコードは、アクセス制御を使用して制限することもできます。

    平日のスケジュールスクリプト

    タイプ:ビジネスルール/クライアントスクリプト

    このスクリプトは平日のスクリプトをスケジュールします。「スクリプトをここに入力 (Your Script here)」と表示されている場所にスクリプトを挿入します。
    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;}
    図 : 1. 日付/時刻の検証