フォーム(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

Hitoshi Ozawa
Giga Sage
Giga Sage

onLoad Client Scriptで申請都度の条件でg_form.setValue()で設定できないのでしょうか?

具体的に申請都度異なる条件を明記してください。

説明文が不足しておりましたので、追記・編集いたしました。

結論から申し上げますと、設定すること自体はonLoad Client Scriptで申請都度の条件でg_form.setValue()で可能なのですが、たまたま同じタイミングでフォームを開いた人にも値が表示されてしまう事態を防げないと感じています。

どのような設定を行うかが不明ですが、同時に違うユーザがg_user.userNameをしても異なる値になります。

onLoadクライアントスクリプトの他にもデフォルト値にJavascriptを記述することも可能です。この場合はサーバ側でフォームが作成される時にサーバ側でスクリプトが実行されます。

その他にもdisplay business ruleを使うことも可能です。この場合もフォームが作成される前にサーバ側でスクラッチパッド変数にクライアントスクリプトで利用できる変数を設定します。

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

It would be nice if you could post the details in English so that members can help you

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader