スクリプトで参照項目へ値の反映をする方法

Yuki21
Tera Expert

インポートセットテーブルに添付されたCSVファイルをカスタムテーブルへインポートするスクリプトを実装しましたが、テーブルのカラム属性が異なるため、値が反映されまない状況です。

 

スキームID、システムID、性能情報種別IDは
属性がインポートセットテーブルでは文字列、カスタムテーブルは参照(※)となっています。
※スキームマスタ、システムマスタ、性能情報種別マスタの値を参照

参照項目への値の反映をする方法について、ご教示いただければと思います。

1 ACCEPTED SOLUTION

iwai
Giga Sage

Reference項目を表示値で一致させる場合は、下記のScript ”setDisplayValue”で可能です。

参考資料Docs:GlideElement | ServiceNow Developers

var rec = new GlideRecord('incident');
rec.initialize();
rec.caller_id = gs.getUserID();
rec.short_description = 'test';
// Assignment Group(Reference項目)に表示値で設定する。大文字小文字はどちらでも該当するが全角半角などの曖昧一致はしない
rec.assignment_group.setDisplayValue('Incident Management');
// Reference項目の内部値を表示
gs.info('rec.assignment_group >> ' + rec.assignment_group);
// Reference項目の表示値を表示
gs.info('rec.assignment_group getDisplayValue >> ' + rec.assignment_group.getDisplayValue());

// rec.assignment_group >> 12a586cd0bb23200ecfd818393673a30
// rec.assignment_group getDisplayValue >> Incident Management

View solution in original post

11 REPLIES 11

iwai
Giga Sage

Reference項目を表示値で一致させる場合は、下記のScript ”setDisplayValue”で可能です。

参考資料Docs:GlideElement | ServiceNow Developers

var rec = new GlideRecord('incident');
rec.initialize();
rec.caller_id = gs.getUserID();
rec.short_description = 'test';
// Assignment Group(Reference項目)に表示値で設定する。大文字小文字はどちらでも該当するが全角半角などの曖昧一致はしない
rec.assignment_group.setDisplayValue('Incident Management');
// Reference項目の内部値を表示
gs.info('rec.assignment_group >> ' + rec.assignment_group);
// Reference項目の表示値を表示
gs.info('rec.assignment_group getDisplayValue >> ' + rec.assignment_group.getDisplayValue());

// rec.assignment_group >> 12a586cd0bb23200ecfd818393673a30
// rec.assignment_group getDisplayValue >> Incident Management

ご返信いただきありがとうございます。

まずはスキームマスタで確認しようと、以下の処理を追加して再実行してみましたが、値は反映されないままです。どこが原因かお分かりでしょうか?

スキームマスタのu_scheme_id.にstr_valueの値('001')が設定されていることは確認済です。
また、rec.u_scheme_id.setDisplayValue(str_value);のstr_valueを'001'にして直接していしてもダメでした。

<追加した箇所>
var grSch = new GlideRecord('u_scheme_master');
grSch.addQuery('u_scheme_id',record[0]);
grSch.query();

while(grSch.next()){
var str_value=grSch.u_scheme_id;
}



rec.u_scheme_id.setDisplayValue(str_value);

 

  • 質問:まずはスキームマスタで確認しようと、以下の処理を追加して再実行してみましたが、値は反映されないままです。どこが原因かお分かりでしょうか?
    スキームマスタのu_scheme_id.にstr_valueの値('001')が設定されていることは確認済です。
    また、rec.u_scheme_id.setDisplayValue(str_value);のstr_valueを'001'にして直接していしてもダメでした。
    • 回答:『rec.u_scheme_id.setDisplayValue('001');』を試して値が設定できなかった原因は表示値として'001'が存在しないため。
      存在しないと言うのは、もしかすると”u_scheme_id”は表示項目ではないため'001'がsetDisplayValueでは該当しないという理由かもしれません。
      ”u_scheme_master” Tableの ”u_scheme_id”は表示項目でしょうか。表示項目が"u_scheme_id"になっていて、'001'が存在することを確認してください。
      ”u_scheme_id”が表示項目では無いとしたらGlideRecordでQueryする方法でも良いと思います。
      補足:表示値、表示項目とは、テーブルにひとつ表示項目として設定することが出来て、Reference項目で画面に表示される項目となります。例えばIncident Tableでは、Numberが表示項目です。
      参考資料:Display values | ServiceNow Docs

投稿したScriptを確認したところ、setDisplayValueだけでなく、継ぎ接ぎしたScriptは無駄な処理が多数存在します。

基本的なScriptを学習することをお勧めします。様々な人から回答をもらっても、その回答の手法やScriptが何であるか理解しないまま使用してしまうと、更なる問題が発生して、増え続ける問題の数だけ質問を繰り返し問題が複雑化、長期化する。また理解不足のまま動作確認をすると、不具合や問題を含んだまま本番で実行して障害が発生する懸念があります。

投稿したScriptを、私の推測だけで全面的にScriptを書きなおしてみました。これは参考に留めてください。

var grAtt = new GlideRecord("sys_attachment");
grAtt.addJoinQuery('u_import_seino_joho_meisai', 'table_sys_id', 'sys_id');
grAtt.addQuery('file_name', 'ENDSWITH', '.csv');
grAtt.orderBy('sys_created_on');
grAtt.query();
while (grAtt.next()) {
    getCsv(grAtt);
    break; //テスト用に1件しか処理しない、本番ではbreakを削除。
}

//CSVを読み取ってレコード作成
function getCsv(grAtt) {
    var gsAttachment = new GlideSysAttachment();
    var csvLine;
    var delimiter = ','; // csv file delimiter
    var quoteCharacter = '"'; // csv file quote character
    var grSch = new GlideRecord('u_scheme_master');
    var csvParser = new sn_impex.CSVParser();

    //添付ファイルを取得する
    var attachmentStream = gsAttachment.getContentStream(grAtt.getValue('sys_id'));
    var reader = new GlideTextReader(attachmentStream); // using stream to overcome 5MB size limit. attachment should be in utf8
    //1行目は利用しない
    reader.readLine();
    //CSVファイル1行目以降が空欄でなければレコード作成
    while ((csvLine = reader.readLine()) != null) {
        var record = csvParser.parseLineToArray(csvLine, delimiter, quoteCharacter); // CSV        
        var rec = new GlideRecord('u_seino_joho_meisai'); // レコード作成対象テーブル
        rec.intialize();
        if (grSch.get('u_scheme_id', record[0])) { //CSVファイルA列:「スキームID」
            rec.u_scheme_id = grSch.getValue('sys_id');
        }
        //rec.u_scheme_id = record[0]; //CSVファイルA列:「スキームID」
        rec.u_system_id = record[1]; //CSVファイルB列:「システムID」
        rec.u_seino_shubetsu_id = record[2]; //CSVファイルC列:「性能情報種別ID」
        rec.u_datetime = record[3]; //CSVファイルD列:「DATETIME」
        rec.u_value = record[4]; //CSVファイルE列:「VALUE」

        rec.insert(); //レコード作成
    }
    //添付ファイル削除
    gsAttachment.deleteAttachment(grAtt.getValue('sys_id'));
}

ご確認いただきありがとうございます。

いただいたスクリプトで実行確認してみましたが、結果は変わらず、値が反映されないままでした。
コメントいただいた点につきまして、

”u_scheme_master” Tableの ”u_scheme_id”は表示項目でしょうか。表示項目が"u_scheme_id"になっていて、'001'が存在することを確認してください。

⇒”u_scheme_id”は表示項目としている認識です。
rec.u_scheme_idの値を試しにログに出力したところ、sys_idが設定されておりましたので、'001'は存在し、取得できていると思います。

”u_scheme_id”が表示項目では無いとしたらGlideRecordでQueryする方法でも良いと思います。

⇒理解不足で申し訳ありません。既にGlideRecordでQueryする方法を使っている認識でしたが、こちらの方法についてご教示いただけないでしょうか。