クエリ条件で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
*/