インタラクティブフィルターをポータルから使用することはできますか?またリクエスタロールを保持するユーザが使用することはできますか?

Hisol171
Tera Contributor

ダッシュボード、レポートについては閲覧可能権限としてリクエスタを追加し、ポータルからクイックリンク等で閲覧できると思います。しかし、インタラクティブフィルターは権限を設定する箇所はなく、ポータルから閲覧することもできない認識です。

 

以下2点が可能か教えて頂きたいです。よろしくお願い致します。

・インタラクティブフィルターをポータルから使用することはできるか

・リクエスタロールを保持するユーザが使用することはできるか

1件の返信1

iwai
Giga Sage

ServiceNowのサービスポータルでは標準のインタラクティブフィルターが用意されていないため、レポートを動的にフィルタリングするには自作する必要があります。今回の実装では、標準のReport Widgetをクローンし、Interactive FilterをHTMLとスクリプトで自作して組み込みました。

iwai_0-1735636543359.png

 

概要

  • HTML: フィルター用のselect要素を追加し、選択時に自動でフィルターが適用されるように設計しました。
  • Server-Side Script: GlideRecordを使用して、incidentテーブルからカテゴリの選択肢を取得し、クライアント側に送信しました。
  • Client-Side Script: ng-changeイベントを使用して、選択時にフィルターが即時適用されるようにしました

作り方
1、Report Widgetをクローン

既存のReport Widgetを複製し、新しいWidgetを作成。


2、HTMLの追加
以下のHTMLをWidgetのHTMLセクションに追加。

  <!-- Category Filter -->
  <div class="form-inline">
    <label for="categoryFilter" class="control-label">Category:</label>
    <select id="categoryFilter"
            class="form-control"
            ng-model="c.selectedCategory"
            ng-options="option.value as option.label for option in c.data.categoryOptions"
            ng-change="c.applyFilter()">
      <option value="">-- Select Category --</option>
    </select>
  </div>


3、Server-Side Scriptの追加
以下のコードでカテゴリの選択肢を取得。

// Categoryフィールドの選択肢を取得
var gr = new GlideRecord("incident");
gr.initialize();
var choices = gr.category.getChoices();
var categoryOptions = [];

for (var i = 0; i < choices.size(); i++) {
  gr.category = choices.get(i); // 内部値をセット
  var displayValue = gr.category.getDisplayValue(); // 表示値を取得
  categoryOptions.push({
    value: gr.category.toString(),
    label: displayValue,
  });
}

data.categoryOptions = categoryOptions; // クライアントに送信


4、Client-Side Scriptの追加
ng-changeでフィルターを即時適用。

c.applyFilter = function () {
  $timeout(function () {
    var report_query = "category=" + c.selectedCategory; // カテゴリでフィルタ
    if (!c.selectedCategory) {
      report_query = "";
    }

    var params = {
      jvar_report_id: reportId,
      sysparm_interactive_report: JSON.stringify({
        additional_filters: [ [ {
              table: "incident",
              filter: report_query
            } ] ]
      })
    };

    var targetEl = $("#report-widget-" + c.rectangleId);
    embedReportByParams(targetEl, params);
  });
};

 

注意点
ClientScriptでレポートを作成している embedReportByParams はServiceNowの公式ドキュメントで説明されているAPIです。

Jellyにレポートを埋め込む - ServiceNow

しかし、sysparm_interactive_reportの使い方については記載がありません。そのため、今回の実装は動作するものの、正確な使い方である保証はなく、今後のバージョンアップで仕様が変更される可能性があります。