workflow-creation について
APIまたはMCP経由でServiceNowのワークフローを作成するスキルです。デプロイの自動化、一括生成、移行を行う管理者向けに、バージョン、スクリプト付きアクティビティ、条件、遷移、公開の手順を扱います。
主な機能
- 01ワークフローとバージョンの作成
- 02スクリプト付きアクティビティの追加
- 03分岐条件と遷移の設定
- 04ワークフローの公開と検証
活用シーン
- 01CI/CDデプロイでのワークフロー作成
- 02テンプレートから類似ワークフローを生成
- 03ワークフロー定義のGit管理
- 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 コードとしてロジックを保存します。これにより、次の手順でワークフローを完全にプログラムから作成できます。
- ワークフロー構造を作成します(wf_workflow、wf_workflow_version)
- スクリプトを埋め込んだアクティビティを作成します(wf_activity)
- 遷移を使ってアクティビティをリンクします(wf_transition、wf_condition)
- ワークフローのバージョンを公開します
前提条件
- ロール:
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)
ワークフローのテスト
公開前のテスト
- 構造を確認:
Tool: SN-Query-Table
Parameters:
table_name: wf_activity
query: workflow_version=[version_sys_id]
fields: name,x,y
- 遷移を確認:
Tool: SN-Query-Table
Parameters:
table_name: wf_transition
query: from.workflow_version=[version_sys_id]
fields: from.name,to.name,condition.name
- 未公開バージョンでテストする:
テスト中は
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-Workflow | 1 回の呼び出しでアクティビティを含むワークフローを作成 |
SN-Create-Activity | 個別のアクティビティを追加 |
SN-Create-Transition | アクティビティ同士を接続 |
SN-Publish-Workflow | 開始アクティビティを設定して公開 |
SN-Create-Record | 汎用的なレコード作成 |
SN-Update-Record | 既存のレコードを更新 |
SN-Query-Table | ワークフローのテーブルをクエリ |
REST API(代替手段)
| エンドポイント | メソッド | 目的 |
|---|---|---|
/api/now/table/wf_workflow | POST | ワークフローを作成 |
/api/now/table/wf_workflow_version | POST | バージョンを作成 |
/api/now/table/wf_activity | POST | アクティビティを作成 |
/api/now/table/wf_transition | POST | 遷移を作成 |
/api/now/table/wf_condition | POST | 条件を作成 |
/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 で作成します
トラブルシューティング
ワークフローがトリガーされない
症状: ワークフローは作成されたものの、実行されない
原因: トリガー条件が存在しないか正しくない、またはワークフローが有効化/公開されていない
解決方法:
- ワークフローバージョンで
active: trueを確認します - ワークフローバージョンで
published: trueを確認します - トリガー条件がレコードの条件に一致することを確認します
after_business_rulesの設定を確認します- ワークフローが正しいテーブルに割り当てられていることを確認します
アクティビティが実行されない
症状: ワークフローは開始するものの、特定のアクティビティがスキップされる
原因: 遷移が存在しないか、条件が正しくない
解決方法:
- 遷移を照会します:
from=[activity_sys_id] - 条件が前のアクティビティの
answer値に一致することを確認します - アクティビティの
inputフィールドに有効なスクリプトがあることを確認します
ワークフローが停止する
症状: ワークフローコンテキストが「executing」状態のままになる
原因: アクティビティスクリプトのエラーまたは無限ループ
解決方法:
- システムログでスクリプトエラーを確認します
- wf_history を照会してアクティビティの実行詳細を確認します
- アクティビティスクリプトにエラーがないか確認します
- 必要に応じて停止したコンテキストをキャンセルします:
Tool: SN-Update-Record
Parameters:
table_name: wf_context
sys_id: [context_sys_id]
data:
state: cancelled
遷移条件が一致しない
症状: ワークフローが誤った経路に進む
原因: 条件の構文または answer 値の不一致
解決方法:
- 条件の形式を確認します:
answer=value(引用符なし) - アクティビティスクリプトで
answer変数が正しく設定されていることを確認します - 条件の順序を確認します(order が小さいほど優先度が高くなります)
- デフォルト/フォールバック経路には
else_flag: trueを使用します
アクティビティのスクリプトエラー
症状: アクティビティがスクリプトエラーで失敗する
原因: 無効な JavaScript または API の使用方法
解決方法:
- まずバックグラウンドスクリプトでスクリプトをテストします
- 変数のスコープを確認します(
current、workflowを使用できます) - GlideRecord クエリが結果を返すことを確認します
- エラー処理を追加します:
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- インシデント処理ワークフロー