ワークフロー・スクリプトの記述に関するベスト・プラクティス

この項では、ワークフロー・スクリプトが期待どおりの動作をするように、スクリプトを記述するためのベスト・プラクティスを紹介します。

このトピックの内容:

使用前に値タイプを確認する

値タイプが異なると、ステートメントによって動作も異なります。予期しない結果が発生しないようにするために、値を使用する前に値タイプを確認してください。

  • 不明な値タイプを確認します。

    たとえば、[不具合 ID]フィールド(BG_BUG_ID)の値タイプを確認するには、次のようにします。

    Copy code
    var valuetype = typeof Bug_Fields("BG_BUG_ID").Value;
    //Print it in console or show message dialog directly
    console.log(valuetype);
    //MesgBox(valuetype)
  • 文字列と数値の違いをチェックしない場合は、緩い等価演算子(==)を使用します。

    たとえば、次のステートメントは、値が文字列の 10 または数値の 10 の場合に実行されます。

    Copy code
    if (Bug_Fields)("BG_BUG_ID").Value == 10
  • 値タイプが明確な場合は、厳密な等価演算子(===)を使用します。

    たとえば、次のステートメントは、値が文字列の 10 の場合にのみ実行されます。

    Copy code
    if (Bug_Fields)("BG_BUG_ID").Value === '10'

先頭に戻る

値が空かどうかを確認する

エラーを避けるために、使用する前にすべての値が空でないことを確認します。

たとえば、カスタム・ユーザ・フィールド BG_USER_01 の値が配列である場合、値が空かどうかを確認するには、次のスクリプトを使用します。

Copy code
var userField = Bug_Fields("BG_USER_01");
var value = userField.Value;
var isMultiple = userField.IsMultiValue;
if (isMultiple && Array.isArray(value)) && value.length > 0) {
//何かを実行します。
}

先頭に戻る

比較前に日付文字列から Date オブジェクトに変換する

有効である限り、さまざまな日付文字列形式が受け入れられます。日付を比較する場合は、それぞれの日付文字列を Date オブジェクトに変換してから比較することをお勧めします。

たとえば、バグの検出日が特定の日付より前の場合にメッセージ・ボックスを表示するように定義する場合は、次のスクリプトを作成します。

Copy code
function Bug_MoveTo() {
    var detectionDate = new Date(Bug_Fields("BG_DETECTION_DATE").Value);
    var toComparedDate = new Date('2023/12/12');
    if (detectionDate  < toComparedDate) {
        MsgBox(Bug_Fields("BG_BUG_ID").Value);
    }
}

先頭に戻る

switch に break ステートメントを追加して、default アクションを指定する

switch ステートメントを使用して、さまざまな条件に応じて異なるアクションを実行する場合は、必ず break ステートメントと default 句も追加します。

  • break ステートメント:switch-case の後の break は、switch ステートメントのフォールスルーを回避するために使用されます。

  • default 句:一致しない場合は、default 句のコード・ブロックが実行されます。

次に例を示します。

Copy code
functionBug_FieldChange(fieldName) {
  var StatusFieldName = 'BG_STATUS';
  if (fieldName == StatusFeildName) {
    var value = Bug_Fields(StatusFieldName).Value;
    switch (value) {
      case 'New'
        // ステータスが New に変更された場合の実行内容を定義するコード・ブロックを追加します。
        break;
      case 'Open'
        // // ステータスが Open に変更された場合の実行内容を定義するコード・ブロックを追加します。
        break;
      default
        // // 一致がない場合の実行内容を定義するコード・ブロックを追加します。
        break
      }
     return;
}
// 変更されたフィールドが Status でない場合の実行内容を定義するコード・ブロックを追加します。
}

先頭に戻る

[新規エンティティ]ダイアログ・ボックスと[エンティティの詳細]ダイアログ・ボックスを区別する

ワークフロー・スクリプトをイベントに追加する前に、ユーザがエンティティを作成したとき、またはエンティティを開いたときにイベントがトリガされるかどうかを確認します。

次の例では、ユーザが不具合を作成したときに Bug_FieldChange イベントがトリガされます。

Copy code
function Bug_FieldChange(fieldName) {
  if (ActiveDialogName === 'New Bug') {
    //ユーザが不具合を作成したときの実行内容を定義するコードを追加します。
  } else {
    //ユーザが不具合を編集したときの実行内容を定義するコードを追加します。
  }
  
}

先頭に戻る

重複した変数または関数を定義するのを回避する

あるセクションで変数または関数を定義し、別のセクションで同じ名前の別の変数または関数を追加すると、競合が発生します。この場合、いずれかの変数または関数は実行されません。

変数または関数の定義時に予期しない競合が発生しないように、プロジェクト内に同じ名前の変数または関数が存在しないかどうかを常に確認してください。

先頭に戻る

メッセージ・ボックスの使用について

MsgBox 関数を使用してメッセージ・ボックスをポップアップ表示した場合、残りの操作の実行はブロックされません。メッセージ・ボックスでユーザの操作が実行されるまで他の操作をブロックしたい場合は、promise または await/async を使用できます。

注: MsgBox は、詳細プロジェクト・スクリプトには適用できません。

たとえば、promise や await/async を使用せずに次のように Bug_New イベントをカスタマイズすると、ユーザが不具合を作成するとメッセージ・ボックスと[新規不具合]ダイアログ・ボックスが同時に開きます。

Copy code
function Bug_New()  {
    MsgBox('Show this message');
    Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
}

次のように promise または await/async を使用すると、ユーザが不具合を作成したときにメッセージ・ボックスがポップアップし、ユーザがメッセージ・ボックスで[OK]をクリックしたときにのみ、[新規不具合]ダイアログ・ボックスが表示されます。

Copy code
function Bug_New()  {
    return MsgBox('Show this message before new dialog').then(function() {
    Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
});
}
Copy code
async function Bug_New()  {
    await MsgBox('Show this message before new dialog');
    Bug_Fields("BG_ACTUAL_FIX_TIME").Value = 50;
}

注: await/async には、ブラウザのバージョンについてより高い要件があります。await/async を使用する前に、ブラウザでサポートされているかどうかを確認してください。

先頭に戻る

トラブルシューティングのためにログ・レベルを「デバッグ」に設定する

適用対象:詳細プロジェクト・スクリプト。

詳細プロジェクト・スクリプトを実行する場合のトラブルシューティングに役立つように、ログ・レベルを「デバッグ」に設定します。これにより、デバッグに最も役立つイベントが記録されます。

ログ・レベルの設定の詳細については、サーバのログ・ファイルの設定を参照してください。

先頭に戻る