# フィルター

- Human documentation: [https://docs.univer.ai/ja-JP/guides/sheets/features/filter](https://docs.univer.ai/ja-JP/guides/sheets/features/filter)

- Agent Markdown: [https://docs.univer.ai/ja-JP/guides/sheets/features/filter.md](https://docs.univer.ai/ja-JP/guides/sheets/features/filter.md)

- Requested language: `ja-JP`

- Content language: `ja-JP`

- Documentation version: `1.1.0`

- Source: [sheets/features/filter.ja-JP.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/sheets/features/filter.ja-JP.mdx)

---

#### Package metadata

```json
{
  "preset": [
    {
      "client": "@univerjs/preset-sheets-filter",
      "locale": "@univerjs/preset-sheets-filter/locales/ja-JP",
      "style": "@univerjs/preset-sheets-filter/lib/index.css"
    }
  ],
  "plugins": [
    {
      "client": "@univerjs/sheets-filter",
      "facade": "@univerjs/sheets-filter/facade",
      "locale": "@univerjs/sheets-filter/locale/ja-JP"
    },
    {
      "client": "@univerjs/sheets-filter-ui",
      "locale": "@univerjs/sheets-filter-ui/locale/ja-JP",
      "style": "@univerjs/sheets-filter-ui/lib/index.css"
    }
  ],
  "mobile": true,
  "headless": true,
  "license": false,
  "server": false
}
```

フィルター機能は、スプレッドシート内のデータを条件で絞り込み、特定の情報を迅速に検索・分析するためのものです。多様なフィルター条件や操作をサポートし、データ処理の効率化に寄与します。



## プラグインモード

### インストール

#### npm

```bash
npm install @univerjs/sheets-filter @univerjs/sheets-filter-ui
```

#### pnpm

```bash
pnpm add @univerjs/sheets-filter @univerjs/sheets-filter-ui
```

#### yarn

```bash
yarn add @univerjs/sheets-filter @univerjs/sheets-filter-ui
```

#### bun

```bash
bun add @univerjs/sheets-filter @univerjs/sheets-filter-ui
```

### 使い方

```typescript
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'
import { UniverSheetsFilterPlugin } from '@univerjs/sheets-filter' // [!code ++]
import { UniverSheetsFilterUIPlugin } from '@univerjs/sheets-filter-ui' // [!code ++]
import SheetsFilterUIJaJP from '@univerjs/sheets-filter-ui/locale/ja-JP' // [!code ++]
import '@univerjs/sheets-filter-ui/lib/index.css' // [!code ++]
import '@univerjs/sheets-filter/facade' // [!code ++]

const univer = new Univer({
  locale: LocaleType.JA_JP,
  locales: {
    [LocaleType.JA_JP]: mergeLocales(
      SheetsFilterUIJaJP, // [!code ++]
    ),
  },
})

univer.registerPlugin(UniverSheetsFilterPlugin) // [!code ++]
univer.registerPlugin(UniverSheetsFilterUIPlugin) // [!code ++]
```

### プラグインと設定

```typescript
interface IUniverSheetsFilterConfig {
  /**
   * フィルターパネルにフィルター同期スイッチを表示するかどうか。
   * この設定は、コラボレーションシナリオで使用され、ユーザーがフィルターの同期を有効にするかどうかを選択できるようにします。
   * defaultValue オブジェクトに設定されている場合、フィルター同期スイッチが表示され、その初期状態は defaultValue プロパティによって決定されます。
   * @default false
   */
  enableSyncSwitch?: boolean | { defaultValue: boolean }
}
```

## モバイル対応

まず[モバイルエディター](https://docs.univer.ai/ja-JP/guides/sheets/getting-started/installation.md#mobile-support)を設定します。このページのプラグインモードの初期化コードで、以下のデスクトップ登録を同じパッケージのモバイル版に置き換え、**文書を開く前に**完了してください。モデル、スタイル、言語ファイル、Facade は維持し、両方を同時に登録しないでください。

| パッケージ                        | デスクトップの登録                    | モバイルの登録                            |
| ---------------------------- | ---------------------------- | ---------------------------------- |
| `@univerjs/sheets-filter-ui` | `UniverSheetsFilterUIPlugin` | `UniverSheetsFilterMobileUIPlugin` |

## プリセットモード

### インストール

#### npm

```bash
npm install @univerjs/preset-sheets-filter
```

#### pnpm

```bash
pnpm add @univerjs/preset-sheets-filter
```

#### yarn

```bash
yarn add @univerjs/preset-sheets-filter
```

#### bun

```bash
bun add @univerjs/preset-sheets-filter
```

### 使い方

```typescript
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreJaJP from '@univerjs/preset-sheets-core/locales/ja-JP'
import { UniverSheetsFilterPreset } from '@univerjs/preset-sheets-filter' // [!code ++]
import UniverPresetSheetsFilterJaJP from '@univerjs/preset-sheets-filter/locales/ja-JP' // [!code ++]
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
import '@univerjs/preset-sheets-core/lib/index.css'
import '@univerjs/preset-sheets-filter/lib/index.css' // [!code ++]

const { univerAPI } = createUniver({
  locale: LocaleType.JA_JP,
  locales: {
    [LocaleType.JA_JP]: mergeLocales(
      UniverPresetSheetsCoreJaJP,
      UniverPresetSheetsFilterJaJP, // [!code ++]
    ),
  },
  presets: [
    UniverSheetsCorePreset(),
    UniverSheetsFilterPreset(), // [!code ++]
  ],
})
```

### プリセットと設定

```typescript
interface IUniverSheetsFilterPresetConfig {
  /**
   * フィルターパネルにフィルター同期スイッチを表示するかどうか。
   * この設定は、コラボレーションシナリオで使用され、ユーザーがフィルターの同期を有効にするかどうかを選択できるようにします。
   * defaultValue オブジェクトに設定されている場合、フィルター同期スイッチが表示され、その初期状態は defaultValue プロパティによって決定されます。
   * @default false
   */
  enableSyncSwitch?: boolean | { defaultValue: boolean }
}
```

## Facade API

Facade API の完全な型定義は [FacadeAPI](https://docs.univer.ai/ja-JP/reference/facade.md) で参照できます。

### インポート

> [!INFO: プラグインモード注意]
> Facade パッケージの手動 import が必要なのはプラグインモードのみです。プリセットモードには対応する Facade パッケージが内蔵されているため、追加の import は不要です。

```typescript
import '@univerjs/sheets-filter/facade'
```

### フィルターの取得

[`FFilter`](https://docs.univer.ai/ja-JP/reference/facade/filter.md) オブジェクトを返します。シートにフィルターが存在しない場合は `null` を返します。

* `FWorksheet` オブジェクトでは [`getFilter()`](https://docs.univer.ai/ja-JP/reference/facade/worksheet.md#getfilter) を使用
* `FRange` オブジェクトでは [`getFilter()`](https://docs.univer.ai/ja-JP/reference/facade/range.md#getfilter) を使用

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()

// FWorksheet からフィルターを取得
const fWorksheet = fWorkbook.getActiveSheet()
const fFilter = fWorksheet.getFilter()
fFilter?.getRange().getA1Notation()

// FRange からフィルターを取得
const fRange = fWorksheet.getRange('A1:D14')
const fFilter2 = fRange.getFilter()
fFilter2?.getRange().getA1Notation()
```

### フィルターの作成

[`FFilter`](https://docs.univer.ai/ja-JP/reference/facade/filter.md) オブジェクトを新規作成します。シートに既にフィルターが存在する場合は `null` を返します。

* `FRange` オブジェクト上で [`createFilter()`](https://docs.univer.ai/ja-JP/reference/facade/range.md#createfilter) を使用

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const fRange = fWorksheet.getRange('A1:D14')
let fFilter = fRange.createFilter()

// 既にフィルターがある場合はいったん削除して再作成
if (!fFilter) {
  fWorksheet.getFilter().remove()
  fFilter = fRange.createFilter()
}
fFilter.getRange().getA1Notation()
```

### フィルターの削除

[`FFilter.remove()`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#remove) メソッドはフィルターを削除します。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
fWorksheet.getFilter()?.remove()
```

### 列フィルター条件の取得

[`FFilter.getColumnFilterCriteria(column)`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#getcolumnfiltercriteria) は指定した列のフィルター条件を返します。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 範囲 C1:F10 に値を設定
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// フィルター作成
let fFilter = fRange.createFilter()

// 既にあるなら削除して再作成
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 列 C の条件を設定（1,5,9 以外を除外）
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 列 C と D の条件を取得
fFilter.getColumnFilterCriteria(column) // { colId: 0, filters: { filters: ['1', '5', '9'] } }
fFilter.getColumnFilterCriteria(column + 1) // undefined
```

### 列フィルター条件の設定

[`FFilter.setColumnFilterCriteria(column, criteria)`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#setcolumnfiltercriteria) は指定列のフィルター条件を設定します。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 範囲 C1:F10 に値を設定
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// フィルター作成
let fFilter = fRange.createFilter()

// 既にあるなら削除して再作成
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 列 C の条件を設定（1,5,9 以外を除外）
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})
```

### 列フィルター条件の削除

* [`FFilter.removeColumnFilterCriteria(column)`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#removecolumnfiltercriteria) は指定列のフィルター条件を削除します。
* [`FFilter.removeFilterCriteria()`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#removefiltercriteria) はすべての列のフィルター条件を削除します。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 範囲 C1:F10 に値を設定
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// フィルター作成
let fFilter = fRange.createFilter()

// 既にあるなら削除して再作成
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 列 C の条件を設定（1,5,9 以外を除外）
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 3 秒後に列 C の条件をクリア
setTimeout(() => {
  fFilter.removeColumnFilterCriteria(column)
  // すべての列条件を削除する場合: fFilter.removeFilterCriteria()
}, 3000)
```

### 除外された行の取得

[`FFilter.getFilteredOutRows()`](https://docs.univer.ai/ja-JP/reference/facade/filter.md#getfilteredoutrows) はフィルターにより非表示（除外）された行インデックスの配列を返します。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 範囲 C1:F10 に値を設定
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// フィルター作成
let fFilter = fRange.createFilter()

// 既にあるなら削除して再作成
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 列 C の条件を設定（1,5,9 以外を除外）
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 除外された行を出力
fFilter.getFilteredOutRows() // [1, 2, 3, 5, 6, 7, 9]
```

### イベントリスナー

完全なイベント型定義は [Events](https://docs.univer.ai/ja-JP/reference/facade/events.md) を参照してください。

`SheetRangeFiltered` イベントは列フィルター条件が変更されたときにトリガーされます。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFiltered, (params) => {
  const { workbook, worksheet, col, criteria } = params
})

// `disposable.dispose()` を使用してイベントリスナーを削除
```

`SheetBeforeRangeFilter` イベントは列フィルター条件が変更される前にトリガーされます。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilter, (params) => {
  const { workbook, worksheet, col, criteria } = params

  // 条件変更処理をキャンセル
  params.cancel = true
})

// `disposable.dispose()` を使用してイベントリスナーを削除
```

`SheetRangeFilterCleared` イベントはフィルター条件がクリアされたときにトリガーされます。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFilterCleared, (params) => {
  const { workbook, worksheet } = params
})

// `disposable.dispose()` を使用してイベントリスナーを削除
```

`SheetBeforeRangeFilterClear` イベントはフィルター条件がクリアされる前にトリガーされます。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilterClear, (params) => {
  const { workbook, worksheet } = params

  // クリア処理をキャンセル
  params.cancel = true
})

// `disposable.dispose()` を使用してイベントリスナーを削除
```
