mcpField
W
workflow-creation

workflow-creation

github.com/happy-technologies-llc開発4143 回インストール4 日前に更新
リポジトリ

workflow-creation について

APIまたはMCP経由でServiceNowのワークフローを作成するスキルです。デプロイの自動化、一括生成、移行を行う管理者向けに、バージョン、スクリプト付きアクティビティ、条件、遷移、公開の手順を扱います。

主な機能

  1. 01ワークフローとバージョンの作成
  2. 02スクリプト付きアクティビティの追加
  3. 03分岐条件と遷移の設定
  4. 04ワークフローの公開と検証

活用シーン

  1. 01CI/CDデプロイでのワークフロー作成
  2. 02テンプレートから類似ワークフローを生成
  3. 03ワークフロー定義のGit管理
  4. 04インスタンス間でのワークフロー再作成

MCP 対応

ServiceNow MCPツールによるアクティビティタイプの検索、ワークフローとアクティビティの作成、遷移の定義、公開の方法を説明します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill workflow-creation

インストール後、Claude Code で/workflow-creationを入力して読み込まれたか確認します。

詳細

プログラムによるワークフローの作成

概要

このスキルを使うと、ビジュアルのワークフローエディターを使わずに、API/MCP 経由で ServiceNow ワークフローをすべて作成できます。これは、次のような用途に不可欠です。

  • 自動化パイプライン - CI/CD デプロイの一環としてワークフローを作成します
  • テンプレート化されたソリューション - テンプレートから標準化されたワークフローを生成します
  • 大量作成 - 類似したワークフローを複数、プログラムで作成します
  • バージョン管理 - ワークフローの定義をコードとして Git に保存します
  • 環境の移行 - インスタンス間でワークフローを再作成します

重要な発見: アクティビティは、input フィールドに JavaScript コードとしてロジックを保存します。これにより、次の手順でワークフローを完全にプログラムから作成できます。

  1. ワークフロー構造を作成します(wf_workflow、wf_workflow_version)
  2. スクリプトを埋め込んだアクティビティを作成します(wf_activity)
  3. 遷移を使ってアクティビティをリンクします(wf_transition、wf_condition)
  4. ワークフローのバージョンを公開します

前提条件

  • ロール: admin または workflow_admin
  • 権限: ワークフローテーブル(wf_*)への書き込みアクセス
  • 知識: ワークフローの概念に関する基本的な理解
  • 環境: 開発またはテストインスタンス(最初から本番環境でワークフローを作成しないでください)
  • 関連スキル: admin/update-set-management - ワークフローを更新セットに取り込みます

テーブルアーキテクチャ

プログラムによる作成では、ワークフローテーブルを理解することが重要です。

コアテーブル
wf_workflow (base definition)
    |
    +-- wf_workflow_version (published versions)
            |
            +-- wf_activity (activities with scripts)
            |       |
            |       +-- wf_element_definition (activity types)
            |       +-- wf_stage (optional stages)
            |
            +-- wf_transition (connects activities)
            |       |
            |       +-- wf_condition (transition logic)
            |
            +-- wf_condition (workflow-level conditions)
主なリレーション
テーブル用途主なフィールド
wf_workflow基本ワークフロー定義name、table、description
wf_workflow_versionバージョン管理されたワークフローworkflow、table、start、published
wf_activity個々のアクティビティworkflow_version、input、x、y
wf_transitionアクティビティの接続from、to、condition
wf_condition遷移条件activity、condition、else_flag
wf_element_definitionアクティビティタイプの定義name、default_input

手順

ステップ 1:アクティビティタイプを確認する

まず、使用可能なアクティビティタイプ(wf_element_definition)を特定します。

MCP を使用する場合:

Tool: SN-Query-Table
Parameters:
  table_name: wf_element_definition
  query: active=true
  fields: sys_id,name,category,description
  limit: 50

一般的なアクティビティタイプ:

sys_id名前使用例
0a6c97790a0a0b2756919eb960284334通知メール/SMS を送信
1ca8d7cf0a0a0b265e9a000c2c08248c値の設定フィールド値を設定
35433da80a0a029a0028c639a1e51eb4承認 - ユーザーユーザーによる承認
354e911f0a0a029a00e6a0e6ad74206f承認 - グループグループによる承認
283e8bb80a2581021d036a052ffc3433承認コーディネーター複数承認のコンテナー
38891b6f0a0a0b1e00efdfdd77602027カタログタスクカタログタスクを作成
3961a1da0a0a0b5c00ecd84822f70d85タイマー待機/遅延
396807940a0a0b5c00afd9f67d9fd7a2ログメッセージデバッグログ
5994b389c0a80011000e64de81b1864cサブフロー別のワークフローを呼び出す
7c9a2ba9c0a801650021ada408de0ebd結合複数の経路を待機
7a8ea386c0a80066179bc1f5186e1d2bロールバック前のアクティビティに戻る

注: カスタムスクリプトアクティビティでは、activity_definition を完全に省略できます。

ステップ 2:基本ワークフローを作成する

ワークフローのコンテナーレコードを作成します。

MCP を使用する場合(推奨):

Tool: SN-Create-Workflow
Parameters:
  name: "P1 Incident Auto-Assignment"
  table: "incident"
  description: "Auto-assign P1 incidents to on-call engineer"
  condition: "priority=1^state=1"

SN-Create-Record を使用する場合:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow
  data:
    name: "P1 Incident Auto-Assignment"
    description: "Auto-assign P1 incidents to on-call engineer"
    template: false
    access: "public"

重要: name フィールドと table フィールドは、作成後に読み取り専用になります。慎重に選択してください。

sys_id を保存します: workflow_sys_id

ステップ 3:ワークフローバージョンを作成する

実際のワークフローロジックを保持するバージョンを作成します。

MCP を使用する場合:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow_version
  data:
    name: "P1 Incident Auto-Assignment"
    workflow: [workflow_sys_id]
    table: "incident"
    condition: "priority=1^state=1"
    active: true
    published: false
    order: 100
    run_multiple: false
    after_business_rules: true

主なフィールド:

フィールド用途備考
table対象テーブル必須 - このワークフローを起動するレコードを指定します
conditionトリガー条件エンコードされたクエリ形式
activeアクティブかどうかワークフローを実行するには true に設定します
published公開済みかどうか最初は false に設定し、テスト後に公開します
run_multiple同時インスタンスを許可通常は false
after_business_rules実行タイミング通常は true

sys_id を保存します: version_sys_id

ステップ 4:アクティビティを作成する

スクリプトを埋め込んだ各アクティビティを作成します。

アクティビティ 1:開始アクティビティ

MCP を使用する場合(推奨):

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Check On-Call Engineer"
  x: 100
  y: 100
  script: |
    // Find on-call engineer
    var oncall = new GlideRecord('on_call_rotation');
    oncall.addQuery('active', true);
    oncall.addQuery('group', current.assignment_group);
    oncall.query();
    if (oncall.next()) {
      workflow.scratchpad.oncall_engineer = oncall.user.toString();
      gs.info('Found on-call: ' + oncall.user.name);
    } else {
      workflow.scratchpad.oncall_engineer = '';
      gs.warn('No on-call engineer found');
    }

SN-Create-Record を使用する場合:

Tool: SN-Create-Record
Parameters:
  table_name: wf_activity
  data:
    name: "Check On-Call Engineer"
    workflow_version: [version_sys_id]
    x: 100
    y: 100
    width: 150
    height: 80
    input: |
      // Script content here...

sys_id を保存: activity_start_id

アクティビティ 2:判断/分岐アクティビティ

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Assign to On-Call"
  x: 250
  y: 100
  script: |
    // Assign incident based on on-call lookup
    if (workflow.scratchpad.oncall_engineer) {
      current.assigned_to = workflow.scratchpad.oncall_engineer;
      current.state = 2;  // In Progress
      current.work_notes = 'Auto-assigned to on-call engineer by workflow';
      current.update();
      answer = 'assigned';
      gs.info('Assigned to: ' + current.assigned_to.name);
    } else {
      answer = 'no_oncall';
      gs.warn('Could not assign - no on-call engineer');
    }

sys_id を保存: activity_assign_id

アクティビティ 3:通知アクティビティ

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Send Notification"
  x: 400
  y: 100
  type: "notification"
  script: |
    // Send email notification
    var email = new GlideEmailOutbound();
    email.setSubject('P1 Incident Assigned: ' + current.number);
    email.setFrom('[email protected]');
    email.addAddress(current.assigned_to.email);
    email.setBody('You have been assigned P1 incident: ' + current.number + '\n' +
                  'Priority: 1\n' +
                  'Short Description: ' + current.short_description);
    email.send();
    gs.info('Notification sent to: ' + current.assigned_to.email);

sys_id を保存: activity_notify_id

アクティビティ 4:エスカレーションアクティビティ(分岐パス)

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Escalate to Manager"
  x: 250
  y: 250
  script: |
    // Escalate to manager
    var manager = current.assignment_group.manager;
    if (manager) {
      current.assigned_to = manager;
      current.escalation = 1;
      current.work_notes = 'Escalated to manager - no on-call engineer available';
      current.update();
      gs.info('Escalated to manager: ' + manager.name);
    }

sys_id を保存: activity_escalate_id

ステップ 5:遷移条件を作成する

分岐パスの条件を定義します。

条件 1:「割り当て済み」パス

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "Assigned Successfully"
    short_description: "On-call engineer found and assigned"
    condition: "answer=assigned"
    order: 1

sys_id を保存: condition_assigned_id

条件 2:「オンコール担当者なし」パス

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "No On-Call"
    short_description: "No on-call engineer found"
    condition: "answer=no_oncall"
    order: 2

Else 条件(デフォルトパス):

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "Default"
    short_description: "Default path"
    else_flag: true
    order: 99
ステップ 6:遷移を作成する

遷移を使ってアクティビティ同士をつなぎます。

MCP を使用する場合(推奨):

Tool: SN-Create-Transition
Parameters:
  from_activity_id: [activity_start_id]
  to_activity_id: [activity_assign_id]

遷移 1:開始から割り当てへ

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_start_id]
    to: [activity_assign_id]
    order: 1

遷移 2:割り当てから通知へ(条件付き)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_assign_id]
    to: [activity_notify_id]
    condition: [condition_assigned_id]
    order: 1

遷移 3:割り当てからエスカレーションへ(条件付き)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_assign_id]
    to: [activity_escalate_id]
    condition: [condition_no_oncall_id]
    order: 2

遷移 4:エスカレーションから通知へ(エスカレーション後)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_escalate_id]
    to: [activity_notify_id]
    order: 1
ステップ 7:開始アクティビティを設定して公開する

開始アクティビティを設定し、ワークフローのバージョンを更新して公開します。

MCP を使用する場合(推奨):

Tool: SN-Publish-Workflow
Parameters:
  workflow_version_id: [version_sys_id]
  start_activity_id: [activity_start_id]

SN-Update-Record を使用する場合:

Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [version_sys_id]
  data:
    start: [activity_start_id]
    published: true
ステップ 8:ワークフローを確認する

ワークフローの構造を確認するクエリを実行します。

アクティビティを確認:

Tool: SN-Query-Table
Parameters:
  table_name: wf_activity
  query: workflow_version=[version_sys_id]
  fields: sys_id,name,x,y

遷移を確認:

Tool: SN-Query-Table
Parameters:
  table_name: wf_transition
  query: from.workflow_version=[version_sys_id]
  fields: sys_id,from.name,to.name,condition.name

ワークフローのバージョンを確認:

Tool: SN-Query-Table
Parameters:
  table_name: wf_workflow_version
  query: sys_id=[version_sys_id]
  fields: name,table,start.name,published,active

ワークフローのコンテキストとスクリプト

アクティビティスクリプトで使用できる変数
// The current record being processed
current

// Workflow scratchpad - share data between activities
workflow.scratchpad.your_variable = 'value';

// Activity result - determines which transition to follow
answer = 'approved';  // String that matches condition

// Current activity object
activity

// Workflow context
workflow.name
workflow.context.sys_id
よく使われるスクリプトパターン

アクティビティ間でデータを渡す:

// Activity 1: Store data
workflow.scratchpad.user_tier = current.u_tier;
workflow.scratchpad.requires_approval = true;
workflow.scratchpad.approval_reasons = [];

// Activity 2: Use stored data
if (workflow.scratchpad.requires_approval) {
  var reasons = workflow.scratchpad.approval_reasons;
  // Process reasons...
}

answer 変数を使った分岐ロジック:

// Set answer to determine which transition fires
if (current.priority == 1) {
  answer = 'high_priority';
} else if (current.priority == 2) {
  answer = 'medium_priority';
} else {
  answer = 'low_priority';
}
// Create transitions with conditions: answer=high_priority, etc.

エラー処理:

try {
  var gr = new GlideRecord('incident');
  gr.get(current.sys_id);
  // Processing...
  answer = 'success';
} catch(e) {
  gs.error('Workflow error in ' + activity.name + ': ' + e.message);
  workflow.scratchpad.error_message = e.message;
  answer = 'error';
}

デバッグ用のログ記録:

gs.info('[Workflow: ' + workflow.name + '] Activity: ' + activity.name);
gs.info('[Workflow] Processing incident: ' + current.number);
gs.info('[Workflow] Scratchpad data: ' + JSON.stringify(workflow.scratchpad));

アクティビティタイプの例

承認 - ユーザー
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Manager Approval"
  x: 300
  y: 150
  type: "35433da80a0a029a0028c639a1e51eb4"
  script: |
    // Create approval request for manager
    var approval = new GlideRecord('sysapproval_approver');
    approval.initialize();
    approval.document_id = current.sys_id;
    approval.source_table = current.getTableName();
    approval.approver = current.opened_by.manager;
    approval.state = 'requested';
    approval.insert();
    gs.info('Approval created for: ' + current.opened_by.manager.name);
承認 - グループ
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "CAB Approval"
  x: 300
  y: 150
  type: "354e911f0a0a029a00e6a0e6ad74206f"
  script: |
    // Create group approval request
    var approval = new GlideRecord('sysapproval_group');
    approval.initialize();
    approval.document_id = current.sys_id;
    approval.source_table = current.getTableName();
    approval.assignment_group = 'CAB';  // sys_id or name
    approval.state = 'requested';
    approval.insert();
カタログタスク
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Create Fulfillment Task"
  x: 350
  y: 150
  type: "38891b6f0a0a0b1e00efdfdd77602027"
  script: |
    // Create catalog task
    var task = new GlideRecord('sc_task');
    task.initialize();
    task.request_item = current.sys_id;
    task.short_description = 'Fulfill: ' + current.short_description;
    task.assignment_group = current.assignment_group;
    task.state = 1;  // Open
    var taskId = task.insert();
    workflow.scratchpad.task_sys_id = taskId;
    gs.info('Created task: ' + task.number);
タイマー/待機
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Wait 24 Hours"
  x: 400
  y: 150
  type: "3961a1da0a0a0b5c00ecd84822f70d85"
  script: |
    // Timer configuration is typically in vars field
    // This activity waits before proceeding
    gs.info('Timer started - will continue in 24 hours');
通知
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Send Email"
  x: 450
  y: 150
  type: "0a6c97790a0a0b2756919eb960284334"
  script: |
    // Send notification
    var email = new GlideEmailOutbound();
    email.setSubject('Request Update: ' + current.number);
    email.setFrom('[email protected]');
    email.addAddress(current.opened_by.email);
    email.setBody('Your request ' + current.number + ' has been processed.\n\n' +
                  'Status: ' + current.state.getDisplayValue());
    email.send();
値の設定
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Update Record Status"
  x: 500
  y: 150
  type: "1ca8d7cf0a0a0b265e9a000c2c08248c"
  script: |
    // Set field values
    current.state = 3;  // Closed
    current.close_code = 'Resolved';
    current.close_notes = 'Completed via workflow';
    current.closed_at = gs.nowDateTime();
    current.update();
結合(複数のパスを待機)
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Wait for All Approvals"
  x: 400
  y: 200
  type: "7c9a2ba9c0a801650021ada408de0ebd"
  script: |
    // Join waits for all incoming transitions to complete
    gs.info('All paths completed - continuing workflow');

キャンバスレイアウトのベストプラクティス

座標系
Origin (0,0)
    +-----------------------------------------> X (horizontal)
    |
    |   [Start]       [Process]      [End]
    |   (100,100)     (250,100)      (400,100)
    |
    |                 [Branch A]
    |                 (250,200)
    |
    |                 [Branch B]
    |                 (250,300)
    |
    v
    Y (vertical)
推奨される間隔
  • 開始位置: x=100, y=100
  • 水平方向の間隔: 順次実行されるアクティビティ間で 150-200 ピクセル
  • 垂直方向の間隔: 分岐パスでは 100-150 ピクセル
  • 標準サイズ: width=150, height=80
レイアウトパターン

線形フロー:

[Start] ---> [Process] ---> [End]
(100,100)    (250,100)      (400,100)

判断分岐:

                +---> [Yes Path] --+
               /     (250,100)      \
[Decision] ---+                      +---> [Join]
(100,150)      \                    /     (400,150)
                +---> [No Path] ---+
                     (250,200)

並列パス:

           +---> [Task 1] ---+
          /     (200,100)     \
[Start] -+                     +---> [Join] ---> [End]
(100,150) \                   /     (400,150)    (550,150)
           +---> [Task 2] ---+
                (200,200)

ワークフローのテスト

公開前のテスト
  1. 構造を確認:
Tool: SN-Query-Table
Parameters:
  table_name: wf_activity
  query: workflow_version=[version_sys_id]
  fields: name,x,y
  1. 遷移を確認:
Tool: SN-Query-Table
Parameters:
  table_name: wf_transition
  query: from.workflow_version=[version_sys_id]
  fields: from.name,to.name,condition.name
  1. 未公開バージョンでテストする: テスト中は published: false のままにします。ワークフローは手動テストで引き続き実行できます。
実行時のデバッグ

ワークフローのログ記録を有効にする:

// Add to activities for debugging
gs.info('[WF-DEBUG] Activity: ' + activity.name);
gs.info('[WF-DEBUG] Current: ' + current.number);
gs.info('[WF-DEBUG] Scratchpad: ' + JSON.stringify(workflow.scratchpad));

ワークフローのコンテキストを表示する:

Tool: SN-Query-Table
Parameters:
  table_name: wf_context
  query: workflow_version=[version_sys_id]^state=executing
  fields: sys_id,state,started,scratchpad

アクティビティの履歴を表示する:

Tool: SN-Query-Table
Parameters:
  table_name: wf_history
  query: context.workflow_version=[version_sys_id]
  fields: activity.name,state,started,ended,output
  orderBy: started
よく使われるデバッグクエリ

失敗したコンテキストを検索:

Tool: SN-Query-Table
Parameters:
  table_name: wf_context
  query: workflow_version=[version_sys_id]^state=cancelled
  fields: sys_id,state,result,scratchpad

停止したアクティビティを検索:

Tool: SN-Query-Table
Parameters:
  table_name: wf_executing
  query: context.workflow_version=[version_sys_id]
  fields: activity.name,state,started

バージョン管理と公開

ワークフローのバージョン管理

新しいバージョンを作成:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow_version
  data:
    name: "P1 Incident Auto-Assignment v2"
    workflow: [workflow_sys_id]
    table: "incident"
    condition: "priority=1^state=1"
    active: true
    published: false

次に、新しいバージョン用にアクティビティと遷移を再作成します。

古いバージョンを無効化する
Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [old_version_sys_id]
  data:
    active: false
新しいバージョンを公開する
Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [new_version_sys_id]
  data:
    published: true

ツールの使用方法の概要

MCP ツール(推奨)
ツール用途
SN-Create-Workflow1 回の呼び出しでアクティビティを含むワークフローを作成
SN-Create-Activity個別のアクティビティを追加
SN-Create-Transitionアクティビティ同士を接続
SN-Publish-Workflow開始アクティビティを設定して公開
SN-Create-Record汎用的なレコード作成
SN-Update-Record既存のレコードを更新
SN-Query-Tableワークフローのテーブルをクエリ
REST API(代替手段)
エンドポイントメソッド目的
/api/now/table/wf_workflowPOSTワークフローを作成
/api/now/table/wf_workflow_versionPOSTバージョンを作成
/api/now/table/wf_activityPOSTアクティビティを作成
/api/now/table/wf_transitionPOST遷移を作成
/api/now/table/wf_conditionPOST条件を作成
/api/now/table/wf_workflow_version/{id}PATCH更新/公開

ベストプラクティス

  • 命名規則: [プロセス] - [トリガー] 形式を使用します(例:「承認 - 優先度の高い変更」)
  • アクティビティ名: 動詞 + 名詞の形式を使用します(例:「承認ステータスを確認」、「通知を送信」)
  • シンプルに始める: まず 2~3 個のアクティビティで作成し、その後複雑さを加えます
  • 早めにテストする: 公開前に published: false でテストします
  • ログを追加する: デバッグ用に gs.info() ステートメントを含めます
  • エラー処理: スクリプトを try-catch ブロックで囲みます
  • Scratchpad を使用する: グローバル変数ではなく、workflow.scratchpad を介してデータを渡します
  • 条件を文書化する: 遷移条件には説明的な名前を使用します
  • バージョン管理: ワークフロー定義を JSON/コードとして Git に保存します
  • Update Set に取り込む: ワークフローは必ずアクティブな Update Set で作成します

トラブルシューティング

ワークフローがトリガーされない

症状: ワークフローは作成されたものの、実行されない
原因: トリガー条件が存在しないか正しくない、またはワークフローが有効化/公開されていない
解決方法:

  1. ワークフローバージョンで active: true を確認します
  2. ワークフローバージョンで published: true を確認します
  3. トリガー条件がレコードの条件に一致することを確認します
  4. after_business_rules の設定を確認します
  5. ワークフローが正しいテーブルに割り当てられていることを確認します
アクティビティが実行されない

症状: ワークフローは開始するものの、特定のアクティビティがスキップされる
原因: 遷移が存在しないか、条件が正しくない
解決方法:

  1. 遷移を照会します:from=[activity_sys_id]
  2. 条件が前のアクティビティの answer 値に一致することを確認します
  3. アクティビティの input フィールドに有効なスクリプトがあることを確認します
ワークフローが停止する

症状: ワークフローコンテキストが「executing」状態のままになる
原因: アクティビティスクリプトのエラーまたは無限ループ
解決方法:

  1. システムログでスクリプトエラーを確認します
  2. wf_history を照会してアクティビティの実行詳細を確認します
  3. アクティビティスクリプトにエラーがないか確認します
  4. 必要に応じて停止したコンテキストをキャンセルします:
Tool: SN-Update-Record
Parameters:
  table_name: wf_context
  sys_id: [context_sys_id]
  data:
    state: cancelled
遷移条件が一致しない

症状: ワークフローが誤った経路に進む
原因: 条件の構文または answer 値の不一致
解決方法:

  1. 条件の形式を確認します:answer=value(引用符なし)
  2. アクティビティスクリプトで answer 変数が正しく設定されていることを確認します
  3. 条件の順序を確認します(order が小さいほど優先度が高くなります)
  4. デフォルト/フォールバック経路には else_flag: true を使用します
アクティビティのスクリプトエラー

症状: アクティビティがスクリプトエラーで失敗する
原因: 無効な JavaScript または API の使用方法
解決方法:

  1. まずバックグラウンドスクリプトでスクリプトをテストします
  2. 変数のスコープを確認します(current、workflow を使用できます)
  3. GlideRecord クエリが結果を返すことを確認します
  4. エラー処理を追加します:
try {
  // Script logic
} catch(e) {
  gs.error('Activity error: ' + e.message);
  answer = 'error';
}

例

例 1:シンプルな承認ワークフロー
Tool: SN-Create-Workflow
Parameters:
  name: "Simple Approval"
  table: "change_request"
  description: "Basic change approval workflow"
  condition: "type=normal"
  activities:
    - name: "Request Approval"
      x: 100
      y: 100
      script: |
        var approval = new GlideRecord('sysapproval_approver');
        approval.initialize();
        approval.document_id = current.sys_id;
        approval.source_table = 'change_request';
        approval.approver = current.assignment_group.manager;
        approval.state = 'requested';
        approval.insert();
        workflow.scratchpad.approval_id = approval.sys_id;
    - name: "Check Approval Status"
      x: 250
      y: 100
      script: |
        var approval = new GlideRecord('sysapproval_approver');
        approval.get(workflow.scratchpad.approval_id);
        answer = approval.state.toString();
    - name: "Approved Actions"
      x: 400
      y: 50
      script: |
        current.state = 'authorize';
        current.work_notes = 'Change approved by workflow';
        current.update();
    - name: "Rejected Actions"
      x: 400
      y: 150
      script: |
        current.state = 'cancelled';
        current.work_notes = 'Change rejected by workflow';
        current.update();
  transitions:
    - from: 0
      to: 1
    - from: 1
      to: 2
      condition: "answer=approved"
    - from: 1
      to: 3
      condition: "answer=rejected"
例 2:複数レベルの承認

完了前に並列承認を合流させるワークフローを作成します。

ステップ 1:基本構造を作成する

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow
  data:
    name: "Multi-Level Approval"
    description: "Requires both manager and director approval"

ステップ 2:アクティビティを作成する (6 つのアクティビティを作成します:開始、マネージャー承認、ディレクター承認、合流、承認済み、却下)

ステップ 3:並列遷移を作成する

// Start -> Manager Approval
// Start -> Director Approval (parallel path)
// Manager Approval -> Join
// Director Approval -> Join
// Join -> Approved (if all approved)
// Join -> Rejected (if any rejected)
例 3:インシデントの自動ルーティング
// Complete workflow for routing incidents based on category

// 1. Create workflow
SN-Create-Record: wf_workflow
  name: "Incident Auto-Router"
  description: "Route incidents to appropriate team"

// 2. Create version
SN-Create-Record: wf_workflow_version
  table: "incident"
  condition: "active=true^assignment_groupISEMPTY"

// 3. Create routing activity
SN-Create-Activity:
  name: "Route by Category"
  script: |
    var category = current.category.toString();
    var routing = {
      'network': 'Network Support',
      'hardware': 'Hardware Support',
      'software': 'Software Support',
      'database': 'Database Team'
    };
    var group = routing[category] || 'Service Desk';
    var gr = new GlideRecord('sys_user_group');
    gr.addQuery('name', group);
    gr.query();
    if (gr.next()) {
      current.assignment_group = gr.sys_id;
      current.work_notes = 'Auto-routed to ' + group;
      current.update();
      answer = 'routed';
    } else {
      answer = 'no_group';
    }

関連スキル

  • admin/update-set-management - ワークフローを Update Set に取り込む
  • admin/application-scope - スコープ付きアプリケーションのワークフロー
  • itsm/change-management - 変更要求ワークフロー
  • itsm/incident-lifecycle - インシデント処理ワークフロー

参考資料

コメント