フィルタ

フィルタを使用すると、スプレッドシートを表示するときに表示されるデータの並べ替えやフィルタリングを行うことができます。フィルタによってスプレッドシートのデータ値が変更されることはありません。フィルタを使用して、情報を一時的に非表示にしたり、並べ替えたりできます。フィルタがオンになっていると、指定したフィルタ条件に一致するデータは表示されません。フィルタ表示を使用すると、さまざまな名前のフィルタを保存して、いつでも切り替えることができます。

フィルタのユースケースの例を次に示します。

  • 特定の列を基準にデータを並べ替えます。たとえば、ユーザー レコードを姓で並べ替えます。
  • 特定の条件を満たすデータを非表示にします。たとえば、2 年以上前のレコードをすべて非表示にします。
  • 特定の値に一致するデータを非表示にします。たとえば、ステータスが「クローズ」の問題をすべて非表示にします。

基本フィルタ

スプレッドシートの BasicFilter は、すべてのユーザーがスプレッドシートを表示するたびに適用されるデフォルトのフィルタです。スプレッドシートには、シートごとに 1 つの基本フィルタを設定できます。基本フィルタをオフにすると、オフにできます。フィルタとフィルタの設定がすべてスプレッドシートから削除されます。 同じフィルタを再度オンにする場合は、条件を再度設定する必要があります。

基本フィルタを管理する

基本フィルタを設定またはクリアするには、適切なリクエスト タイプで spreadsheets.batchUpdate メソッドを使用します。

基本フィルタを一覧表示するには、spreadsheets.get メソッドを使用して fields URL パラメータを sheets/basicFilter に設定します。次の spreadsheets.get コードサンプルは、フィールド マスクを使用した Google スプレッドシートの URL を示しています。

GET https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?fields=sheets/basicFilter)

フィルタ表示

FilterView は名前付きフィルタであり、いつでもオンとオフを切り替えられます。スプレッドシートには複数のフィルタ表示を設定できますが、一度に適用できるフィルタ表示は 1 つのみです。

フィルタ表示の使用例を次に示します。

  • データを表示するときに切り替えたいフィルタがいくつかあります。
  • スプレッドシートに対する編集権限がないが、フィルタを適用したい。この場合は、自分だけに表示される一時的なフィルタ表示を作成できます。
  • スプレッドシートを共有するユーザーごとに、異なる方法でデータを表示する必要があります。適用するフィルタ表示を指定するには、スプレッドシートの URL で spreadsheetIdfilterViewId を指定します。これを行うには、フィルタ表示の作成時にレスポンスで返された filterViewId を使用します。

    次のコードサンプルは、フィルタ表示を含む Google スプレッドシートの URL を示しています。

    https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0&fvid=FILTER_VIEW_ID

フィルタ表示を管理

フィルタ表示を作成、複製、変更、削除するには、適切なリクエスト タイプを指定して spreadsheets.batchUpdate メソッドを使用します。

すべてのフィルタビューを一覧表示するには、spreadsheets.get メソッドを使用して fields URL パラメータを sheets/filterViews に設定します。次の spreadsheets.get コードサンプルは、フィールド マスクを使用した Google スプレッドシートの URL を示しています。

GET https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?fields=sheets/filterViews)

フィルタ表現

次のコードサンプルは、FilterView オブジェクトの JSON 表現を示しています。BasicFilter オブジェクトは同じですが、filterViewId フィールドと title フィールドがなく、名前付き範囲を使用できない点が異なります。

{
  "filterViewId": number,
  "title": string,
  "range": {
    object(GridRange)
  },
  "namedRangeId": string,
  "sortSpecs": [
    {
      object(SortSpec)
    }
  ],
  "criteria": {
    string: {
      object(FilterCriteria)
    },
    ...
  }
}

データの例

このドキュメントの残りの部分では、以下の販売データ表の例を参照します。

表 1. 販売データの例
A B C D E F 1 階
1 アイテムのカテゴリ モデル番号 費用 数量 諸国 営業担当者 発送日
2 観覧車 W-24 20.50 ドル 4 西 ベス 2016 年 3 月 1 日
3 ドア D-01X $15.00 2 アミル 2016 年 3 月 15 日
4 フレーム FR-0B1 $34.00 8 ハンナ 2016 年 3 月 12 日
5 パネル P-034 $6.00 4 デビン 2016 年 3 月 15 日
6 パネル P-052 11.50 ドル 7 エリック 2016 年 5 月 16 日
7 観覧車 W-24 20.50 ドル 11 Sheldon 2016 年 4 月 30 日
8 エンジン ENG-0161 330.00 ドル 2 ジェシー 2016 年 7 月 2 日

並べ替えの仕様

フィルタには複数の並べ替え指定を含めることができます。これらの仕様によってデータの並べ替え方法が決まり、指定された順序で適用されます。SortSpec.dimensionIndex 属性は、並べ替えを適用する列インデックスを指定します。

次のコードサンプルは、並べ替えの指定を示しています。

[
  {
    "dimensionIndex": 3,
    "sortOrder": "ASCENDING"
  },
  {
    "dimensionIndex": 6,
    "sortOrder": "ASCENDING"
  }
]

販売データの例にこの仕様を適用すると、この仕様はまず「数量」で並べ替え、次に 2 行が同じ数量の場合は「発送日」で並べ替えます。

表 2. 2 列で並べ替えられた販売データ
A B C D E F 1 階
1 アイテムのカテゴリ モデル番号 費用 数量 諸国 営業担当者 発送日
2 ドア D-01X $15.00 2 アミル 2016 年 3 月 15 日
3 エンジン ENG-0161 330.00 ドル 2 ジェシー 2016 年 7 月 2 日
4 観覧車 W-24 20.50 ドル 4 西 ベス 2016 年 3 月 1 日
5 パネル P-034 $6.00 4 デビン 2016 年 3 月 15 日
6 パネル P-052 11.50 ドル 7 エリック 2016 年 5 月 16 日
7 フレーム FR-0B1 $34.00 8 ハンナ 2016 年 3 月 12 日
8 観覧車 W-24 20.50 ドル 11 Sheldon 2016 年 4 月 30 日

フィルタ条件

FilterCriteria メソッドは、基本フィルタまたはフィルタ表示で表示または非表示にするスプレッドシート データを決定します。各条件は、特定の列の値に依存します。フィルタ条件は、キーが列インデックス、値が条件であるマップとして指定します。

ブール値 condition を使用して指定された条件の場合、値を表示するには条件を True にする必要があります。この条件は hiddenValues をオーバーライドしません。値が hiddenValues の下にリストされている場合、その値との一致はすべて非表示になります。

次のコードサンプルは、フィルタ条件マップを示しています。

{
  0: {
    'hiddenValues': ['Panel']
  },
  6: {
    'condition': {
      'type': 'DATE_BEFORE',
      'values': {
        'userEnteredValue': '4/30/2016'
      }
    }
  }
}

販売データの例にこの条件を適用すると、[Item Category] が [Panel] ではなく、[Ship Date] が 2016 年 4 月 30 日より前の行のみが表示されます。

表 3. フィルタ条件を使用した販売データ
A B C D E F 1 階
1 アイテムのカテゴリ モデル番号 費用 数量 諸国 営業担当者 発送日
2 観覧車 W-24 20.50 ドル 4 西 ベス 2016 年 3 月 1 日
3 ドア D-01X $15.00 2 アミル 2016 年 3 月 15 日
4 フレーム FR-0B1 $34.00 8 ハンナ 2016 年 3 月 12 日

サンプル

次のコードサンプルは、フィルタビューを作成して複製し、上記の販売データの例を使用して複製したバージョンを更新する方法を示しています。

Python

sheets/snippets/sheets_filter_views.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def filter_views(spreadsheet_id):
  """
  Creates the batch_update the user has access to.
  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()
  # pylint: disable=maybe-no-member
  try:
    service = build("sheets", "v4", credentials=creds)

    my_range = {
        "sheetId": 0,
        "startRowIndex": 0,
        "startColumnIndex": 0,
    }
    addfilterviewrequest = {
        "addFilterView": {
            "filter": {
                "title": "Sample Filter",
                "range": my_range,
                "sortSpecs": [{
                    "dimensionIndex": 3,
                    "sortOrder": "DESCENDING",
                }],
                "criteria": {
                    0: {"hiddenValues": ["Panel"]},
                    6: {
                        "condition": {
                            "type": "DATE_BEFORE",
                            "values": {"userEnteredValue": "4/30/2016"},
                        }
                    },
                },
            }
        }
    }

    body = {"requests": [addfilterviewrequest]}
    addfilterviewresponse = (
        service.spreadsheets()
        .batchUpdate(spreadsheetId=spreadsheet_id, body=body)
        .execute()
    )

    duplicatefilterviewrequest = {
        "duplicateFilterView": {
            "filterId": addfilterviewresponse["replies"][0]["addFilterView"][
                "filter"
            ]["filterViewId"]
        }
    }

    body = {"requests": [duplicatefilterviewrequest]}
    duplicatefilterviewresponse = (
        service.spreadsheets()
        .batchUpdate(spreadsheetId=spreadsheet_id, body=body)
        .execute()
    )

    updatefilterviewrequest = {
        "updateFilterView": {
            "filter": {
                "filterViewId": duplicatefilterviewresponse["replies"][0][
                    "duplicateFilterView"
                ]["filter"]["filterViewId"],
                "title": "Updated Filter",
                "criteria": {
                    0: {},
                    3: {
                        "condition": {
                            "type": "NUMBER_GREATER",
                            "values": {"userEnteredValue": "5"},
                        }
                    },
                },
            },
            "fields": {"paths": ["criteria", "title"]},
        }
    }

    body = {"requests": [updatefilterviewrequest]}
    updatefilterviewresponse = (
        service.spreadsheets()
        .batchUpdate(spreadsheetId=spreadsheet_id, body=body)
        .execute()
    )
    print(str(updatefilterviewresponse))
  except HttpError as error:
    print(f"An error occurred: {error}")


if __name__ == "__main__":
  # Pass: spreadsheet_id
  filter_views("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k")