- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-04-2022 10:26 PM
コミュニティの皆様
いつもお世話になっております。
私は、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を使用するようにしています。
よろしくお願いいたします。
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-05-2022 12:46 AM
'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'
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-04-2022 11:46 PM
上記について以下のスクリプトでできることを確認したので、
共有しておきます。
もっと良いコーディング方法があれば、ご教示頂きたいです。
よろしくお願いいたします。
(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);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-05-2022 12:46 AM
'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'
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-06-2022 02:13 AM
スクリプトの連携ありがとうございます。
上記のスクリプトについて以下2点気になったので確認させてください。
Windows 10などWindowsと10の間に半角スペースが存在する場合、
上記だとWindowsと10で分けられてしまうのですが、原因についてお心当たりはありますでしょうか。
終端の空白削除とありますが、これは絶対必要でしょうか。
よろしくお願いいたします。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-06-2022 02:38 AM
途中に空白が入るパターンがあるなら下記のように修正してください。カンマの前後の空白(空白は無くても良い)を含めて置換するようにしました。前後の空白は検索の対象外なのでQueryに含めないようにしています。
query = osList.replace(/\s*$/,'').replace(/^\s*/,query).replace(/\s*,\s*/g,'^'+query);