概要
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にテーブルデータ情報表を作成する手順を示します。
情報を取得するテーブル名を取得
情報を取得するテーブル名を取得します。
- ServiceNowのアプリケーションナビゲータから情報を取得するフォームを検索して開きます。
例では「firewall」テーブルの情報を取得するため「firewall」を検索します。 - リストのヘッダを右クリックして「Configure」ー「Dictionary」を選択します。
- テーブル情報リストが表示されます。列「Table」の値がデータベーステーブル名です。
- テーブル名をスクリプト内の変数「target_table」に設定します。
var target_table = "cmdb_ci_ip_firewall";
情報を取得するフィールドラベルを所得
次ぎの情報を取得するフィールドラベルを取得します。
- テーブルに関するフォームを開き、新規レコード用フォームを開きます。
「New」ボタンを押下。 - フィールドラベルはフォームに表示している文字列です。
- フォームに表示されていないフィールドラベルを取得するにはフォームデザイナを開くいます。
リストコントロールアイコンを右クリックして「Configure」ー「Form Design」を選択する。 - 右側にフォームで利用可能なフィールドラベル一覧が表示されます。フォームに追加する場合はドラッグ&ドロップします。
フォームに追加しなくてもフィールドの情報を取得することは可能です。その場合はフィールドラベルをメモしてスクリプトの所得するフィールド情報リストに指定します。 - フィールドをフォームに追加する場合はフィールドラベルをドラッグ&ドロップした後に「Save」ボタンを押下します。
- フィールドを追加した場合は追加したフィールドがフォームに追加されます。
- 取得するフィールドのフィールドラベル名をスクリプト内の変数「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に貼り付けます。
- ServiceNowから直接スクリプトを実行します。直接実行する場合は「Scripts - Background」を使います。
アプリケーションナビゲータから「background」を検索して「System Definition」下の「Scripts - Background」を選択します。 - スクリプトをコピーペーします。
「Run script」ボタンを押下するとスクリプトは実行されます。 - スクリプトの実行結果が表示されます。
- 結果を選択してコピーします。
5.LibreCalcを開き、シートに内容を貼り付けます。
6.1レコードが1セルに貼り付けられますのでデータを分離します。
列を選択してメニューから「データ」ー「テキストから列へ」を選択します。
7.結果はコンマ区切りなので「コンマ」をチェックして、「OK」ボタンを押下します。 - 行の高さが大きいので調整します。
左上を選択してすべてのセルを選択してコピーします。
9.新しいシートに貼り付けます。
10.ヘッダ、列幅などを調整します。
以上