外部データ(Excel)をServiceNowのテーブルへインポートしてみる

#はじめに
ExcelのデータをServiceNowのテーブル(ターゲットテーブル)にインポートをしてみようと思います。
このとき外部データを直接ターゲットテーブルへインポートをすることはできません。
***システムインポートセットテーブル***を使用します。

今回検証で使用するインスタンスのバージョンはParisです。

#用語の整理
##システムインポートセットテーブル
外部データソースからインポートする前に、取り込むデータ内容とそのデータを格納する場所を把握することができます。

##変換マップ
システムインポートセットテーブルのカラム名とターゲットテーブルのカラム名を一致させておくと自動マッピングしてくれます。
カラム名が一致していない場合はServiceNowのUIからドラッグアンドドロップで簡単にマッピングすることができます。

#検証　～準備編～
##ラボインスタンスを用意
[Developerサイト](https://developer.servicenow.com/)から入手してください。無料です。
やり方は割愛します。

##ターゲットテーブルを作成
システムアドミニストレータで
System Definition→tables からNEWをクリックして新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/600abf84-2e6d-8cb8-c276-281833eff446.png)

ラベル名などを設定します。
今回は、fruitsという名前のテーブルにします。（拡張テーブルにしません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/4fa7a605-1289-922e-bceb-548891286665.png)

##Form Layoutのカスタマイズ
フォームコンテキストメニュー→save または Submitををクリックします。

フィルターナビゲータでfruitsで検索します。
fruitsモジュールをクリックして、List内のNEWボタンをクリックします。
フォームコンテキストメニュー→configure→Form Layoutをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/1231a9b1-50cb-7b29-aa1b-6201b84d37f9.png)

Create new fieldで以下のカラムを作成します。

|   | Name | Type |
|:-:|:-:|:-:|
| 1 | id | integer |
| 2 |  fruits_name | string (Small(40)) |
| 3 |  price |  integer |
| 4 |  origin | string (Small(40)) |

作成したら、saveします。

↓ 出来上がりのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/069edd68-bb99-865a-402b-e640b6a4fff9.png)

##fruitsアプリケーションメニューのカスタマイズ
fruitsアプリに、果物のレコードを追加できるメニューをつくっていきます。

fruitsアプリにペンマークがあるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/1faf3d93-d3b8-60fd-32d0-0a069340a7bc.png)

フォームの下部にあるModulesセクションでNEWをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/4a6269b9-c65f-ffa9-26e9-4890e69e6696.png)

TitleをAdd Fruitsと入力します。
Link Typeタブで　Link Type：New Record、Table：fruits[u_fruits]を選択します。
Submitボタンをクリックします。

これで、fruitsアプリ内にAdd Fruitsモジュールを追加できました。

必要であれば、fruitsモジュールの名前をList Frutisと変えてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/ac93766c-3b8d-99aa-d832-9c8faf4e642a.png)

##List FruitsのList Layoutのカスタマイズ
フィルターナビゲータで「list fruits」で検索し、List Fruitsモジュールをクリックします。
Createdの列コンテキストメニュー→configure→List Layoutをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/2be6ac31-d48f-c80a-97ad-31666f3aa592.png)

Selected内を以下のように整理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/cb690328-da51-f869-0d98-c063da2d5f54.png)

saveをクリックします。
↓ 出来上がりのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/8a425eff-f7d8-49d4-4d08-f9315fe466c0.png)

##検証用のデータソース(Excel)の作成
外部データとなるファイルを作成していきます。
ファイル名は、fruits-data.xlsxにしました。
~~~産地は全部日本にしたかったけど、バナナは99％輸入のようです~~~

↓ 出来上がりのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/0e029b86-51b2-0501-6f62-ac46bfd32b23.png)

#検証　～インポート編～
ターゲットテーブルと外部データソースの準備ができたので、インポートしていきます。
おさらいですが、外部データを直接インポートはできませんでしたね。

##新しいインポートセットの作成
フィルターナビゲータで、System Import Sets→Load Dataをクリックします。

Label：fruits imports
File[ファイルを選択]で先程準備したfruits-data.xlsxを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/a4833fe6-3e45-9738-f3f5-b804b239fd23.png)

Submitをクリックします。
その後 Messagesで「insert 7」になっていることを確認します。（Excelのデータ行は7行でした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/d77e5f69-a8af-f96c-8c8c-0378c1dac726.png)

↑ 画像内の Next steps...でLoaded Dataを確認すると7レコードがあり、ステータスはPendingであることがわかります。


##変換マップの作成
復習ですが、インポートセットテーブルとターゲットテーブルのカラムのマッピング定義でしたね。

フィルターナビゲータで、System Import Sets→Create Transform Mapをクリックします。

以下のように入力します。
　Name：Fruits Assets
　Source table：Fruits Imports [u_fruits_imports]
　Target table：fruits [u_fruits]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/792f4149-bc6b-ba14-02ad-2956e8506b00.png)

フォームコンテキストメニュー→saveをクリックします。※Submitはクリックしません。

saveするとフォームの下部にRelated Linksが表示されます。
Auto Map Matching Fieldsをクリックします。

今回、id、price、originのカラム名は両テーブルで一致させていたため、自動マッピングされました。
フルーツ名を表すカラム名は、インポートセットテーブルでは「name」、ターゲットテーブルでは「fruits_name」としていたため
自動マッピングされていないというわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/78aafff4-1e7d-122f-dc01-a08bb7fe9047.png)

フォームの下部にRelated Links内で、Mapping Assistをクリックします。
ここから、フルーツ名のカラムを手動でマッピングさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/8bde33c6-0416-ba65-b567-6304a56533d6.png)

終わったらsaveをクリックします。
ページが遷移すると、Field Mapsのレコードが4つになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/35c65159-5c19-58cc-b8f0-85bfaa6f764e.png)

##変換の実行
それでは、ターゲットテーブルへ変換していきます。

フォームの下部にRelated Links内で、Transformをクリックします。

Selected mapsで、Fruits Assetsが選択されていることを確認して、Transformをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/d282120d-a185-08c6-7f13-4e0e22f6b937.png)

Transformation completeのメッセージがでたら、最後にListの確認をします。

#検証　～確認編～
フィルターナビゲータで「fruits」で検索します。
List Fruitsモジュールをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/4446d341-bb1d-b98b-f840-9b7aebf30cca.png)

無事にインポートができました。
お疲れさまでした！！

###補足
増分データがある場合には、レコードの重複が発生しないように結合(COALESCE)フィールドの設定をしてから変換しましょう。

結合フィールドとは、レコードの重複がある場合にはそのレコードを上書きしてくれます。
System Import Sets→Administration→Transform Mapsをクリックし、変換マップを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/b4c90821-fbd7-b407-5a82-b1f8c907fcc1.png)

フォーム下部より、Coalesceの値をTrueにすると有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440776/090d0913-66b3-c418-2f28-a4fff767fb1e.png)


#おわりに
外部データ(Excel)をインポートする方法を紹介しました。
インポートセットテーブルを使用して、外部データをテンポラリへ格納し
インポートセットテーブルのカラムとターゲットテーブルのカラムを変換マップを使って定義していましたね。

インポートセットテーブルもターゲットテーブルもServiceNowのテーブルなので簡単にインポートができるということです。