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.

カンマ区切りのリスト形式で格納されている条件を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

上記について以下のスクリプトでできることを確認したので、
共有しておきます。
もっと良いコーディング方法があれば、ご教示頂きたいです。
よろしくお願いいたします。

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

    // implement resource here
    var bodyArray = [];
    //var OSlist = [];
    var query = request.queryParams.TEST;
	var cng = query.join(",");
	var OSlist = cng.split(",");
	//OSlist.push(query);
    gs.info("query:" + query);
	gs.info("queryParameterの型:" + toString.call(query));
	gs.info("文字列に変換:" + toString.call(cng));
	gs.info("カンマで分割して変換:" + toString.call(OSlist));
	gs.info("OSlist:" + OSlist);
    gs.info("OSlist.length:" + OSlist.length);
    var queryCondition = "short_descriptionLIKE";
    var orString = "^ORshort_descriptionLIKE";
    var osString;

    for (var i = 0, len = OSlist.length; i < len; ++i) {
        if (i == 0) {
            osString = OSlist[i];
        } else {
            osString = osString + orString + OSlist[i];
        }
    }
    queryCondition = queryCondition + osString;
    gs.info('queryCondition:' + queryCondition);

    QueryString = "active=true^stateIN1,2";
    var testData = new GlideRecord("incident");
    testData.addEncodedQuery(QueryString);
    testData.addEncodedQuery(queryCondition);
    testData.query();
	gs.info("レコード数" + testData.getRowCount());
    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);

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'

Ereshkigal
Tera Contributor

スクリプトの連携ありがとうございます。
上記のスクリプトについて以下2点気になったので確認させてください。

Windows 10などWindowsと10の間に半角スペースが存在する場合、
上記だとWindowsと10で分けられてしまうのですが、原因についてお心当たりはありますでしょうか。

終端の空白削除とありますが、これは絶対必要でしょうか。

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

途中に空白が入るパターンがあるなら下記のように修正してください。カンマの前後の空白(空白は無くても良い)を含めて置換するようにしました。前後の空白は検索の対象外なのでQueryに含めないようにしています。

query = osList.replace(/\s*$/,'').replace(/^\s*/,query).replace(/\s*,\s*/g,'^'+query);