Datensichtbarkeit mit Filtern verwalten

In diesem Dokument geht es darum, wie Sie Filter verwenden, um die in einer Tabelle angezeigten Daten zu sortieren und zu filtern.

Mit Filtern können Sie die Daten sortieren und filtern, die beim Aufrufen einer Tabelle angezeigt werden. Durch Filter werden die Datenwerte in Ihrer Tabelle nicht geändert. Mit Filtern können Sie Informationen vorübergehend ausblenden oder sortieren. Daten, die den angegebenen Filterkriterien entsprechen, werden nicht angezeigt, solange der Filter aktiv ist. Mit Filteransichten können Sie auch verschiedene benannte Filter speichern und jederzeit zwischen ihnen wechseln.

Wenn Sie die in einer Google Sheets API-Anfrage zurückgegebenen Daten filtern möchten, verwenden Sie das Objekt DataFilter. Weitere Informationen finden Sie unter Metadaten lesen, schreiben und durchsuchen.

Anwendungsfälle filtern

Hier einige Beispiele für Anwendungsfälle für Filter:

  • Daten nach einer bestimmten Spalte sortieren Sie können beispielsweise Nutzerdatensätze nach Nachname sortieren.
  • Daten ausblenden, die eine bestimmte Bedingung erfüllen. Sie können beispielsweise alle Einträge ausblenden, die älter als zwei Jahre sind.
  • Daten ausblenden, die einem bestimmten Wert entsprechen. Blenden Sie beispielsweise alle Probleme mit dem Status „Geschlossen“ aus.

Einfacher Filter

Das BasicFilter-Objekt für eine Tabelle ist der Standardfilter, der immer angewendet wird, wenn jemand die Tabelle aufruft. Eine Tabelle kann nur einen einfachen Filter pro Tabellenblatt haben. Sie können den einfachen Filter deaktivieren, indem Sie ihn entfernen. Dadurch werden der Filter und alle zugehörigen Einstellungen aus der Tabelle entfernt. Wenn Sie denselben Filter wieder aktivieren möchten, müssen Sie die Kriterien noch einmal festlegen.

Einfachen Filter verwalten

Verwenden Sie die Methode spreadsheets.batchUpdate mit dem entsprechenden Anfragetyp, um den einfachen Filter festzulegen oder zu löschen:

Wenn Sie den einfachen Filter auflisten möchten, verwenden Sie die Methode spreadsheets.get und setzen Sie den URL-Parameter fields auf sheets/basicFilter. Das folgende spreadsheets.get-Codebeispiel zeigt eine Google-Tabellen-URL mit einer Feldmaske:

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

Filteransichten

Ein FilterView ist ein benannter Filter, den Sie jederzeit aktivieren und deaktivieren können. In einem Tabellenblatt können mehrere Filteransichten gespeichert sein, Sie können aber jeweils nur eine anwenden. Ein Tabellenblatt kann sowohl einen einfachen Filter als auch mehrere Filteransichten enthalten. Sie können jedoch nicht beides gleichzeitig auf denselben Datenbereich anwenden.

Anwendungsfälle für Filteransichten

Hier einige Anwendungsbeispiele für Filteransichten:

  • Sie haben mehrere verschiedene Filter, zwischen denen Sie beim Ansehen der Daten wechseln möchten.
  • Sie haben keinen Bearbeitungszugriff auf eine Tabelle, möchten aber trotzdem einen Filter anwenden. In diesem Fall können Sie eine temporäre Filteransicht erstellen, die nur für Sie sichtbar ist.
  • Sie möchten, dass jede Person, mit der Sie Ihre Tabelle teilen, die Daten anders sieht. Sie können die anzuwendende Filteransicht angeben, indem Sie die spreadsheetId und filterViewId in der Tabellenkalkulations-URL angeben. Verwenden Sie dazu die filterViewId, die beim Erstellen der Filteransicht in der Antwort zurückgegeben wird.

    Das folgende Codebeispiel zeigt eine Google-Tabellen-URL mit einer Filteransicht:

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

Filteransichten verwalten

Wenn Sie Filteransichten erstellen, duplizieren, ändern oder löschen möchten, verwenden Sie die Methode spreadsheets.batchUpdate mit dem entsprechenden Anfragetyp:

Wenn Sie alle Ihre Filteransichten auflisten möchten, verwenden Sie die Methode spreadsheets.get und legen Sie den URL-Parameter fields auf sheets/filterViews fest. Das folgende spreadsheets.get-Codebeispiel zeigt eine Google-Tabellen-URL mit einer Feldmaske:

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

JSON-Darstellung eines Filters

Das folgende Codebeispiel zeigt die JSON-Darstellung eines FilterView-Objekts. Das Objekt BasicFilter ist dasselbe, nur dass die Felder filterViewId und title fehlen und kein benannter Bereich verwendet werden kann.

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

Beispielverkaufsdaten

Im Rest dieses Dokuments wird auf die folgende Beispielstabelle mit Verkaufsdaten verwiesen:

Tabelle 1 Beispiel für Verkaufsdaten
A B C D E F G
1 Artikelkategorie Modellnummer Kosten Menge Region Vertriebsmitarbeiter Versanddatum
2 Wheel Riesenrad W-24 20,50 $ 4 West Beth 01.03.2016
3 Tür D-01X 15,00 $ 2 Süd Amir 15.03.2016
4 Rahmen FR-0B1 34 $ 8 Ost Hannah 12.03.2016
5 Feld P-034 6,00 $ 4 Norden Devyn 15.03.2016
6 Feld P-052 11,50 $ 7 Ost Erik 16.05.2016
7 Wheel Riesenrad W-24 20,50 $ 11 Süd Sheldon 30.04.2016
8 Engine ENG-0161 330,00 $ 2 Norden Jessie 02.07.2016

Sortierspezifikationen

Ein Filter kann mehrere Sortierspezifikationen haben. Diese Spezifikationen bestimmen, wie die Daten sortiert werden, und werden in der angegebenen Reihenfolge angewendet. Das Attribut SortSpec.dimensionIndex gibt den Spaltenindex an, auf den die Sortierung angewendet werden soll.

Das folgende Codebeispiel zeigt eine Sortierspezifikation:

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

Bei Anwendung auf die Beispielverkaufsdaten wird zuerst nach der Spalte „Menge“ und dann, wenn zwei Zeilen dieselbe Menge haben, nach „Versanddatum“ sortiert.

Tabelle 2 Umsatzdaten nach zwei Spalten sortiert
A B C D E F G
1 Artikelkategorie Modellnummer Kosten Menge Region Vertriebsmitarbeiter Versanddatum
2 Tür D-01X 15,00 $ 2 Süd Amir 15.03.2016
3 Engine ENG-0161 330,00 $ 2 Norden Jessie 02.07.2016
4 Wheel Riesenrad W-24 20,50 $ 4 West Beth 01.03.2016
5 Feld P-034 6,00 $ 4 Norden Devyn 15.03.2016
6 Feld P-052 11,50 $ 7 Ost Erik 16.05.2016
7 Rahmen FR-0B1 34 $ 8 Ost Hannah 12.03.2016
8 Wheel Riesenrad W-24 20,50 $ 11 Süd Sheldon 30.04.2016

Filterkriterien

Mit dem Objekt FilterCriteria wird festgelegt, welche Tabellendaten in einem einfachen Filter oder einer Filteransicht ein- oder ausgeblendet werden. Jedes Kriterium hängt von den Werten in einer bestimmten Spalte ab. Sie geben die Filterkriterien als Zuordnung an, wobei die Schlüssel die Spaltenindexe und die Werte die Kriterien sind.

Bei Kriterien, die mit einem booleschen condition angegeben werden, muss die Bedingung true sein, damit Werte angezeigt werden. Die Bedingung überschreibt hiddenValues nicht. Wenn ein Wert unter hiddenValues aufgeführt ist, werden alle Übereinstimmungen für einen Wert weiterhin ausgeblendet.

Das folgende Codebeispiel zeigt eine Karte mit Filterkriterien:

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

Bei Anwendung auf die Beispielverkaufsdaten werden mit diesem Kriterium nur Zeilen angezeigt, in denen der Wert der Spalte „Artikelkategorie“ nicht „Panel“ ist und der Wert der Spalte „Versanddatum“ vor dem 30. April 2016 liegt.

Table 3 Verkaufsdaten mit Filterkriterien
A B C D E F G
1 Artikelkategorie Modellnummer Kosten Menge Region Vertriebsmitarbeiter Versanddatum
2 Wheel Riesenrad W-24 20,50 $ 4 West Beth 01.03.2016
3 Tür D-01X 15,00 $ 2 Süd Amir 15.03.2016
4 Rahmen FR-0B1 34 $ 8 Ost Hannah 12.03.2016

Codebeispiel für Filteransicht

Im folgenden Codebeispiel wird gezeigt, wie Sie eine Filteransicht erstellen, sie duplizieren und dann die duplizierte Version mit den Beispielverkaufsdaten aktualisieren.

Java

sheets/snippets/src/main/java/SheetsFilterViews.java
/*
 * Dependencies (Maven):
 * com.google.apis:google-api-services-sheets:v4-rev20220927-2.0.0
 * com.google.auth:google-auth-library-oauth2-http:1.19.0
 */

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.*;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.*;

public class SheetsFilterViews {

    public static void main(String... args) {
        filterViews("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k");
    }

    public static void filterViews(String spreadsheetId) {
        try {
            // Load pre-authorized user credentials from the environment.
            // TODO(developer) - See https://developers.google.com/identity for guides on implementing OAuth2.
            GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
                    .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS));

            Sheets service = new Sheets.Builder(
                    GoogleNetHttpTransport.newTrustedTransport(),
                    GsonFactory.getDefaultInstance(),
                    new HttpCredentialsAdapter(credentials))
                    .setApplicationName("Sheets Filter Views Sample")
                    .build();

            // --- Step 1: Add Filter View ---
            GridRange myRange = new GridRange()
                    .setSheetId(0)
                    .setStartRowIndex(0)
                    .setStartColumnIndex(0);

            // Construct Criteria for Column 0 (Hidden Values)
            FilterCriteria criteria0 = new FilterCriteria()
                    .setHiddenValues(Collections.singletonList("Panel"));

            // Construct Criteria for Column 6 (Date Condition)
            ConditionValue dateValue = new ConditionValue().setUserEnteredValue("4/30/2016");
            BooleanCondition dateCondition = new BooleanCondition()
                    .setType("DATE_BEFORE")
                    .setValues(Collections.singletonList(dateValue));
            FilterCriteria criteria6 = new FilterCriteria().setCondition(dateCondition);

            // Map criteria to column indices (Note: keys are Strings in Java map)
            Map<String, FilterCriteria> criteriaMap = new HashMap<>();
            criteriaMap.put("0", criteria0);
            criteriaMap.put("6", criteria6);

            FilterView filterView = new FilterView()
                    .setTitle("Sample Filter")
                    .setRange(myRange)
                    .setSortSpecs(Collections.singletonList(
                            new SortSpec().setDimensionIndex(3).setSortOrder("DESCENDING")
                    ))
                    .setCriteria(criteriaMap);

            // --- Step 1: Add Filter View ---
            // (Request construction remains the same)
            // ...
            AddFilterViewRequest addFilterViewRequest = new AddFilterViewRequest().setFilter(filterView);

            BatchUpdateSpreadsheetRequest batchRequest1 = new BatchUpdateSpreadsheetRequest()
                    .setRequests(Collections.singletonList(new Request().setAddFilterView(addFilterViewRequest)));

            BatchUpdateSpreadsheetResponse response1 = service.spreadsheets()
                    .batchUpdate(spreadsheetId, batchRequest1)
                    .execute();

            if (response1.getReplies() == null || response1.getReplies().isEmpty()) {
                System.err.println("Error: No replies returned from AddFilterView request.");
                return;
            }

            Response reply1 = response1.getReplies().get(0);
            if (reply1.getAddFilterView() == null || reply1.getAddFilterView().getFilter() == null) {
                 System.err.println("Error: Response did not contain AddFilterView data.");
                 return;
            }

            int filterId = reply1.getAddFilterView().getFilter().getFilterViewId();

            // --- Step 2: Duplicate Filter View ---
            DuplicateFilterViewRequest duplicateRequest = new DuplicateFilterViewRequest()
                    .setFilterId(filterId);

            BatchUpdateSpreadsheetRequest batchRequest2 = new BatchUpdateSpreadsheetRequest()
                    .setRequests(Collections.singletonList(new Request().setDuplicateFilterView(duplicateRequest)));

            BatchUpdateSpreadsheetResponse response2 = service.spreadsheets()
                    .batchUpdate(spreadsheetId, batchRequest2)
                    .execute();

            if (response2.getReplies() == null || response2.getReplies().isEmpty()) {
                 System.err.println("Error: No replies returned from DuplicateFilterView request.");
                 return;
            }

            Response reply2 = response2.getReplies().get(0);
            if (reply2.getDuplicateFilterView() == null || reply2.getDuplicateFilterView().getFilter() == null) {
                System.err.println("Error: Response did not contain DuplicateFilterView data.");
                return;
            }

            int newFilterId = reply2.getDuplicateFilterView().getFilter().getFilterViewId();

            // --- Step 3: Update Filter View ---
            // Extract the new ID from the duplicate response
            int newFilterId = response2.getReplies().get(0)
                    .getDuplicateFilterView().getFilter().getFilterViewId();

            // Create update criteria
            Map<String, FilterCriteria> updateCriteriaMap = new HashMap<>();
            updateCriteriaMap.put("0", new FilterCriteria()); // Empty criteria

            ConditionValue numValue = new ConditionValue().setUserEnteredValue("5");
            BooleanCondition numCondition = new BooleanCondition()
                    .setType("NUMBER_GREATER")
                    .setValues(Collections.singletonList(numValue));
            updateCriteriaMap.put("3", new FilterCriteria().setCondition(numCondition));

            FilterView updateFilterView = new FilterView()
                    .setFilterViewId(newFilterId)
                    .setTitle("Updated Filter")
                    .setCriteria(updateCriteriaMap);

            UpdateFilterViewRequest updateRequest = new UpdateFilterViewRequest()
                    .setFilter(updateFilterView)
                    .setFields("criteria,title");

            BatchUpdateSpreadsheetRequest batchRequest3 = new BatchUpdateSpreadsheetRequest()
                    .setRequests(Collections.singletonList(new Request().setUpdateFilterView(updateRequest)));

            BatchUpdateSpreadsheetResponse response3 = service.spreadsheets()
                    .batchUpdate(spreadsheetId, batchRequest3)
                    .execute();

            System.out.println(response3.toPrettyString());

        } catch (IOException | GeneralSecurityException e) {
            System.err.println("An error occurred: " + e);
        }
    }
}

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")