この記事は、Qiita ServiceNow アドベントカレンダーの24日目の記事です。
はじめに
※Yokohamaで試しました
Import Setでデータを登録することはよくあると思います。
ただImport Setはadminやimport_adminロールがないとデータ取り込みを行えないと思います。
そこで、カスタムテーブルを経由して、実行する方法を思いついたのでやってみます。
やること
ざっくりですがやることのイメージです
通常Import Setを利用する際のイメージ

- カスタムテーブルに登録するファイルを添付します
- 添付されたファイルをData Sourceに添付されているファイルと置き換えます
- Import Setを実行します
やってみよう
Import Set作成
Load Dataして一時テーブル作成



作って試したら文字化けしました・・・

Importの設定を変更して

前のデータをクリアして再取り込み

データが登録されました

これでImport Setの作成は完了です。
ただ、このままでは権限がないユーザーではImportできません
Import Setを実行するためのカスタムテーブル作成
Loadボタンを押すことで添付されているファイルをData Sourceの添付ファイルと置き換えステータスをReadyにします
Import 処理作成
ImportはScriptにてScheduled Data Importを動かすことで実現します
Import用のScheduled Data Importを作成

var attachment = new GlideSysAttachment();
var agr = attachment.getAttachments('sys_data_source', '61a3412483b132105e4e56a6feaad3b0'); // 添付ファイルを置き換えるsys_data_sourceのレコードのsys_id
agr.next();
attachment.deleteAttachment(agr.sys_id);
attachment.copy(current.getTableName(), current.sys_id, 'sys_data_source','61a3412483b132105e4e56a6feaad3b0');
current.state = 10;//ステータス更新
current.update();
Import用のClient Scriptを実装
var gr = new GlideRecord('scheduled_import_set');
gr.get('adb2fe38833d72105e4e56a6feaad333');//実行するScheduled Data Importレコードのsys_id
gs.executeNow(gr);//Scheduled Data Import実行
current.state = 100;//ステータス更新
current.update();
どちらも実験用なので最小限の実装にしています
もし実際に活用する場合は、ステータスに応じたボタンの制御や添付ファイルの個数、Data Sourceの添付ファイルの有無、添付ファイルをCopyできたか、実行結果などを適切に処理するような設計が必要です
また、今回は対象のレコードを特定するのにsys_idを直接設定していますが、本来はハードコーディングしない方がよいと思います
アプリケーションとユーザーを作成
アプリケーション

x_xxxxx_test.arunashiquiz_user, x_xxxxx_test.adminがアクセス可能にします
ユーザー

上記のロールのみを持つユーザーを作成します
やってみよう
アプリがあります

インポートセットは触れません

Import用のカスタムテーブルにデータを登録します
データのロード

ステータスが変わりました
あれ・・・前のCSVが消えていません

Adminで実行すると、問題なく動いているようなので、スコープアプリから実行しているためファイル削除ができないようです
Import処理を修正
変更内容
Client Scriptでの添付ファイル置き換えをFlowに変更
FlowならSystemユーザーで処理を実行できます
Client Scriptではステータスの変更を行い、それを契機にFlowを実行するようにします
※他にもやり方はあると思います
current.state = 10; //ステータス更新
current.update();
Flowを実装
ステータスがReadyに変更されたらFlowを実行

System Userで実行


Data Sourceの添付ファイルを削除

トリガーレコードの添付ファイルを取得

添付ファイルのレコードを取得

トリガーレコードの添付ファイルをData Sourceにコピー

気を取り直して、やってみよう
Importを実施

ステータスが変わりました
データ取り込みまでできました

さいごに
みなさんクイズの答えはわかりましたでしょうか?
本来ならこのような処理を実装する必要はないと思いますが、意外と必要になることもあります。
前の記事の答えはあるの方に動物がいました今回は反対から読むと別の意味になるでした
では、メリクリ!
以上!!↑!









