1. はじめに
ServiceNowでUI Action等を使用して画面遷移を実装する際、action.setRedirectURL()を使用してリダイレクトを行うことは一般的かと思います。
しかし、この実装だけでは画面左上の戻るボタン(<)を押した際に、期待した画面に戻らないという問題が発生したので、その事象と対策について記載します。
結論
最初に結論を言ってしまうと、本事象への対策は以下。
コーディングで画面遷移をさせる際は必ずaction.setReturnURL(current)を使用する
2. 発生した問題
2.1 実装した内容
今回は、インシデント関連タスクを作成するUI Actionを元に解説します。
機能としては、インシデントタスクを作成し作成したタスクレコードForm画面に遷移します。
UI Action設定
- Name: Create Incident Task
- Table: Incident [incident]
- Active: true
【コード例】
// インシデントから関連タスクを作成するUI Action
var task = new GlideRecord('incident_task');
task.initialize();
task.parent = current.sys_id; // 親インシデントを設定
task.assignment_group = current.assignment_group;
task.assigned_to = current.assigned_to;
task.priority = current.priority;
task.company = current.company;
task.short_description = 'インシデント ' + current.number + ' に関連するタスク';
var taskSysId = task.insert();
// 作成したタスクにリダイレクト
action.setRedirectURL(task);
この実装の場合、タスクレコードの作成及び作成したレコードForm画面への遷移までは正常に動作しました。
2.2 問題の詳細
しかし、作成したタスクForm画面で左上の戻るボタン「<」を押すと、予期せぬ動作が発生しました。
期待する動作
インシデントリスト → インシデント画面 → UI Action実行 → タスク画面
↓ 戻るボタン押下
インシデント画面 ←←←←←←←←←←←← ここに戻りたい
実際の動作
インシデントリスト → インシデント画面 → UI Action実行 → タスク画面
↓ 戻るボタン押下
インシデントリスト ←←←←←←←←←←←←←←←←←←←←← ここに戻ってしまう
タスク画面から戻るボタンを押すと、元のインシデント画面ではなく、さらに1つ前のインシデントリスト画面に戻ってしまいます。
3. 原因
3.1 ServiceNowのナビゲーションスタックとは
ServiceNowには「ナビゲーションスタック」という仕組みがあります。これは、ユーザーの画面遷移履歴を管理し、戻るボタンの動作やフォームのsubmit/update後のリダイレクト先を決定するための機能です。
ナビゲーションスタックの役割
- ユーザーがアクセスした画面の履歴を保持
- 戻るボタン押下時の遷移先を決定
- レコードのsubmit/update後のリダイレクト先を決定
-
sys_ui_navigator_historyテーブルに履歴を保存
通常の画面遷移時の動作
通常の画面遷移では、各ページが順次ナビゲーションスタックに追加され、戻るボタンを押すとスタックから前の画面を取得して遷移します。
3.2 setRedirectURLの動作
action.setRedirectURL()は、UI Action実行後にユーザーを指定したページにリダイレクトする機能を持ちます。
setRedirectURLの役割
- UI Action実行後の遷移先を指定
- 新規作成したレコードや特定のページにリダイレクト
しかし、setRedirectURL()には重要な特性があります。
setRedirectURLのみ使用した場合の問題点
- リダイレクト先のページには遷移する
- しかし、ナビゲーションスタックには遷移元(インシデント画面)が適切に記録されない
- UI Actionによる特殊な遷移のため、自動的なスタック管理が機能しない
このように、UI Actionによる遷移では、ナビゲーションスタックに遷移元のページが適切に記録されないため、戻るボタンを押すと2つ前のページに戻ってしまうのです。
4. 解決方法:setReturnURLの活用
4.1 setReturnURLとは
action.setReturnURL()は、リダイレクト先のページで戻るボタンを押した際、またはsubmit/updateした際に戻るページを明示的に設定する機能です。
setRedirectURLとsetReturnURLの違い
| API | 役割 | 設定する内容 |
|---|---|---|
setRedirectURL() |
UI Action実行後に次に表示するページを設定 | リダイレクト先のページ |
setReturnURL() |
リダイレクト先のページで戻るボタンを押した際に戻るページを設定 | 戻り先のページ |
両者は併用することで、正しい画面遷移フローを実現します。
4.2 実装方法
【修正後のコード】
// インシデントから関連タスクを作成するUI Action
var task = new GlideRecord('incident_task');
task.initialize();
task.parent = current.sys_id; // 親インシデントを設定
task.assignment_group = current.assignment_group;
task.assigned_to = current.assigned_to;
task.priority = current.priority;
task.company = current.company;
task.short_description = 'インシデント ' + current.number + ' に関連するタスク';
var taskSysId = task.insert();
// 作成したタスクにリダイレクト
action.setRedirectURL(task);
// ★重要:戻り先を明示的に設定★
action.setReturnURL(current); // currentは元のインシデントレコード
追加したのは1行だけですが、このaction.setReturnURL(current);により、タスク画面から戻るボタンを押した際に元のインシデント画面に戻るようになります。
5. まとめ
本記事では、ServiceNowのUI Actionで画面遷移を実装する際のポイントについて解説しました。
重要ポイント
-
setRedirectURL()だけでは不十分- リダイレクトは正常に動作するが、戻るボタンの動作が期待通りにならない
-
setReturnURL()との併用が必須- 戻り先を明示的に設定することで、正しいナビゲーションフローを実現
-
ナビゲーションスタックの理解が重要
- ServiceNowは画面遷移履歴をスタックで管理
-
sysparm_stackパラメータで制御可能 - UI Actionによる遷移は自動管理が機能しない
正しい実装の基本形
// 新規レコード作成 + リダイレクトの基本形
var newRecord = new GlideRecord('テーブル名');
newRecord.initialize();
// フィールド設定
newRecord.insert();
action.setRedirectURL(newRecord); // 次のページ
action.setReturnURL(current); // 戻り先
基本的に、この2行をセットで用いればOKです。
