Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

インシデントテーブルに紐づいているタグをもとにインタラクティブ フィルターで抽出したい

kim62
Tera Expert

お世話になっております。

インシデントに「Tag」という名前でタグ付けしたのをInteractive Filterで抽出したいと思っておりますが、

想定通りに抽出がうまくできず投稿致しました。

 

Interactive Filterの設定は以下になります。

▼Interactive Filter

kim62_2-1672299462084.png

 

Cascading Filter

kim62_1-1672299320819.png

▼Target Tables

kim62_3-1672299510196.png

 

▼Tag

kim62_4-1672299703638.png

 

▼抽出結果※実質は1件のみ。

kim62_5-1672299767099.png

 

下図のように「Tag」でタグ付けした以外のチケットまで抽出されている。

kim62_6-1672299836389.png

 

インタラクティブ フィルターを使ってタグを抽出するのは標準機能ではできないのでしょうか。

もしくはカスタムフィルターなどで抽出する方法など分かる方いらっしゃいましたらご教授ください。

よろしくお願い致します。

 

1 件の受理された解決策

iwai
Giga Sage

その質問の画像にある「Cascading filters」は、公式の説明によると「カスケード・フィルタでは、地域、国、都市などの階層にある複数の値に基づいてフィルタリングを行うことができます。下位階層の選択肢は、上位階層で選択された値によってフィルタリングされます。」Create a cascading filter (servicenow.com)

今回の要件のタグでフィルターする事に使う機能ではなさそうです。

その他のフィルタータイプでもタグを扱えそうなものは無いです。タグは特別な検索方法が必要です。

そこで、WidgetのDynamic Contentを使ってInteractive Filterを作成してみました。

gr.addQuery('name', 'STARTSWITH', 'myTag'); の部分を検索したいTagの条件に変更してください。

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:evaluate var="jvar_querylist" object="true">
		var queryList = [{label:'none'}];
        // Tag Table
        var gr = new GlideRecord('label');
        gr.addQuery('name', 'STARTSWITH', 'myTag');
        gr.query();
        while (gr.next()) {
            queryList.push({
                query: 'sys_tags.' + gr.getValue('sys_id') + '=' + gr.getValue('sys_id'),
                label: gr.getValue('name')
            });
        }
        queryList;
	</g:evaluate>
	<script>
		var my_dashboardMessageHandler = new DashboardMessageHandler("my_unique_id");
		
		function clearFilter() {
			var filter_message = {};
			filter_message.id = "my_unique_id";
			filter_message.table = "incident";
			filter_message.filter = "";
			SNC.canvas.interactiveFilters.setDefaultValue({
				id: filter_message.id,
				filters: [filter_message]
			}, false);
			my_dashboardMessageHandler.removeFilter();
		}

		function publishFilter (query) {
			if(query == 'none'){
				clearFilter();
				return;
			}
			var filter_message = {};
			filter_message.id = "my_unique_id";
			filter_message.table = "incident";
    
			filter_message.filter = query;
			SNC.canvas.interactiveFilters.setDefaultValue({
				id: filter_message.id,
				filters: [filter_message]
			}, false);
			my_dashboardMessageHandler.publishFilter(filter_message.table, filter_message.filter);
		}
    
	</script>   

	<select id="myselect">
		<j:forEach var="jvar_option" items="${jvar_querylist}">
			<option value="${jvar_option.query}">${jvar_option.label}</option>
		</j:forEach>
	</select>
	<script>
		var $selectBox = $j("#myselect");
		$selectBox.select2({width:'90%'});
		$selectBox.change(function(event){
			publishFilter(event.val);		
		});
	</script>
</j:jelly>

画像1.png

元の投稿で解決策を見る

2件の返信2

iwai
Giga Sage

その質問の画像にある「Cascading filters」は、公式の説明によると「カスケード・フィルタでは、地域、国、都市などの階層にある複数の値に基づいてフィルタリングを行うことができます。下位階層の選択肢は、上位階層で選択された値によってフィルタリングされます。」Create a cascading filter (servicenow.com)

今回の要件のタグでフィルターする事に使う機能ではなさそうです。

その他のフィルタータイプでもタグを扱えそうなものは無いです。タグは特別な検索方法が必要です。

そこで、WidgetのDynamic Contentを使ってInteractive Filterを作成してみました。

gr.addQuery('name', 'STARTSWITH', 'myTag'); の部分を検索したいTagの条件に変更してください。

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:evaluate var="jvar_querylist" object="true">
		var queryList = [{label:'none'}];
        // Tag Table
        var gr = new GlideRecord('label');
        gr.addQuery('name', 'STARTSWITH', 'myTag');
        gr.query();
        while (gr.next()) {
            queryList.push({
                query: 'sys_tags.' + gr.getValue('sys_id') + '=' + gr.getValue('sys_id'),
                label: gr.getValue('name')
            });
        }
        queryList;
	</g:evaluate>
	<script>
		var my_dashboardMessageHandler = new DashboardMessageHandler("my_unique_id");
		
		function clearFilter() {
			var filter_message = {};
			filter_message.id = "my_unique_id";
			filter_message.table = "incident";
			filter_message.filter = "";
			SNC.canvas.interactiveFilters.setDefaultValue({
				id: filter_message.id,
				filters: [filter_message]
			}, false);
			my_dashboardMessageHandler.removeFilter();
		}

		function publishFilter (query) {
			if(query == 'none'){
				clearFilter();
				return;
			}
			var filter_message = {};
			filter_message.id = "my_unique_id";
			filter_message.table = "incident";
    
			filter_message.filter = query;
			SNC.canvas.interactiveFilters.setDefaultValue({
				id: filter_message.id,
				filters: [filter_message]
			}, false);
			my_dashboardMessageHandler.publishFilter(filter_message.table, filter_message.filter);
		}
    
	</script>   

	<select id="myselect">
		<j:forEach var="jvar_option" items="${jvar_querylist}">
			<option value="${jvar_option.query}">${jvar_option.label}</option>
		</j:forEach>
	</select>
	<script>
		var $selectBox = $j("#myselect");
		$selectBox.select2({width:'90%'});
		$selectBox.change(function(event){
			publishFilter(event.val);		
		});
	</script>
</j:jelly>

画像1.png

kim62
Tera Expert

Iwai様

 

ご確認いただきありがとうございます。

ご教示頂きましたDynamic Contentを使って抽出できました。大変勉強になりました。

改めてありがとうございました。