☃️

ServersideScriptをSystemとして実行する

2021/03/05に公開

概要

Scriptを実行すると、実行者がログインしているユーザーになるがレコードの作成、更新、削除を実行するとfulfillerとしてカウントされる危険性がある。
そのため上記の作業は実行者をSystemとして実行する必要がある。

方法

スクリプトをスケジュールして実行した場合、実行者がSystemとなるためこれを応用して回避する。

  1. スケジュールを実行するメソッドを定義する
_execDMLScript: function(script, label) {
	var startDate = new GlideDateTime();
	startDate.addSeconds(1); //一秒後に起動する

	var so = new ScheduleOnce();
	so.script = script; //String化された実行するスクリプト
	so.setTime(startDate);
	so.setLabel(label); //実行中にテーブルで表示されるラベル
	so.schedule();

	gs.sleep(2000); //同期処理のため待機します
}
  1. 実行するスクリプトを定義して前述のメソッドに引き渡す
var sampleName = "test";
car sampleValue = "hoge";

//変数が文字列の場合は展開されるとシングルコーテーションが付かないため、前後の文字列にシングルコーテーションを加える必要がある。
var script = "var gr = GlideRecord('sys_sample_list');" +
	"gr.initialize();" +
	"gr.name='" + sampleName + "';" +
	"gr.value='" + sampleValue + "';" +
	"gr.insert();";
this._execDMLScript(script, 'sample execute');
  1. 実行されるとsys_triggerテーブルにQueが登録されます。

注意点

sys_triggerでは実行中や準備完了などのステータスがありますが完了のステータスがありません。完了するとQue自体が削除されるためステータス管理が難しいのでSleepを使っています。
非同期で実行してもいい場合は、特段使う必要がありません。

Discussion