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.

クエリ条件でNot Start Withのアサイングループ(Referenceタイプ)を抽出する方法

Ereshkigal
Tera Contributor

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

私はProblemテーブルの自動クローズにて、
追加要件として、以下の抽出条件を追加する必要があります。

アサイングループの先頭がABCではない
(※ただし、アサイン先ユーザにAbelとBethが登録されている場合は例外とする)

アサイングループグループの先頭がDEFではない

→想定している結果としては、先頭がABC、DEFのアサイングループが設定されている
Problemレコードは自動クローズできないようにしたいというものです。

試しに以下のスクリプトを試してみましたが、
先頭がABC, DEFのアサイングループでもクローズされてしまいます。
問題などがあれば、ご教示頂きたいです。

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

autoCloseProblems();

function autoCloseProblems() {
    var prb = new GlideRecord("problem");
    prb.addQuery("problem_state", ProblemState.STATES.RESOLVED);
	prb.addQuery("assignment_group.name", "NOT LIKE", "ABC");
	//Abelのsys_id
	prb.addOrQuery("assigned_to", "62826bf03710200044e0bfc8bcbe5df1");
	//Bethのsys_id
	prb.addOrQuery("assigned_to", "46d44a23a9fe19810012d100cca80666");
	prb.addQuery("assignment_group", "NOT LIKE", "DEF");
 //テストは即時クローズで確認
    //prb.addQuery("resolved_at", "<=", gs.daysAgo(2));
    prb.query();
	gs.info("【problem autoclose確認】problemの数:"+ prb.number);
    while (prb.next()) {
        var pTask = new GlideRecord("problem_task");
        pTask.addEncodedQuery("stateIN151,152,154");
        pTask.addQuery("problem", prb.getUniqueValue());
        pTask.setLimit(1);
        pTask.query();

        if (!pTask.hasNext()) {
            prb.problem_state = ProblemState.STATES.CLOSED;
            prb.state = ProblemState.STATES.CLOSED;
            prb.active = false;
            prb.closed_by = prb.sys_updated_by;
            prb.update();
        }
    }
}
3 REPLIES 3

iwai
Giga Sage

「.name」の付け忘れではないでしょうか。ただしこの間違いであってもGroup「ABC」は除外されるはずです。実際にScriptを実行しても「ABC」は除外されました。

正: prb.addQuery("assignment_group.name", "NOT LIKE", "DEF");

誤: prb.addQuery("assignment_group", "NOT LIKE", "DEF")

それと「gs.info("【problem autoclose確認】problemの数:"+ prb.number);」はwhileの中に書くべきではないでしょうか。

Ereshkigal
Tera Contributor

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

nameの付け忘れではなく、"NOT LIKE"は機能しないようです。
試しにNOT LIKE→DOES NOT CONTAINに変更したところ、
一部は想定通りにいきましたが、一か所うまくいかない箇所があります。

それはABCグループが設定かつAbel or Bethがアサイン先ユーザに設定されている時で、クローズされる想定でしたが、クローズされませんでした。

こちらについて、何か原因が思い当りましたら、
ご教示頂きたいです。

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

修正後スクリプト:

autoCloseProblems();

function autoCloseProblems() {
	try {
		gs.info("【problem autoclose確認】開始");
        var prb = new GlideRecord("problem");
        prb.addQuery("problem_state", ProblemState.STATES.RESOLVED);
        prb.addQuery("assignment_group.name", "DOES NOT CONTAIN", "ABC");
        //Abelのsys_id
        prb.addOrQuery("assigned_to", "62826bf03710200044e0bfc8bcbe5df1");
        //Bethのsys_id
        prb.addOrQuery("assigned_to", "46d44a23a9fe19810012d100cca80666");
        prb.addQuery("assignment_group.name", "DOES NOT CONTAIN", "DEF");
        //prb.addQuery("resolved_at", "<=", gs.daysAgo(2));
        prb.query();
        while (prb.next()) {
            var pTask = new GlideRecord("problem_task");
            pTask.addEncodedQuery("stateIN151,152,154");
            pTask.addQuery("problem", prb.getUniqueValue());
            pTask.setLimit(1);
            pTask.query();
            gs.info("【problem autoclose確認】problem_task:" + pTask.hasNext());

            if (!pTask.hasNext()) {
                prb.problem_state = ProblemState.STATES.CLOSED;
                prb.state = ProblemState.STATES.CLOSED;
                prb.active = false;
                prb.closed_by = prb.sys_updated_by;
                prb.update();
            }
        }
		gs.info("【problem autoclose確認】problemクローズ数:" + prb.getRowCount());
		gs.info("【problem autoclose確認】終了");
    }
	catch(ex){
		gs.info("【problem autoclose確認】例外終了理由:" + ex);
	}

}

ORについては下記の通りaddOrConditionを使います。

qc = prb.addQuery();

"DOES NOT CONTAIN"なのか"NOT LIKE" テストした結果、同じ結果となりました。

Operators available for filters and queries (servicenow.com)

var testQueryOperator = [
    "",
    "DOES NOT CONTAIN",
    "NOT LIKE",
    "NOTLIKE",
    "DOESNOTCONTAIN"
];
var prb;
var qc;
var msg = [];

for (var testNo = 0; testNo < testQueryOperator.length; testNo++) {
    prb = new GlideRecord("problem");
    //prb.addQuery("problem_state", ProblemState.STATES.RESOLVED);
    if(testQueryOperator[testNo]){
        prb.addQuery("problem_state", ProblemState.STATES.RESOLVED);
        qc = prb.addQuery("assignment_group.name", testQueryOperator[testNo], "ABC");
    }else{
        qc = prb.addQuery("problem_state", ProblemState.STATES.RESOLVED);
    }
    //Abelのsys_id
    //prb.addOrQuery("assigned_to", "62826bf03710200044e0bfc8bcbe5df1");
    qc.addOrCondition("assigned_to", "62826bf03710200044e0bfc8bcbe5df1");
    //Bethのsys_id
    //prb.addOrQuery("assigned_to", "46d44a23a9fe19810012d100cca80666");
    qc.addOrCondition("assigned_to", "46d44a23a9fe19810012d100cca80666");
    if(testQueryOperator[testNo]){
        prb.addQuery("assignment_group.name", testQueryOperator[testNo], "DEF");
    }
    //prb.addQuery("resolved_at", "<=", gs.daysAgo(2));
    prb.query();
    msg.push('Test ' + testNo + ', QueryOperator:' + testQueryOperator[testNo] + ', EncodedQuery:' + prb.getEncodedQuery());
    if(!prb.hasNext()){
        msg.push('Test ' + testNo + ', No records to display');
    }
    while (prb.next()) {
        msg.push('Test ' + testNo + ', ' + prb.number + ' : ' + prb.assignment_group.getDisplayValue());
    }
}
gs.info(msg.join('\n'));
/* Output Log
Test 0, QueryOperator:, EncodedQuery:problem_state=101^ORassigned_to=62826bf03710200044e0bfc8bcbe5df1^ORassigned_to=46d44a23a9fe19810012d100cca80666
Test 0, PRB0001000 : 
Test 0, PRB0001001 : 
Test 0, PRB0007601 : 
Test 0, PRB0040001 : ABC
Test 0, PRB0040002 : DEF
Test 0, PRB0040003 : GHI
Test 1, QueryOperator:DOES NOT CONTAIN, EncodedQuery:problem_state=101^assignment_group.nameDOES NOT CONTAINABC^ORassigned_to=62826bf03710200044e0bfc8bcbe5df1^ORassigned_to=46d44a23a9fe19810012d100cca80666^assignment_group.nameDOES NOT CONTAINDEF
Test 1, PRB0040003 : GHI
Test 2, QueryOperator:NOT LIKE, EncodedQuery:problem_state=101^assignment_group.nameNOT LIKEABC^ORassigned_to=62826bf03710200044e0bfc8bcbe5df1^ORassigned_to=46d44a23a9fe19810012d100cca80666^assignment_group.nameNOT LIKEDEF
Test 2, PRB0040003 : GHI
Test 3, QueryOperator:NOTLIKE, EncodedQuery:problem_state=101^assignment_group.nameNotValidABC^ORassigned_to=62826bf03710200044e0bfc8bcbe5df1^ORassigned_to=46d44a23a9fe19810012d100cca80666^assignment_group.nameNotValidDEF
Test 3, No records to display
Test 4, QueryOperator:DOESNOTCONTAIN, EncodedQuery:problem_state=101^assignment_group.nameNotValidABC^ORassigned_to=62826bf03710200044e0bfc8bcbe5df1^ORassigned_to=46d44a23a9fe19810012d100cca80666^assignment_group.nameNotValidDEF
Test 4, No records to display
*/