テーブルの情報を取得するスクリプト


概要

ServiceNowの一つのテーブルのみにデータをインポートする場合はEasy Importを利用することができる。しかし、ServiceNowテーブルは複数の他テーブルと関連している場合が多いため、データを挿入する場合に複数の関連テーブルにも同時に挿入した方が便利である。
そのような場合は事前に利用するテーブルのフィールドとその属性情報を取得する場合が多い。
本記事ではServiceNowテーブルから利用するフィールド情報を取得するスクリプトを作成します。

スクリプト

var target_table = "cmdb_ci_ip_firewall";     // フィールド情報を取得するテービル名
var field_list = ["Name", "Serial number", "Vendor", "Manufacturer", "Firmware manufacturer", "Firmware version", "Ports", "IP Address", "Location", "Status", "Category", "Owned by", "Managed by", "Managed By Group", "Support group", "Comments", "Model ID", "Model number", "Default Gateway"];
var column_list = ["column_label", "element", "internal_type", "reference", "default_value"];    // 情報を取得するフィールドラベル (フィールド名ではなくフォームなどに表示されているフィールドの「ラベル」です)

column_info_list = [];
for (var i=0; i<field_list.length;i++) {              // 取得するフィールド毎に処理する
  var gr_fields = new GlideRecord("sys_dictionary");  // ServiceNowのシステム辞書を検索する
  gr_fields.addQuery("name", target_table);           // 上で指定したテーブルをクエリーする
  gr_fields.addQuery("column_label", field_list[i]);  // 取得するフィールドをクエリーする
  gr_fields.addEncodedQuery('internal_type!=collection^ORinternal_type=NULL');//To ignore all the table dictionaries(optional)
  gr_fields.query();                                  // クエリーを実行

  while(gr_fields.next()) {                           // クエリーの結果を処理する。クエリー結果をDictionaryに変換する
    column_value_dict = {};
    for (var j=0; j<column_list.length; j++) {         // 取得したフィールド情報を処理する
      column_value_dict[column_list[j]] = gr_fields.getValue(column_list[j]);
    }
    column_info_list.push(column_value_dict);          // Dictionaryを結果リストに追加する
  }
}

csv_str = "\n";
for (var k=0; k<field_list.length; k++) {             // 結果を表示する
  csv_str += Object.keys(column_info_list[k]).map(function(m){  // csvに変換する
    return column_info_list[k][m];
  }).join(',') + "\n";
}
gs.info(csv_str);

テーブル情報の取得手順

スクリプトを利用してLibreOfficeにテーブルデータ情報表を作成する手順を示します。

情報を取得するテーブル名を取得

情報を取得するテーブル名を取得します。
1. ServiceNowのアプリケーションナビゲータから情報を取得するフォームを検索して開きます。
例では「firewall」テーブルの情報を取得するため「firewall」を検索します。

2. リストのヘッダを右クリックして「Configure」ー「Dictionary」を選択します。

3. テーブル情報リストが表示されます。列「Table」の値がデータベーステーブル名です。

4. テーブル名をスクリプト内の変数「target_table」に設定します。

var target_table = "cmdb_ci_ip_firewall";

情報を取得するフィールドラベルを所得

次ぎの情報を取得するフィールドラベルを取得します。
1. テーブルに関するフォームを開き、新規レコード用フォームを開きます。
「New」ボタンを押下。

2. フィールドラベルはフォームに表示している文字列です。

3. フォームに表示されていないフィールドラベルを取得するにはフォームデザイナを開くいます。
リストコントロールアイコンを右クリックして「Configure」ー「Form Design」を選択する。

4. 右側にフォームで利用可能なフィールドラベル一覧が表示されます。フォームに追加する場合はドラッグ&ドロップします。
フォームに追加しなくてもフィールドの情報を取得することは可能です。その場合はフィールドラベルをメモしてスクリプトの所得するフィールド情報リストに指定します。

5. フィールドをフォームに追加する場合はフィールドラベルをドラッグ&ドロップした後に「Save」ボタンを押下します。

6. フィールドを追加した場合は追加したフィールドがフォームに追加されます。

7. 取得するフィールドのフィールドラベル名をスクリプト内の変数「field_list」に設定します。

var field_list = ["Name", "Serial number", "Vendor", "Manufacturer", "Firmware manufacturer", "Firmware version", "Ports", "IP Address", "Location", "Status", "Category", "Owned by", "Managed by", "Managed By Group", "Support group", "Comments", "Model ID", "Model number", "Default Gateway"];

スクリプトの実行

スクリプトを実行してフィールド情報をcsv形式で取得します。取得した情報をLibreCalcに貼り付けます。
1. ServiceNowから直接スクリプトを実行します。直接実行する場合は「Scripts - Background」を使います。
アプリケーションナビゲータから「background」を検索して「System Definition」下の「Scripts - Background」を選択します。

2. スクリプトをコピーペーします。
「Run script」ボタンを押下するとスクリプトは実行されます。

3. スクリプトの実行結果が表示されます。

4. 結果を選択してコピーします。

5.LibreCalcを開き、シートに内容を貼り付けます。

6.1レコードが1セルに貼り付けられますのでデータを分離します。
列を選択してメニューから「データ」ー「テキストから列へ」を選択します。

7.結果はコンマ区切りなので「コンマ」をチェックして、「OK」ボタンを押下します。

8. 行の高さが大きいので調整します。
左上を選択してすべてのセルを選択してコピーします。

9.新しいシートに貼り付けます。

10.ヘッダ、列幅などを調整します。

以上