【ServiceNow】リストビューでのレコード編集時にアサイン先グループとアサイン先の整合性を保つ方法
ServiceNowにおいてリストビューからレコードの一部を編集できる機能はみなさんご存じだと思います。今回は、リストビューでのレコード編集時にアサイン先グループとアサイン先の整合性を保つ方法を紹介します。
標準画面の確認
確認用に、グループメンバーが1人しか存在しないグループ2つを作成しました。「Abel Group」にはAbelが、「Beth Group」にはBethが所属しています。
「Beth Group」のBethをアサインしているインシデントレコードをリストビューでダブルクリックし、アサイン先グループにAbel Groupと入力し更新を試みます。すると、「Beth AnglinはAbel Groupに所属していないとダメだよ」というエラーメッセージが表示され、更新がストップします。
これは、OOTBのAbort changes on groupというBusiness Ruleが機能しています。リストビューからレコードを編集した際にアサイン先グループとアサイン先の整合性が壊れないよう設計されています。
OOTBではIncident, Problem, Change, Incident Task, Problem Task, Change Taskに個別に実装されています。
(デフォルトビューにアサイン先グループやアサイン先がないRequested Item等では、そもそもアサイン先グループは使わないよね。だからBusiness Ruleも実装しなくて良いよね。ということなのだと思います。)
タスクテーブルを拡張し、カスタムで作成したテーブルでもアサイン先グループとアサイン先の整合性を保ちたい場合は、同様のBusiness Ruleを実装するか、まとめてTaskテーブルにBusiness Ruleをかけることが必要です。
※ちなみにフォーム画面で同様の操作を実施すると、自動でアサイン先が空となります。
Business Ruleが働かない場面
以下の手順を実施したところ、通常アサインできないはずのユーザーをアサインできました。
「Beth Group」のBethと「Abel Group」のAbelをアサインしたレコードを1つずつ作成する。
二つのレコードを一括で選択(Ctrl+Alt+ドラッグ)し、「Beth Group」をアサインしているレコードのアサイン先をダブルクリックする。
そのまま確定する。
両方のレコードのアサイン先がBethとなる。
※ちなみに2でアサイン先ではなくアサイン先グループをダブルクリックした場合、エラーメッセージが表示され更新がストップします。
Now Supportに問い合わせたところ、こちらは"Working as Expected"であるとのことです。
解決策
Now Supportからは、以下2つのWork Aroundを提供されました。
アサイン先に対しList Edit ACLを作成し、リストビューからのセル編集ができないようにする(参考記事に詳細が記載されています)。
アサイン先に対し、以下のOnCellEditのClient Scriptを作成する。
function onCellEdit(sysIDs, table, oldValues, newValue, callback) {
var saveAndClose = true;
var fieldName = 'assigned_to';
var dependatFieldName = 'assignment_group';
var fieldLabel = 'Assigned To';
sysIDs.forEach(function(sysId, index){
var rec = new GlideRecord(table);
rec.addQuery('sys_id', sysId);
rec.query();
rec.next();
rec.setValue(fieldName, newValue);
var groupId = rec.getValue(dependatFieldName);
var userId = rec.getValue(fieldName);
var gr = new GlideRecord('sys_user_grmember');
gr.addQuery('group', groupId);
gr.addQuery('user', userId);
gr.query();
if(gr.rows.length === 0){
saveAndClose = false;
}
});
if(!saveAndClose){
alert("Unable to update '"+fieldLabel+"' as the user is not a memebr of the group for one or more records");
}
callback(saveAndClose);
}
このClient Scriptでは入力されたユーザーがアサイン先グループのメンバーであるか確認し、そうでない場合は更新をストップしています。
コードを実装したところ、以下のメッセージが表示され、更新がストップされました。
上記Client ScriptをTaskテーブルに作成し、InheritedをTrueにすることでタスクテーブルを拡張したテーブル全体にチェックをかけることができました。
今回は以上です。お疲れ様でした。
The world works with ServiceNow