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

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

(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);