【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が働かない場面

以下の手順を実施したところ、通常アサインできないはずのユーザーをアサインできました。

  1. 「Beth Group」のBethと「Abel Group」のAbelをアサインしたレコードを1つずつ作成する。

  2. 二つのレコードを一括で選択(Ctrl+Alt+ドラッグ)し、「Beth Group」をアサインしているレコードのアサイン先をダブルクリックする。

  3. そのまま確定する。

  4. 両方のレコードのアサイン先がBethとなる。

※ちなみに2でアサイン先ではなくアサイン先グループをダブルクリックした場合、エラーメッセージが表示され更新がストップします。

「Abel Group」に所属していないはずのBethをアサインできてしまう。

Now Supportに問い合わせたところ、こちらは"Working as Expected"であるとのことです。

解決策

Now Supportからは、以下2つのWork Aroundを提供されました。

  1. アサイン先に対しList Edit ACLを作成し、リストビューからのセル編集ができないようにする(参考記事に詳細が記載されています)。

  2. アサイン先に対し、以下の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

参考

https://www.servicenow.com/community/developer-forum/disable-cell-editing-for-a-particular-field/m-p/2017321



いいなと思ったら応援しよう!