The CreatorCon Call for Content is officially open! Get started here.

カンマ区切りのリスト形式で格納されている条件をQueryparameterに登録する方法

Ereshkigal
Tera Contributor

コミュニティの皆様
いつもお世話になっております。

私は、Scripted API・QueryParameterについて学習しております。
理由はMIDサーバーから渡された絞り込み条件設定ファイルをServiceNowのScripted APIにて
QueryParameterとして格納すると要件があるためです。

絞り込み条件はカンマ区切りのリスト形式で渡されます。
(例:TEST=SAP,ATF,・・・)//TESTはQueryParameter名です。
本来であれば、以下のようにエンコードされたクエリをQueryParameterに設定する必要があることも承知しております。

short_descriptionLIKESAP^ORshort_descriptionLIKEATF

今作成しているScripted APIは以下になりますが、
ここからどのようにすれば、上記の要件を達成できるでしょうか。

皆様のご協力お待ちしております。

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    // implement resource here
   var bodyArray = [];
	var query = request.queryParams.TEST;
	gs.info("query=" + query);
	QueryString ="active=true^stateIN1,2";
	var testData = new GlideRecord("incident");
	testData.addEncodedQuery(QueryString);
	testData.addEncodedQuery(query);
	testData.query();
	while(testData.next()){
		var body = {};
		body.number = testData.getValue("number");
		body.state = testData.getDisplayValue("state");
		body.priority = testData.getDisplayValue("priority");
		body.sysID = testData.getDisplayValue("sys_id");
		body.short_description = testData.getValue("short_description");
		bodyArray.push(body);
	}
	response.setBody(bodyArray);

})(request, response);

絞り込み条件としては

  • インシデントがアクティブかつステータスが"新規"または"進行中"
  • Short_descriptionにSAPまたはATFが含まれていること

になります。
下の条件は可変にしたいとのことですので、QueryParameterを使用するようにしています。
よろしくお願いいたします。

1 ACCEPTED SOLUTION

iwai
Giga Sage

'IN'でまとめられないのであれば、ひとつひとつ’OR’を繋げることになると思います。

スクリプトなら、

var osList = '' + request.queryParams.TEST;
var query = 'short_descriptionLIKE';
// 正規表現置換、終端の空白削除、先頭にQuery追加、カンマ区切りにQuery追加
query = osList.replace(/\s*$/,'').replace(/^\s*/,query).replace(/[, ]+/g,'^'+query);

// 例
// osList = ' SAP , ATF , TF,F '
// Output: 'short_descriptionLIKESAP^short_descriptionLIKEATF^short_descriptionLIKETF^short_descriptionLIKEF'

View solution in original post

6 REPLIES 6

Ereshkigal
Tera Contributor

ご回答ありがとうございます。

追加で大変恐縮ですが、こちらの処理についても確認させてください。

var osList = '' + request.queryParams.TEST;

request.queryParmsの前に''とありますが、
こちらの処理について、ご教示頂けないでしょうか。

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

 

TESTがどんな値になるのか不確定のため、先頭に文字を足すことで、明示的に文字列型に強制できます。ServiceNowは特に変数がJava Objectの場合があり文字列として処理できない場合があるため、この方法で文字列にします。これは私の個人的な癖です。おまじないに近い事もあります。こうしなければならない絶対的な理由もないです。ほかの良い方法もあります。

例:

var gr = new GlideRecord("incident");
gr.setLimit(1);
gr.query();
gr.next();
var osList = gr.short_description;
gs.info("typeof 1:"+typeof osList); // object (厳密には Java object の GlideElement)
gs.info("typeof 2:"+typeof (''+osList)); // string

 

この文字列化の処理方法について興味深い記事があるので読んでみてください。この記事は、ServiceNowのGlideRecordから値を取得する場合の戻り値の型が不確定のため、どの方法で処理するのが一番良いか検証した記事です。

GlideRecord getValue は文字列の王様|コードクリエイティブ|サービスナウブログ (codecreative.io)