UI マクロ

  • リリースバージョン: Zurich
  • 更新日 2025年07月31日
  • 所要時間:14分
  • UI マクロは、アドミニストレーターがユーザーインターフェイスに追加できる個別のスクリプト化されたコンポーネントです。

    通常、UI マクロは既存のフィールド タイプによって提供されない入力または情報を提供するコントロールです。デフォルトでは、以下のようなさまざまなユーザーインターフェイス要素の UI マクロが提供されます。
    • すべてのフォーマッター
    • サービスカタログカート
    • フィールドの横にあるアクション アイコン
    • フォームおよびリストのアクション アイコン
    • コンテンツ管理システムのウィジェット
    • オーケストレーションアクティビティデザイナー

    アドミニストレーターは、独自の UI マクロを作成して、カスタムコントロールまたはインターフェイスを提供できます。UI マクロを作成するには、Jelly スクリプトの知識が必要です。例および提案されたアプローチについては、既存の UI マクロを確認してください。JavaScript テクノロジーを使用してカスタムインターフェイスをビルドする場合は、代替手段としてサービスポータルを検討してください。

    注:
    利用可能な UI マクロを表示するには、次に移動します: すべて > システム UI > UI マクロ.

    UI マクロの基本

    UI マクロを使用すると、使用可能なカタログ変数タイプを使用してビルドできないソリューションをビルドできます。

    アクセス可能な UI マクロ

    UI マクロ [ui_macros] テーブルでは、いくつかの UI マクロを使用できます。これらの UI マクロの名前は ui_ で始まり、UI ページで使用する標準フォームフィールドタイプのサブセットの動作をエミュレートします。たとえば、ui_date_time UI マクロは、UI ページの glide_date_time フィールドのように機能し、入力可能な入力フィールドに日時セレクターを提供できます。

    UI マクロは、<g:> Jelly タグを使用して UI ページに含めることができます。次の例には、UI マクロに 2 つのオプション属性を提供する ui_date_time UI マクロが含まれています。
    <g:ui_date_time name="due_date" value="2023-11-24 08:30:00" onchange="checkDateValue()" />
    <g:> Jelly タグの属性値は、jvar プリフィックス付き変数として UI マクロに提供されます。UI マクロは、その XML で jvar プリフィックス付き変数を使用できます。
    表 : 1. jvar プリフィックス付き変数として使用される Jelly タグ属性
    属性 jvar プリフィックス付き変数
    name jvar_name
    value jvar_value
    onchange jvar_onchange
    注:
    これらの UI マクロは、対応するフォームフィールドタイプのすべての機能をサポートすることは意図されていません。多くの場合、マクロは特定の ServiceNow アプリケーションユースケースのみを対象としています。

    ui_ プリフィックスが付いた UI マクロには、UI ページの <g:> Jelly タグで指定できる (または指定する必要がある) サポート対象属性を指定する説明が含まれています。利用可能な UI マクロを表示するには、次に移動します: すべて > システム UI > UI マクロ.

    /

    カスタム UI マクロ

    ui_example UI マクロは、3 つの jvar プリフィックス付き変数 (jvar_name、jvar_test_attribute、jvar_laptop_type) を使用します。これらの変数は、UI ページの <g:> Jelly タグで、name、test_attribute、および laptop_type 属性として UI マクロに提供できます。

    ui_example UI マクロの作成
    移動先 すべて > システム UI > UI マクロ [ 新規] を選択します。
    マクロに「ui_example」という名前を付け、次のスクリプトを [XML] フィールドに追加します。
    <?xml version="1.0" encoding="utf-8" ?>
    <j:jelly trim="true" xmlns:j="jelly:core" xmlns:g="glide">
        <div>name jvar: ${jvar_name}</div>
        <div>test_attribute jvar: ${jvar_test_attribute}</div>
        <div>laptop_type jvar: ${jvar_laptop_type}</div>
    </j:jelly>
    UI ページでのマクロの使用
    移動先 すべて > システム UI > UI ページ [ 新規] を選択します。アドミンロールの選択を求められます。
    UI ページに名前を付け、次のスクリプトを [HTML] フィールドに追加します。
    <?xml version="1.0" encoding="utf-8" ?>
    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
        <div style="text-decoration:underline">Template include one:</div>
        <g:ui_example name="Fred Luddy" test_attribute="I am an attribute" laptop_type="ThinkPad" />
        <hr/>
        <div style="text-decoration:underline">Template include two:</div>
        <g:ui_example name="Pat Casey" test_attribute="I am a different attribute" laptop_type="Macbook Pro" />
    </j:jelly>
    出力の確認
    UI ページで、[試行] をクリックして結果を表示できます。
    注:
    マクロを作成しても UI ページに想定どおりに表示されない場合は、キャッシュをクリアすると解決することがあります。インスタンスのキャッシュをクリアするには、ブラウザで「<server_url>/cache.do」と入力します。

    UI マクロの呼び出し

    アドミニストレーターは、ユーザーインターフェイスに関連付けられた特定のレコードタイプから UI マクロを呼び出すことができます。

    表 : 2. レコードタイプ別の UI マクロの呼び出し
    レコードタイプ
    辞書属性

    参照フィールドのアイコンを表示します。

    ref_contributions=ui_macro_name
    UI ページ

    UI ページに何かを表示します。

    <g:macro_invoke macro="ui_macro_name" />
    UI マクロ

    別の UI マクロから UI マクロを呼び出します。

    <?xml version= "1.0" encoding="utf-8"&nbsp;?>
    <j:jelly trim= "false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
      <g:ui_macro_name />
      <g:ui_macro_name_2 />
    </j:jelly>

    UI マクロフォーム

    各 UI マクロレコードは、Jelly コードで記述された名前と XML ドキュメントで構成されます。

    表 : 3. UI マクロフィールド
    フィールド 説明
    名前 一意でわかりやすいマクロの名前。
    アクティブ チェックボックスをオンにすると、要素が定義されたとおりにレンダリングされます。コードを削除せずに要素を無効にするには、チェックボックスをオフにします。たとえば、email_reply マクロはデフォルトでは非アクティブです。
    説明 マクロとそれに渡されるパラメーターの目的を説明します。
    XML マクロを定義する Jelly スクリプト。

    カスタム承認 UI マクロ

    このセクションでは、カスタム承認 UI マクロの作成方法について説明します。

    警告:
    ここに記載されているカスタマイズは、特定のインスタンスで使用するために開発されたものであり、Now Support ではサポートされていません。この方法は現状のまま提供され、実装の前に完全にテストする必要があります。このカスタマイズに関するすべての質問およびコメントは、コミュニティフォーラムに投稿してください。

    スクリプト名:カスタム承認 UI マクロ

    タイプ:UI マクロ

    説明:実行計画の [自分の承認] ビューから詳細を取得するオプションがあります。これは、新しい UI マクロを作成することで実行できます。[システム UI] に移動して、[UI マクロ] をクリックします。まず、既存の approval_summarizer_sc_task という名前を approval_summarizer_sc_task_old などに変更して、無効にする必要があります。次に、同じ名前 (approval_summarizer_sc_task) を使用して新しいマクロを作成する必要があります。名前は基本的に、マクロの実行内容と適用対象を示すものにする必要があります。ここでは、既存のものを置き換えるため、既存の名前を再利用することにしました。

    図 : 1. 承認マクロ

    次に、この記事の下部にある xml スクリプトを、新しい UI マクロの xml コードウィンドウにコピーする必要があります。これは、サービスカタログ実行計画内の承認タスクを介してアイテムを承認する際に、承認者に何らかの詳細を提供するのに最適な方法です。

    従来の方法

    これは、従来の方法で承認タスクを使用するときに [自分の承認] に表示されるビューです。

    図 : 2. 自分の承認 (従来の方法)

    承認者が実際に何を承認しようとしているのか、あまり詳しく書かれていないことに注意してください。タスクの簡単な説明は確認できますが、アイテムの詳細はわかりません。

    新しい方法

    これは、OOB (Out-Of-Box:すぐに利用可能な) UI マクロの代わりに以下の xml スクリプトを使用した場合に表示されるビューです。

    図 : 3. 自分の承認

    この方法を使用すると、要求の承認と同様に詳細を表示できます。注文したアイテムへのリンク、簡単な説明 (アイテムから変数を展開する機能を含む)、価格、数量、合計価格があります。これは、より詳細な情報を示すという点で、承認者の助けとなります。実際に承認しているものを確認できるようになりました。

    スクリプト:

    <?xml version="1.0" encoding="utf-8" ?>
        <j:jelly trim="true" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
        <tr>
            <td class="label_left" width="100%">
                <label style="margin-left: 10px">
                    ${gs.getMessage('Summary of Item being approved')}:
                    <input style="visibility: hidden" NAME="make_spacing_ok"></input>
                </label>
            </td>
        </tr>
        <g:evaluate var="jvar_ni" expression="
            var sc_task = ${ref}.sysapproval;
            var sc_req_labels = new GlideRecord('sc_req_item');
            sc_req_labels.initialize();
            var sc_req_item = new GlideRecord('sc_req_item');
            sc_req_item.addQuery('request_item', sc_task.request_item.sys_id);
            sc_req_item.query();
        " />
        <tr>
            <td width="100%">
                <table width="100%">
                    <tr>
                        <td class="label_left" width="150px">
                            <label style="margin-left: 10px">
                                ${sc_task.request_item.request.opened_by.sys_meta.label}:
                            </label>
                        </td>
                        <td>
                            ${sc_task.request_item.request.opened_by.getDisplayValue()}
                        </td>
                    </tr>
                    <tr> 
                        <td class="label_left" width="150px">
                            <label style="margin-left: 10px">
                                ${sc_task.request_item.request.requested_for.sys_meta.label}:
                            </label>
                        </td>
                        <td>
                            ${sc_task.request_item.request.requested_for.getDisplayValue()}
                        </td>
                    </tr>
                    <tr>
                        <td class="label_left" width="150px">
                            <label style="margin-left: 10px">${gs.getMessage('Total')}:</label>
                        </td>
                        <td>
                            <g:currency_format value="${sc_task.request_item.request.price}" />
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <j:set var="jvar_line_num" value="0" />
        <tr>
            <td width="100%">
                <table width="100%">
                    <tr class="header">
                        <td colspan="2">
                            ${sc_req_labels.number.sys_meta.label}
                        </td>
                        <td>
                            ${sc_req_labels.description.sys_meta.label}
                        </td>
                        <td>
                            ${sc_req_labels.price.sys_meta.label}
                        </td>
                        <td>
                            ${sc_req_labels.quantity.sys_meta.label}
                        </td>
                        <td>
                            ${gs.getMessage('Total')}
                        </td>
                    </tr>
                    <j:set var="jvar_item_price" value="${sc_task.request_item.price * sc_task.request_item.quantity}"/>
                    <j:set var="jvar_overall_total" value="${jvar_overall_total + jvar_item_price}"/>
                    <j:set var="jvar_line_color" value="odd"/>
                    <j:set var="jvar_line_num" value="${jvar_line_num + 1}"/>
                    <j:if test="${jvar_line_num % 2 == 0}">
                        <j:set var="jvar_line_color" value="even"/>
                    </j:if>
                    <g:evaluate var="ni" expression="
                        var smart_description = sc_task.request_item.cat_item.short_description;
                        if (smart_description == null || smart_description == '' || smart_description == 'undefined')
                            smart_description = sc_task.request_item.cat_item.name;
                    "/>
                    <tr class="${jvar_line_color}">
                        <td valign="top">
                            <g2:evaluate var="jvar_pop_target" expression="$[ref].getRecordClassName()" />
                            <a class="linked" target="gsft_main"                             href="sc_req_item.do?sys_id=${sc_task.request_item.sys_id}"                             onmousemove="popListDiv(event, 'sc_req_item', '${sc_task.request_item.sys_id}','${sysparm_view}')"                             onmouseout="lockPopup(event)">
                                <img src="images/icons/hover_icon.gifx" class="clsshort"/>
                            </a>
                        </td>
                        <td valign="top">
                            <a class="linked" target="gsft_main"                             href="sc_req_item.do?sys_id=${sc_task.request_item.sys_id}">
                                ${sc_task.request_item.number}
                            </a>
                        </td>
                        <td valign="top" width="50%">
                            <g:call function="variable_summary_approval.xml" 
                                question_name="${sc_task.request_item.sys_id}"
                                question_help_tag="${smart_description}" 
                                sc_req_item="${sc_task.request_item.sys_id}"
                                help_class="${jvar_line_color}"/>
                        </td>
                        <td valign="top"> <g:currency_format value="${sc_task.request_item.price}"/> </td>
                        <td valign="top"> ${sc_task.request_item.quantity}</td>
                        <td valign="top"> <g:currency_format value="${jvar_item_price}"/></td>
                    </tr>
                </table>
            </td>
        </tr>
    </j:jelly>