Фильтры

Фильтры позволяют сортировать и фильтровать данные, отображаемые при просмотре электронной таблицы. Фильтры не изменяют значения данных в таблице. Вы можете использовать фильтры для временного скрытия или сортировки информации. Данные, соответствующие заданным критериям фильтра, не отображаются, пока фильтр включён. С помощью представлений фильтров вы также можете сохранять различные именованные фильтры и переключаться между ними в любое время.

Ниже приведены некоторые примеры использования фильтров:

  • Сортируйте данные по определённому столбцу. Например, сортируйте записи пользователей по фамилии.
  • Скрыть данные, соответствующие определённому условию. Например, скрыть все записи старше 2 лет.
  • Скрыть данные, соответствующие определённому значению. Например, скрыть все задачи со статусом «закрыто».

Базовый фильтр

BasicFilter для электронной таблицы — это фильтр по умолчанию, который применяется при каждом просмотре таблицы. На каждом листе таблицы может быть один базовый фильтр. Вы можете отключить базовый фильтр, очистив его. Это удалит фильтр и все его настройки из таблицы. Чтобы снова включить тот же фильтр, необходимо заново задать критерии.

Управление базовым фильтром

Чтобы установить или очистить базовый фильтр, используйте метод spreadsheets.batchUpdate с соответствующим типом запроса:

  • Для установки базового фильтра используйте метод SetBasicFilterRequest .
  • Чтобы очистить базовый фильтр, используйте метод ClearBasicFilterRequest .

Чтобы получить список базовых фильтров, используйте метод spreadsheets.get и задайте параметру URL fields значение sheets/basicFilter . Следующий пример кода spreadsheets.get показывает URL Google Таблиц с маской полей :

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

Фильтр просмотров

FilterView — это именованный фильтр, который можно включать и отключать в любое время. В электронной таблице может быть несколько представлений фильтров, но одновременно можно применять только одно из них.

Ниже приведены некоторые примеры использования представлений фильтров:

  • У вас есть несколько различных фильтров, между которыми вы хотите переключаться при просмотре данных.
  • У вас нет прав на редактирование таблицы, но вы всё равно хотите применить фильтр. В этом случае вы можете создать временное представление фильтра, которое будет видно только вам.
  • Вы хотите, чтобы каждый пользователь, с которым вы делитесь своей таблицей, видел данные по-разному. Вы можете указать нужный режим фильтрации, указав spreadsheetId и filterViewId в URL-адресе таблицы. Для этого используйте filterViewId возвращаемый в ответе при создании режима фильтрации.

    В следующем примере кода показан URL-адрес Google Таблиц с фильтром:

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

Управление представлениями фильтров

Чтобы создать, дублировать, изменить или удалить представления фильтров, используйте метод spreadsheets.batchUpdate с соответствующим типом запроса:

  • Для создания представления фильтра используйте метод AddFilterViewRequest .
  • Чтобы создать копию представления фильтра, используйте метод DuplicateFilterViewRequest .
  • Чтобы изменить свойства представления фильтра, используйте метод UpdateFilterViewRequest .
  • Чтобы удалить представление фильтра, используйте метод DeleteFilterViewRequest .

Чтобы получить список всех представлений фильтров, используйте метод spreadsheets.get и задайте параметру URL fields значение sheets/filterViews . В следующем примере кода spreadsheets.get показан URL Google Таблиц с маской полей :

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

Представление фильтра

В следующем примере кода показано JSON-представление объекта FilterView . Объект BasicFilter аналогичен, за исключением того, что в нём отсутствуют поля filterViewId и title , а также он не может использовать именованный диапазон.

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

Пример данных

Остальная часть документа ссылается на пример таблицы данных о продажах ниже:

Таблица 1. Пример данных о продажах
А Б С Д Э Ф Г
1 Категория товара Номер модели Расходы Количество Область Продавец Дата отправки
2 Колесо W-24 20,50 долларов 4 Запад Бет 01.03.2016
3 Дверь Д-01Х 15,00 долларов США 2 Юг Амир 15.03.2016
4 Рамка ФР-0Б1 34,00 доллара США 8 Восток Ханна 3/12/2016
5 Панель П-034 6,00 долларов 4 Север Девин 15.03.2016
6 Панель П-052 11,50 долларов США 7 Восток Эрик 16.05.2016
7 Колесо W-24 20,50 долларов 11 Юг Шелдон 30.04.2016
8 Двигатель ЕНГ-0161 330,00 долларов США 2 Север Джесси 02.07.2016

Характеристики сортировки

Фильтр может иметь несколько спецификаций сортировки. Эти спецификации определяют способ сортировки данных и применяются в указанном порядке. Атрибут SortSpec.dimensionIndex указывает индекс столбца, к которому должна применяться сортировка.

В следующем примере кода показана спецификация сортировки:

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

При применении к примеру данных о продажах эта спецификация сначала сортирует по «Количеству», а затем, если в двух строках количество одинаковое, по «Дате отгрузки».

Таблица 2. Данные о продажах, отсортированные по 2 столбцам
А Б С Д Э Ф Г
1 Категория товара Номер модели Расходы Количество Область Продавец Дата отправки
2 Дверь Д-01Х 15,00 долларов США 2 Юг Амир 15.03.2016
3 Двигатель ЕНГ-0161 330,00 долларов США 2 Север Джесси 02.07.2016
4 Колесо W-24 20,50 долларов 4 Запад Бет 01.03.2016
5 Панель П-034 6,00 долларов 4 Север Девин 15.03.2016
6 Панель П-052 11,50 долларов США 7 Восток Эрик 16.05.2016
7 Рамка ФР-0Б1 34,00 доллара США 8 Восток Ханна 3/12/2016
8 Колесо W-24 20,50 долларов 11 Юг Шелдон 30.04.2016

Критерии фильтра

Метод FilterCriteria определяет, какие данные таблицы отображаются или скрываются в базовом фильтре или представлении фильтра. Каждый критерий зависит от значений в определённом столбце. Критерии фильтра предоставляются в виде карты, где ключами являются индексы столбцов, а значениями — критерии.

Для критериев, заданных с помощью логического condition , для отображения значений это условие должно быть True . Это условие не переопределяет hiddenValues . Если значение указано в hiddenValues , все совпадения для него по-прежнему будут скрыты.

В следующем примере кода показана карта критериев фильтрации:

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

При применении к примеру данных о продажах этот критерий показывает только строки, в которых «Категория товара» не равна «Панель», а «Дата отправки» приходится на период до 30 апреля 2016 г.

Таблица 3. Данные о продажах с использованием критериев фильтрации
А Б С Д Э Ф Г
1 Категория товара Номер модели Расходы Количество Область Продавец Дата отправки
2 Колесо W-24 20,50 долларов 4 Запад Бет 01.03.2016
3 Дверь Д-01Х 15,00 долларов США 2 Юг Амир 15.03.2016
4 Рамка ФР-0Б1 34,00 доллара США 8 Восток Ханна 3/12/2016

Образец

В следующем примере кода показано, как создать представление фильтра, дублировать его, а затем обновить дублированную версию, используя приведенный выше пример данных о продажах .

Питон

листы/фрагменты/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")