フォーム(Requested itemやRecord producer)にて、variableを事前に埋めた状態で他のUserに共有したい。

Taiki Soeya
Tera Contributor

お世話になります。

表題の通りです。

 

フォーム(Requested itemやRecord producer)にて、variableを事前に埋めた状態で他のUserに共有し、申請してもらう方法はありますでしょうか。

 

■想定している具体的な運用例---------------
特定のレコードの更新をトリガーとしてFlow(①)を実行。
このFlow(①)の中で、Userにフォーム(②)のリンクを送り、提出(③)してもらう。
提出されたことをFlow①でキャッチし、Flow①のフローステップを進める。
------------------------------------

これを実現するためには、Flow①と提出された③を紐づける必要があるため、フォーム(②)のVariableにFlow①の情報を含ませたいと考えている。(例えば、Flowのトリガーとなったレコードの番号等)

 

Flow①の中で、フォーム②にonLoad Client Scriptを埋め込んでからリンクを送ることで実現可能ではあるのですが、このフォーム②は汎用性が高いため、同じタイミングでたまたまフォーム②開き、それを提出されてしまうと、誤った紐づきが出来てしまいます。

そのため、Client Scriptではなく、URLにパラメータとして値を含ませる方法があればBestだと感じています。

なお、サービスポータル以外のUIでも問題ないです。

 

お手数ですが、ご教授いただけますと幸いです。 

 

以上、どうぞよろしくお願いします。

1 件の受理された解決策

Hitoshi Ozawa
Giga Sage
Giga Sage

先ずフォーラムの基本ルールとして投稿した内容を変更せず、追加内容も回答して投稿します。同じような問題があるユーザも検索して読む場合は内容が変更されると分かりづらくなります。また、変更されると通知されません。

さて、本題になります。getParameterValue()はURLからパラメータの値を取得します。

UIとサービスポータルではURIの仕組みが異なります。

サービスポータルの場合はフォームのURIに次の様にパラメータを追加します。

&parm1=123&parm2=456

UIの場合はURLエンコードしてパラメータを追加します。「%26」です。「&」を使うと正しく動作しません。またURI本体も異なるので注意が必要です。

%26parm1=123%26parm2=456
function onLoad() {
    g_form.setValue('field1', getParameterValue('parm1')); // フィールドfield1にparm1の値を設定する
    g_form.setValue('field2', getParameterValue('parm2')); // フィールドfield2にparm2の値を設定する
}

function getParameterValue(name) {
    var url = top.location.href;
    var value = new URLSearchParams(url).get(name);
    if (value) {   // サービスポータルの場合の処理
        return value;
    }
    if (!value) {  // UIの場合の処理
        try {
            var gUrl = new GlideURL();
            gUrl.setFromCurrent();
            value = gUrl.getParam(name);
            if (typeof value == 'undefined') { // パラメータが無い場合は空白を返す
                return '';
            } else {
                return value;
            }
        } catch (e) {}
    }
}

実行例:

フォームを次のように定義しました。

find_real_file.png

1.サービスポータル

https://<インスタンス名>.service-now.com/sp?id=sc_cat_item&sys_id=<sys_id>&sysparm_category=<カタログ番号>&parm1=123&parm2=456

find_real_file.png

2.UI

https://<インスタンス名>.service-now.com/nav_to.do?uri=%2Fcom.glideapp.servicecatalog_cat_item_view.do%3Fv%3D1%26sysparm_id%3D<sys_id>%26parm1=123%26parm2=456

find_real_file.png

元の投稿で解決策を見る

7件の返信7

Hi.

I think so. but i can hardly use English

Regards

Hitoshi Ozawa
Giga Sage
Giga Sage

先ずフォーラムの基本ルールとして投稿した内容を変更せず、追加内容も回答して投稿します。同じような問題があるユーザも検索して読む場合は内容が変更されると分かりづらくなります。また、変更されると通知されません。

さて、本題になります。getParameterValue()はURLからパラメータの値を取得します。

UIとサービスポータルではURIの仕組みが異なります。

サービスポータルの場合はフォームのURIに次の様にパラメータを追加します。

&parm1=123&parm2=456

UIの場合はURLエンコードしてパラメータを追加します。「%26」です。「&」を使うと正しく動作しません。またURI本体も異なるので注意が必要です。

%26parm1=123%26parm2=456
function onLoad() {
    g_form.setValue('field1', getParameterValue('parm1')); // フィールドfield1にparm1の値を設定する
    g_form.setValue('field2', getParameterValue('parm2')); // フィールドfield2にparm2の値を設定する
}

function getParameterValue(name) {
    var url = top.location.href;
    var value = new URLSearchParams(url).get(name);
    if (value) {   // サービスポータルの場合の処理
        return value;
    }
    if (!value) {  // UIの場合の処理
        try {
            var gUrl = new GlideURL();
            gUrl.setFromCurrent();
            value = gUrl.getParam(name);
            if (typeof value == 'undefined') { // パラメータが無い場合は空白を返す
                return '';
            } else {
                return value;
            }
        } catch (e) {}
    }
}

実行例:

フォームを次のように定義しました。

find_real_file.png

1.サービスポータル

https://<インスタンス名>.service-now.com/sp?id=sc_cat_item&sys_id=<sys_id>&sysparm_category=<カタログ番号>&parm1=123&parm2=456

find_real_file.png

2.UI

https://<インスタンス名>.service-now.com/nav_to.do?uri=%2Fcom.glideapp.servicecatalog_cat_item_view.do%3Fv%3D1%26sysparm_id%3D<sys_id>%26parm1=123%26parm2=456

find_real_file.png

なるほど、URLに含めたパラメータを取得するScriptが書けるのですね。

実際に私の環境でも試してみて、うまくいくことが確認できました。

本当にありがとうございました!

 

また、フォーラムの基本ルールについても承知いたしました。

ご教示いただきありがとうございました。