コンテンツにスキップ

view.Filters

概要

viewオブジェクトの「Filters」です。サーバスクリプトで一覧画面やエディタに表示する「レコード」をフィルタすることで、ユーザに閲覧させるレコードを制限することができます。レコードのアクセス制御と異なり「レコード」1件1件にアクセス権を設定する必要がありません。JSONデータレイアウト:Viewが使用できます。

制限事項

  1. 「ビュー処理時」の条件のみ使用できます。
  2. 添付ファイル項目、コメント項目は使用できません。
  3. サーバスクリプトによりフィルタを設定した項目は一覧画面等のフィルタ操作が動作しません。サーバスクリプトにより上書きされます。
    1.view.Filterをすると「フィルタボタンを使用する」を有効にしても一覧画等面表示時にview.Filterに指定した条件で抽出したレコードが表示されます。
  4. view.Filterをすると常に検索条件を要求するを有効にしても一覧画等面表示時にview.Filterに指定した条件で抽出したレコードが表示されます。
  5. SQL Serverを使用する場合とPostgreSQLを使用する場合では検索結果が異なる場合がございます。SQL ServerではLIKE句またはフルテキスト検索が使用されるのに対し、PostgreSQLではILIKE句またはpg_trgmによるフルテキスト検索が行われます。

注意事項

  1. view.Filtersの機能で、一覧画面でレコードを抽出されないようにフィルタした場合であっても、横断検索では検索結果リストに表示されます。これを防ぐにはテーブルの管理の設定横断検索を無効化で横断検索を無効化する必要があります。

プロパティ

No プロパティ名 変更 説明
1 」[カラム名] ○ フィルタをかけるカラム名を指定しフィルタ文字列を設定。

メソッド

メソッドはありません。

使用例

使用例1

下記の例では状況項目が 900 (完了) または 910 (保留) のレコードを抽出して表示します。

view.Filters.Status = '["900","910"]';

使用例2

下記の例では担当者項目にセットされたユーザのユーザIDが 215 と 319 のレコードを抽出して表示します。

view.Filters.Owner = '["215","319"]';

使用例3

下記の例では数値項目にセットされた数値が 600000 ~ 700000 のレコードを抽出して表示します。カンマより前を省略すると 700000 以下、カンマより後を省略すると 600000 以上がセットされたレコードを抽出して表示します。複数の範囲を検索する場合は '["100000,200000","600000,700000"]' のように指定します。

view.Filters.NumA = '["600000,700000"]'

使用例4

下記の例では日付項目にセットされた日付が本日のレコードを抽出して表示します。'["Today"]'は本日、'["ThisMonth"]'は今月、'["ThisYear"]'は今年を抽出します。

view.Filters.DateA = '["Today"]';

使用例5

下記の例では日付項目にセットされた日付が 2021/5/1 00:00:00 ~ 2021/5/31 23:59:59.997 のレコードを抽出して表示します。カンマより前を省略すると 2021/5/31 23:59:59.997以前、カンマより後を省略すると 2021/5/1 00:00:00以降がセットされたレコードを抽出して表示します。複数の範囲を検索する場合は '["2021/1/1,2021/1/31 23:59:59.997","2021/5/1,2021/5/31 23:59:59.997"]' のように指定します。

view.Filters.DateB = '["2021/5/1,2021/5/31 23:59:59.997"]'

使用例6

下記の例ではチェック項目がオンになっているレコードを抽出して表示します。false を代入するとオフのレコードを抽出します。

view.Filters.CheckA = true;

使用例7

下記の例では内容項目に ソフトウェア の文字を含むレコードを抽出して表示します。テーブルの管理のフィルタで検索の種類を設定すると「部分一致検索」だけでなく「前方一致検索」や「完全一致検索」も行えます。タイトル項目、「説明項目および選択肢の無い分類項目でも同様の検索が行えます。

view.Filters.Body = 'ソフトウェア';

使用例8

下記の例では状況項目が 900 (完了) かつ日付項目にセットされた日付が本日のレコードを抽出して表示します。異なる項目を複数セットした場合には AND 条件でフィルタされます。

view.Filters.Status = '["900"]';
view.Filters.DateA = '["Today"]';

使用例9

下記の例では状況項目が 900 (完了) または分類項目の選択肢に 設計 がセットされたレコードを抽出して表示します。or_で始まる任意のプロパティにJSON形式のフィルタ条件を代入することで、OR条件によるフィルタを行うことができます。画面からのフィルタ操作は明示的に無効化する必要があります。

1
2
3
4
5
6
7
8
// 画面からのフィルタ操作を無効化
view.Filters.ClassA = '';
view.Filters.Status = '';
// OR条件の設定
let data = {};
data.Status = '["900"]';
data.ClassA = '["設計"]';
view.Filters.or_MyFilterName = JSON.stringify(data);

使用例10

下記の例では組織IDが 3 のユーザがアクセスした場合分類項目の選択肢に 人事 がセットされたレコードを抽出して表示します。組織IDが 7 のユーザが使用した場合分類項目の選択肢に 開発 がセットされたレコードを抽出して表示します。それ以外の組織のユーザがアクセスした場合には全てのレコードを抽出して表示します。

context.Log(context.DeptId);
switch (context.DeptId) {
    case 3:
        view.Filters.ClassA = '["人事"]'
        break;
    case 7:
        view.Filters.ClassA = '["開発"]'
        break;
    default:
        break;
}

使用例11

下記の例ではユーザIDが 2 以外のユーザがアクセスした場合 分類A が 設計 かつ 分類D が 3 のレコード、または 分類B が テスト かつ 分類D が 7 のレコードを抽出して表示します。ユーザIDが 2 のユーザがアクセスした場合には全てのレコードを抽出して表示します。and_で始まる任意のプロパティにJSON形式のフィルタ条件を代入することで、OR条件と条件をAND条件を組み合わせたフィルタを行うことができます。

if (context.UserId !== 2) {
    let data1 = {};
    data1.ClassA = '["設計"]';
    data1.ClassD = '["3"]';
    let data2 = {};
    data2.ClassA = '["テスト"]';
    data2.ClassD = '["7"]';
    let data = {};
    data.and_Filter1 = JSON.stringify(data1);
    data.and_Filter2 = JSON.stringify(data2);
    view.Filters.or_Filter = JSON.stringify(data);
}

使用例12

下記の例では 分類A でリンクした サイトID 6 のレコードの分類B に 東京都中野区 がセットされているレコードを抽出して表示します。下記の記述によりマスタレコードの項目でフィルタすることができます。

view.Filters['ClassA~6,ClassB'] = '東京都中野区';

使用例13

下記の例では 分類A でリンクされた サイトID 7 の子レコードの 分類B に システム開発 がセットされているレコードを抽出して表示します。下記の記述により子レコードの項目でフィルタすることができます。子レコードに複数のレコードがヒットした場合、親レコードの同じレコードが複数表示されます。

view.Filters['ClassA~~7,ClassB'] = '["システム開発"]';

使用例14

下記の例では 分類A の値と 分類B の値が一致しているレコードのみを抽出して表示します。eq_で始まる任意のプロパティに{1つ目の項目}|{二つ目の項目}の形式で比較する項目を指定することで、2つの項目の値が一致しているレコードのみをフィルタすることができます。1

view.Filters.eq_MyFilterName = 'ClassA|ClassB';

使用例15

下記の例では 分類A の値と 分類B の値が一致していないレコードのみを抽出して表示します。notEq_で始まる任意のプロパティに{1つ目の項目}|{二つ目の項目}の形式で比較する項目を指定することで、2つの項目の値が一致しているレコードのみをフィルタすることができます。2

view.Filters.notEq_MyFilterName = 'NumA|NumB';

eq_、notEq_で始まるプロパティは、or_やand_で始まるプロパティと組み合わせて使用することができます。また、リンクしている親レコードの項目を指定することも可能です。下記の例では「分類A でリンクした サイトID 10 のレコードの タイトル と、分類B の値が一致する」または「分類A でリンクしてた サイトID 10 のレコードの 数値A の値と、数値A の値が一致する」レコードのみを抽出して表示します。

1
2
3
4
let data = {}
data.eq_Filter1 = 'ClassA~10,Title|ClassB';
data.eq_Filter2 = 'ClassA~10,NumA|NumA';
view.Filters.or_MyFilter = JSON.stringify(data);

サンプルコード

1. ユーザロールごとにフィルタ条件を制御する

以下のようなフィルタ条件を制御します。

ロール 権限
特権ユーザ すべてのレコードを参照可
管理職 所属組織のレコードを参照可
一般社員 自分担当のレコードのみ参照可

制御のため、以下のようにグループを用意し、ユーザを所属させます。

ロール 特権ユーザグループ 管理職グループ
特権ユーザ 所属
管理職 所属
一般社員

なお、本サンプルコードでは、特権ユーザグループ:GroupId=5、管理職グループ:GroupId=4として定義しています。

また、所属組織の担当レコードであることを判別するため、ClassAに組織を選択できるように設定しておきます。

その上で、以下のように制御します。

  • 管理職:自分の組織ID=ClassAを対象
  • 一般社員:自分のユーザID=Ownerを対象

実務での使いどころ

営業案件や顧客台帳で、一般社員は自分の担当、管理職は自部署、管理部門は全件というように、一覧に出すレコードを役割で分けたいときに使えます。一覧を開くたびにサーバスクリプトが条件を付けるので、ビューを人に選んでもらう運用より確実です。レコードを開くこと自体を制限するには、アクセス制御と組み合わせてください。

JavaScript

条件:ビュー処理時

// グループIDを定義
const ADMIN_GROUP_ID = 5;
const MANAGE_GROUP_ID = 4;
// ユーザが特定のグループに所属しているか判定
function isUserInGroup(userId, groupId) {
    const group = groups.Get(groupId);
    if (!group) return false;
    for (const member of group.GetMembers()) {
        if (member.UserId === userId) return true;
    }
    return false;
}
// フィルタ適用ルールを定義
const rules = [
    {
        name: '特権ユーザグループ',
        when: () => isUserInGroup(context.UserId, ADMIN_GROUP_ID),
        apply: () => view.ClearFilters(),
    },
    {
        name: '管理職グループ',
        when: () => isUserInGroup(context.UserId, MANAGE_GROUP_ID),
        apply: () => {
            const user = users.Get(context.UserId);
            view.Filters.ClassA = `["${user.DeptId}"]`;
        },
    },
    {
        name: '一般社員',
        when: () => true,
        apply: () => {
            view.Filters.Owner = `["${context.UserId}"]`;
        },
    },
];
// ルールを順番に評価し、最初に該当したルールを適用
for (const rule of rules) {
    if (rule.when()) {
        logs.LogInfo(rule.name);
        rule.apply();
        break;
    }
}
2. 担当者か関係者に自分が入っているレコードに絞って一覧に出す

一覧を開いたとき、担当者か、関係者(分類B)のどちらかに自分が入っているレコードに絞って表示します。view.Filters.or_任意の名前に2つの条件を入れ、「または」でつなぎます。

実務での使いどころ

案件や問い合わせを複数人で受け持つとき、主担当の案件に限らず、サブ担当・レビュー担当として関わる案件も、一覧を開いてすぐ確認したい場面に使えます。一覧のフィルタで担当者を「自分」にすると、関係者として入った案件が漏れます。また、分類項目で複数選択を有効にしていると、フィルタの「自分」は使えません。

事前準備

1:「案件管理」テーブルで、以下の項目を有効化してください。

項目コード 内容
担当者(Owner) 主担当
分類B(ClassB) 関係者。選択肢一覧に[[Users]]を設定し、「複数選択」を有効にする

2:スクリプトを登録します。

2-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 2-2:タイトル: 任意の名前(例:showMyRecordsOwnerOrMember)
 2-3:スクリプト: 下記サンプルコードを貼り付け
 2-4:条件: 「ビュー処理時」にチェック

JavaScript

条件:ビュー処理時

// 担当者の項目と、関係者を入れる分類項目(選択肢一覧に [[Users]]、複数選択)
const OWNER_COLUMN = 'Owner';
const MEMBER_COLUMN = 'ClassB';

// 画面のフィルタで同じ項目を操作したときの条件と混ざらないよう、先に空にする
view.Filters[OWNER_COLUMN] = '';
view.Filters[MEMBER_COLUMN] = '';

// ログインしている人のユーザーID(文字列の配列にする)
const me = JSON.stringify([String(context.UserId)]);

// 担当者が自分「または」関係者に自分が入っている
// or_ で始まる名前に入れた条件は「または」でつながる(関係者に自分のほかの人が入っていても対象になる)
const condition = {};
condition[OWNER_COLUMN] = me;
condition[MEMBER_COLUMN] = me;
view.Filters.or_MyRecords = JSON.stringify(condition);

注記

  • 関係者には、自分のほかの人が入っていても表示します。
  • APIでレコードを取得したときも、同じ条件で絞り込まれます。
  • 横断検索には効きません。見えてはいけないレコードを隠すには、アクセス制御を使ってください。

対応バージョン

対応バージョン 内容
1.1.14.0 以降 OR条件によるフィルタ機能の追加

関連情報


  1. ただし、2つの項目にはデータタイプの異なる項目は指定できません。各項目のデータタイプは 項目名とデータベース上のカラム名の対応の一覧に記載されています。 ↩

  2. ただし、2つの項目にはデータタイプの異なる項目は指定できません。各項目のデータタイプは 項目名とデータベース上のカラム名の対応の一覧に記載されています。 ↩