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

# 概要
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のアプリケーションナビゲータから情報を取得するフォームを検索して開きます。<br/>例では「firewall」テーブルの情報を取得するため「firewall」を検索します。<br/>![table_info_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/655ac73c-339e-152c-d8d9-52d854797426.png)
2. リストのヘッダを右クリックして「Configure」ー「Dictionary」を選択します。<br/>![table_info_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e7aee592-74c3-7913-9e4f-298ced07a882.png)
3. テーブル情報リストが表示されます。列「Table」の値がデータベーステーブル名です。<br/>![table_info_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/50577efe-60a9-4a99-6624-d3f0dec8ebf6.png)
4. テーブル名をスクリプト内の変数「target_table」に設定します。<br/><pre>var target_table = "cmdb_ci_ip_firewall";</pre>

## 情報を取得するフィールドラベルを所得
次ぎの情報を取得するフィールドラベルを取得します。
1. テーブルに関するフォームを開き、新規レコード用フォームを開きます。<br/>「New」ボタンを押下。<br/>![table_info_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6de96ca8-a81c-78b9-22b1-dea0ae29e84d.png)
2. フィールドラベルはフォームに表示している文字列です。<br/>![table_info_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6f7c75bc-3310-961f-e1fc-382de531a2d6.png)
3. フォームに表示されていないフィールドラベルを取得するにはフォームデザイナを開くいます。<br/>リストコントロールアイコンを右クリックして「Configure」ー「Form Design」を選択する。<br/>![table_info_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/9d8e3a24-44ea-e85f-f27a-dda7cbbb367a.png)
4. 右側にフォームで利用可能なフィールドラベル一覧が表示されます。フォームに追加する場合はドラッグ＆ドロップします。<br/>フォームに追加しなくてもフィールドの情報を取得することは可能です。その場合はフィールドラベルをメモしてスクリプトの所得するフィールド情報リストに指定します。<br/>![table_info_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c311d2db-31d9-cbf7-c459-c7551e1e289a.png)
5. フィールドをフォームに追加する場合はフィールドラベルをドラッグ＆ドロップした後に「Save」ボタンを押下します。<br/>![table_info_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c856ac10-6cce-a3f2-7593-fd6953729240.png)
6. フィールドを追加した場合は追加したフィールドがフォームに追加されます。<br/>![table_info_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/5c5a40f0-d2dc-5252-066f-45dfec62c62b.png)
7. 取得するフィールドのフィールドラベル名をスクリプト内の変数「field_list」に設定します。<br/><pre>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"];</pre>

## スクリプトの実行
スクリプトを実行してフィールド情報をcsv形式で取得します。取得した情報をLibreCalcに貼り付けます。
1. ServiceNowから直接スクリプトを実行します。直接実行する場合は「Scripts - Background」を使います。<br/>アプリケーションナビゲータから「background」を検索して「System Definition」下の「Scripts - Background」を選択します。<br/>![table_info_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6040653f-1703-4c3c-cdec-a6faab899601.png)
2. スクリプトをコピーペーします。<br/>「Run script」ボタンを押下するとスクリプトは実行されます。<br/>![table_info_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/0fd769e0-fd47-487a-ffd2-4e8123e14219.png)
3. スクリプトの実行結果が表示されます。<br/>![table_info_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ba88198e-1414-87e5-7810-6e158ebd0ba5.png)
4. 結果を選択してコピーします。<br/>![table_info_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d999b132-e855-88ed-6220-16a99267b04c.png)
5.LibreCalcを開き、シートに内容を貼り付けます。<br/>![table_info_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6370e2de-04b0-38be-c4fd-9d097b857da9.png)
6.1レコードが1セルに貼り付けられますのでデータを分離します。<br/>列を選択してメニューから「データ」ー「テキストから列へ」を選択します。<br/>![table_info_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/6fe33871-b65c-8ca4-ded7-6b80bc1cc914.png)
7.結果はコンマ区切りなので「コンマ」をチェックして、「OK」ボタンを押下します。<br/>![table_info_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/de2560ce-c328-4ab4-2b38-3c60ccea5392.png)
8. 行の高さが大きいので調整します。<br/>左上を選択してすべてのセルを選択してコピーします。<br/>![table_info_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/be609e5c-ed5c-8d5f-ac4d-5e3df4e54893.png)
9.新しいシートに貼り付けます。<br/>![table_info_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/668e9ce4-9aa1-2931-3fa3-9aa6debb92c4.png)
10.ヘッダ、列幅などを調整します。<br/>![table_info_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4e894ffe-3f90-e9a6-b012-e648d61d0b7d.png)

以上