3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ServiceNowのImport Setを権限がないユーザーで利用しよう

3
Last updated at Posted at 2025-12-23

この記事は、Qiita ServiceNow アドベントカレンダーの24日目の記事です。

はじめに

※Yokohamaで試しました

Import Setでデータを登録することはよくあると思います。
ただImport Setはadminやimport_adminロールがないとデータ取り込みを行えないと思います。
そこで、カスタムテーブルを経由して、実行する方法を思いついたのでやってみます。

やること

ざっくりですがやることのイメージです
通常Import Setを利用する際のイメージ
image.png

今回作成するもののイメージ
image.png

  1. カスタムテーブルに登録するファイルを添付します
  2. 添付されたファイルをData Sourceに添付されているファイルと置き換えます
  3. Import Setを実行します

やってみよう

Import Set作成

Load Dataして一時テーブル作成
image.png
image.png
image.png
作って試したら文字化けしました・・・
image.png
Importの設定を変更して
image.png
前のデータをクリアして再取り込み
image.png
データが登録されました
image.png

これでImport Setの作成は完了です。
ただ、このままでは権限がないユーザーではImportできません

Import Setを実行するためのカスタムテーブル作成

Importを管理するテーブルを作成
image.png
image.png

Loadボタンを押すことで添付されているファイルをData Sourceの添付ファイルと置き換えステータスをReadyにします

Import 処理作成

ImportはScriptにてScheduled Data Importを動かすことで実現します

Import用のScheduled Data Importを作成
image.png

データロード用のClient Scriptを実装
image.png

image.png

Load
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を実装

Import
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を直接設定していますが、本来はハードコーディングしない方がよいと思います

アプリケーションとユーザーを作成

アプリケーション
image.png
x_xxxxx_test.arunashiquiz_user, x_xxxxx_test.adminがアクセス可能にします
ユーザー
image.png

上記のロールのみを持つユーザーを作成します

やってみよう

まずはテスト用のユーザーにImpersonate
image.png

アプリがあります
image.png
インポートセットは触れません
image.png
Import用のカスタムテーブルにデータを登録します
データのロード
image.png
ステータスが変わりました
あれ・・・前のCSVが消えていません
image.png
Adminで実行すると、問題なく動いているようなので、スコープアプリから実行しているためファイル削除ができないようです

Import処理を修正

変更内容

Client Scriptでの添付ファイル置き換えをFlowに変更
FlowならSystemユーザーで処理を実行できます
Client Scriptではステータスの変更を行い、それを契機にFlowを実行するようにします
※他にもやり方はあると思います

Load
current.state = 10; //ステータス更新
current.update();

Flowを実装
ステータスがReadyに変更されたらFlowを実行
image.png
System Userで実行
image.png
image.png
Data Sourceの添付ファイルを削除
image.png
トリガーレコードの添付ファイルを取得
image.png
添付ファイルのレコードを取得
image.png
トリガーレコードの添付ファイルをData Sourceにコピー
image.png

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

実行前
image.png
取り込むファイル
image.png

ユーザーを変更してLoad
image.png
ファイルは置き換わったようです
image.png

Importを実施
image.png
ステータスが変わりました
データ取り込みまでできました
image.png

さいごに

みなさんクイズの答えはわかりましたでしょうか?

本来ならこのような処理を実装する必要はないと思いますが、意外と必要になることもあります。

前の記事の答えはあるの方に動物がいました

今回は反対から読むと別の意味になるでした

では、メリクリ!

以上!!↑!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?