1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UI Action(Server Side)とClient Script(onLoad)からSubflowを実行する

Last updated at Posted at 2025-11-15

Version: Xanadu

この記事は以下の記事に書いていただいたことをServer SideのUI ActionとClient Script(onLoad)で試しただけの内容です料理レシピサイトの「作ってみた」みたいな感じです一旦Server Sideで試して書いてから追加でClientも試して追記したので読みづらくなってしまいました

Subflowの作成

メールアドレスを渡すとsys_userからそのUser IDを返すものを作成します

Filer navigatorでProcess Automation - Flow Designerを選択して別タブでFlow Designerを起動して[New]でSubflowを選択して

image.png

Nameに getUserNameFromEmailAddress と入力して[Build subflow]をクリックして

image.png

INPUTS & OUTPUTSにそれぞれTypeがStringの項目を追加して

image.png

1つめのActionをLook Up RecordにしてTableをsys_emailにしてConditionの検索条件でEmailをInputのemailAddressで検索するようにして(魔法の杖のようなアイコンをクリックすると検索条件にInputを選択できます)

image.png

2つめのActionでOutputsに1つめのActionの戻り値のレコードのUser IDを設定してPublishします

image.png

Create code Snippet(Server)

元記事にある手順通り右上の…アイコンからCreate Code Snippetを選択してみますServerとClientを切り替えられるようですが初期表示のServerをそのまま選択します

image.png

Copy Code Snippet to Clipboardした内容が以下です

(function() {
	
	try {
		var inputs = {};
		inputs['emailaddress'] = ; // String 

		// Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
		// sn_fd.FlowAPI.getRunner().subflow('global.getusernamefromemailaddress').inBackground().withInputs(inputs).run();
				
		// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
		var result = sn_fd.FlowAPI.getRunner().subflow('global.getusernamefromemailaddress').inForeground().withInputs(inputs).run();
		var outputs = result.getOutputs();

		// Get Outputs:
		// Note: outputs can only be retrieved when executing synchronously.
		var username = outputs['username']; // String
		
	} catch (ex) {
		var message = ex.getMessage();
		gs.error(message);
	}
	
})();

UI Actionの作成

sys_emailテーブルにUI Actionを追加してみたいのでsys_emailテーブルの適当なレコードを開いて

image.png

画面上部で右クリックして表示されるメニューから Configure - UI Actions を選択して

image.png

UI Actionの一覧が表示されるので [New] をクリックして

image.png

表示された画面でNameに getWildAndTough と入力してForm buttonをチェックして

image.png

ScriptにCode snippetからfunctionを外してinputsはcurrentでrecipients項目から設定して取得したusernameを画面にgs.addInfoMessageで表示して画面遷移を防ぐようにaction.setRedirectURL(current)を追加した以下を設定します

try {
	var inputs = {};
	inputs['emailaddress'] = current.getValue('recipients'); // String 

	// Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
	// sn_fd.FlowAPI.getRunner().subflow('global.getusernamefromemailaddress').inBackground().withInputs(inputs).run();
				
	// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
	var result = sn_fd.FlowAPI.getRunner().subflow('global.getusernamefromemailaddress').inForeground().withInputs(inputs).run();
	var outputs = result.getOutputs();

	// Get Outputs:
	// Note: outputs can only be retrieved when executing synchronously.
	var username = outputs['username']; // String

	gs.addInfoMessage("USER NAME IS HERE [" + username + "]");

} catch (ex) {
	var message = ex.getMessage();
	gs.error(message);
}
action.setRedirectURL(current); 

動作確認(Server)

sys_email画面に戻ると[getWildAndTough]ボタンが追加されています

image.png

[getWildAndTough]ボタンをクリックすると画面上部に取得したユーザー名が表示されました

image.png

Client Sideも試す

当初やりかたかったことは出来たのですがCreate code SnippetにClientのコードがあったことが気になるので元記事を参考にまた続けてみます

ACLの作成

元記事にある内容そのままで作成してみます Filter navigatorからSystem Security - Access Control (ACL)でACLの一覧に遷移して[New]ボタンが見つからなくて面食らって

image.png

権限周りの設定だからElevate roleが必要になるのかなと思いついて画面右上のプロフィール画像をクリックして表示されたメニューからElevate roleを選択して表示されたダイアログ画面でsecurity_adminをチェックしてUpdateして

image.png

無事に[New]ボタンが表示されたのでクリックして表示された画面でAdvancedをチェックして以下の内容をそのまま設定して[Submit]します

Type: client_callable_flow_object
Operation: execute
Application: Global
Name: (適当)(例: Trigger flow from client script)
Requried roleとCoditionとScript: (適当)

roleは特に設定しなかったところsnc_internalが設定されたようです

image.png

Create to Code Snippet(Client)

Server Sideの手順で作成済みのSubflowのCode Snippetを取得します

Clientを選択したところ「このSubflowは現在の設定ではClientから呼べない」と警告が出てしまいました

image.png

ACLだけじゃダメなのかなと探すとどうも…ボタンの Manage security の設定が必要なようなのでクリックして

image.png

表示された別ウインドウでCallable by Client APIをチェックしてACLsに先に作成していた Trigger flow from client script を設定して[Update]します

image.png

別ウインドウを閉じてFlow Designerに戻り再びCreate Code SnippetをクリックしてClientを選択したら警告が消えました

image.png

取得したCode Snippetがこちらです

(function() {
	
	var inputs = {};

	inputs['emailaddress'] = ; // String 

	GlideFlow.startSubflow('global.getusernamefromemailaddress', inputs)
		.then(function(execution) {
			return execution.awaitCompletion();
		}, errorResolver)
		.then(function(completion) {

			var status = completion.status;

			// Available Outputs:
			var outputs = completion.outputs;		
			var username = outputs['username']; // String
		});

	function errorResolver(error) {
		// Handle errors in error resolver
	}
})();

Client Scriptの作成

sys_userテーブルの適当なレコードを選択して画面上部から右クリックでConfigure - Client Scriptを選択して

image.png

表示された一覧から[New]をクリックしてNameに getWildAndToughClient と入力してTypeでonLoadを選択してScriptはinputsを画面のrecipients項目から取得するようにして取得した結果とerrorをalertで画面に表示するようにした以下で設定して

function onLoad() {
   //Type appropriate comment here, and begin script below
var inputs = {};
	inputs['emailaddress'] = g_form.getValue("recipients"); // String 

	GlideFlow.startSubflow('global.getusernamefromemailaddress', inputs)
		.then(function(execution) {
			return execution.awaitCompletion();
		}, errorResolver)
		.then(function(completion) {
			var status = completion.status;
			// Available Outputs:
			var outputs = completion.outputs;		
			var username = outputs['username']; // String
alert("USER NAME IS HERE CLIENT:[" + username + "]");
		});
	function errorResolver(error) {
		// Handle errors in error resolver
alert(error);
	}  
}

この状態にして[Save]します

image.png

動作確認(Client)

Client Scriptを追加したsys_email画面を表示してメッセージが表示されることを確認しました

image.png

感想

久しぶりにFlowを触ってみるもtriggerがレコードのinsert/updateと時間指定とメール受信などだけで…操作している人が任意に実行できるものがなくて困ったのでこちらを試しました

この記事は以下の記事に書いていただいたことを試しただけの内容です料理レシピサイトの「作ってみた」みたいな感じです

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?