ניהול חשיפת הנתונים באמצעות מסננים

במאמר הזה מוסבר איך להשתמש במסננים כדי למיין ולסנן את הנתונים שמוצגים בגיליון אלקטרוני.

המסננים מאפשרים למיין ולסנן את הנתונים שמוצגים כשמציגים גיליון אלקטרוני. המסננים לא משנים את ערכי הנתונים בגיליון האלקטרוני. אפשר להשתמש במסננים כדי להסתיר או למיין מידע באופן זמני. נתונים שתואמים לקריטריוני הסינון שצוינו לא מופיעים כשהמסנן מופעל. בעזרת תצוגות מסוננות, אתם יכולים גם לשמור מסננים שונים עם שמות ולעבור ביניהם מתי שתרצו.

כדי לסנן נתונים שמוחזרים בבקשת Google Sheets API, משתמשים באובייקט DataFilter. מידע נוסף מופיע במאמר בנושא קריאה, כתיבה וחיפוש של מטא-נתונים.

תרחישי שימוש לסינון

הנה כמה תרחישי שימוש לדוגמה במסננים:

  • למיין את הנתונים לפי עמודה מסוימת. לדוגמה, אפשר למיין את רשומות המשתמשים לפי שם משפחה.
  • הסתרת נתונים שעומדים בתנאי ספציפי. לדוגמה, להסתיר את כל הרשומות מלפני שנתיים.
  • הסתרת נתונים שתואמים לערך מסוים. לדוגמה, להסתיר את כל הבעיות עם הסטטוס 'סגור'.

מסנן בסיסי

האובייקט BasicFilter של גיליון אלקטרוני הוא מסנן ברירת המחדל שמוחל בכל פעם שמישהו צופה בגיליון האלקטרוני. בכל גיליון יכול להיות רק מסנן בסיסי אחד. כדי להשבית את המסנן הבסיסי, צריך לבטל את הסימון שלו. הפעולה הזו מסירה את המסנן ואת כל ההגדרות שלו מהגיליון האלקטרוני. אם רוצים להפעיל מחדש את אותו מסנן, צריך להגדיר מחדש את הקריטריונים.

ניהול המסנן הבסיסי

כדי להגדיר או לבטל את הסינון הבסיסי, משתמשים בשיטה spreadsheets.batchUpdate עם סוג הבקשה המתאים:

כדי להציג את המסנן הבסיסי, משתמשים בשיטה spreadsheets.get ומגדירים את הפרמטר fields של כתובת ה-URL לערך sheets/basicFilter. בדוגמת הקוד הבאה, spreadsheets.getמוצגת כתובת URL של Google Sheets עם field mask:

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

תצוגות מסנן

FilterView הוא מסנן עם שם שאפשר להשבית ולהפעיל מתי שרוצים. בגיליון יכולות להיות כמה תצוגות מסוננות שמורות, אבל אפשר להחיל רק אחת בכל פעם. גיליון יכול להכיל גם מסנן בסיסי וגם כמה תצוגות סינון, אבל אי אפשר להחיל את שניהם בו-זמנית על אותו טווח נתונים.

תרחישי שימוש בתצוגות מסוננות

הנה כמה תרחישי שימוש לדוגמה בתצוגות סינון:

  • יש לכם כמה מסננים שונים שאתם רוצים לעבור ביניהם כשאתם צופים בנתונים.
  • להחיל מסנן על גיליון אלקטרוני שאין לכם גישת עריכה אליו. במקרה כזה, אפשר ליצור תצוגת מסנן זמנית שרק אתם יכולים לראות.
  • אתם רוצים שכל אדם שאיתו אתם משתפים את הגיליון האלקטרוני יראה את הנתונים בצורה שונה. כדי לציין את התצוגה המסוננת שרוצים להחיל, צריך לספק את spreadsheetId ואת filterViewId בכתובת ה-URL של הגיליון האלקטרוני. כדי לעשות את זה, משתמשים ב-filterViewId שמוחזר בתגובה כשיוצרים את תצוגת הסינון.

    בדוגמת הקוד הבאה מוצגת כתובת URL של Sheets עם תצוגת סינון:

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

ניהול תצוגות מסוננות

כדי ליצור, לשכפל, לשנות או למחוק תצוגות מסוננות, משתמשים בשיטה spreadsheets.batchUpdate עם סוג הבקשה המתאים:

כדי להציג רשימה של כל התצוגות המפורטות עם מסננים, משתמשים בשיטה spreadsheets.get ומגדירים את פרמטר כתובת ה-URL‏ fields לערך sheets/filterViews. בדוגמה הבאה של קוד spreadsheets.get מוצגת כתובת URL של Sheets עם מסכת שדות:

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

ייצוג של מסנן ב-JSON

בדוגמת הקוד הבאה מוצג ייצוג JSON של אובייקט FilterView. אובייקט 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 G
1 קטגוריית פריט מספר הדגם עלות כמות אזור אנשי מכירות תאריך משלוח
2 גלגל ענק W-24 $20.50 4 מערב Beth 01/03/2016
3 דלת D-01X $15.00 2 דרום Amir 15/03/2016
4 מסגרת FR-0B1 $34.00 8 מזרח חנה 12/03/2016
5 חלונית P-034 24.00 ש"ח 4 צפון Devyn 15/03/2016
6 חלונית P-052 ‫11.50$ 7 מזרח Erik 16/05/2016
7 גלגל ענק W-24 $20.50 11 דרום Sheldon 30/04/2016
8 מנוע ENG-0161 $330.00 2 צפון Jessie 02/07/2016

מיון מפרטים

מסנן יכול לכלול כמה הגדרות מיון. המפרטים האלה קובעים איך למיין את הנתונים, והם מוחלים לפי הסדר שצוין. המאפיין SortSpec.dimensionIndex מציין את אינדקס העמודה שאליה יחול המיון.

בדוגמת הקוד הבאה מוצגת הגדרת מיון:

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

כשמחילים את ההגדרה הזו על נתוני המכירות לדוגמה, המערכת ממיינת קודם לפי העמודה 'כמות', ואם בשתי שורות יש את אותה כמות, היא ממיינת לפי 'תאריך המשלוח'.

טבלה 2. נתוני מכירות ממוינים לפי שתי עמודות
A B C D E F G
1 קטגוריית פריט מספר הדגם עלות כמות אזור אנשי מכירות תאריך משלוח
2 דלת D-01X $15.00 2 דרום Amir 15/03/2016
3 מנוע ENG-0161 $330.00 2 צפון Jessie 02/07/2016
4 גלגל ענק W-24 $20.50 4 מערב Beth 01/03/2016
5 חלונית P-034 24.00 ש"ח 4 צפון Devyn 15/03/2016
6 חלונית P-052 ‫11.50$ 7 מזרח Erik 16/05/2016
7 מסגרת FR-0B1 $34.00 8 מזרח חנה 12/03/2016
8 גלגל ענק W-24 $20.50 11 דרום Sheldon 30/04/2016

קריטריוני סינון

אובייקט FilterCriteria קובע אילו נתונים מגיליון אלקטרוני יוצגו או יוסתרו במסנן בסיסי או בתצוגת מסנן. כל קריטריון תלוי בערכים בעמודה ספציפית. אתם מספקים את קריטריוני הסינון כמפה שבה המפתחות הם אינדקסים של עמודות והערכים הם הקריטריונים.

אם הקריטריונים מוגדרים באמצעות ערך בוליאני condition, התנאי חייב להיות true כדי שהערכים יוצגו. התנאי לא מבטל את hiddenValues. אם ערך מסוים מופיע ברשימה hiddenValues, כל ההתאמות של הערך הזה עדיין מוסתרות.

בדוגמת הקוד הבאה מוצגת מפת קריטריונים של מסנן:

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

כשמחילים את הקריטריונים האלה על נתוני המכירות לדוגמה, מוצגות רק השורות שבהן הערך בעמודה Item Category (קטגוריית פריט) הוא לא Panel (פאנל), והערך בעמודה Ship Date (תאריך משלוח) הוא לפני April 30, 2016 (30 באפריל 2016).

טבלה 3. נתוני מכירות באמצעות קריטריונים לסינון
A B C D E F G
1 קטגוריית פריט מספר הדגם עלות כמות אזור אנשי מכירות תאריך משלוח
2 גלגל ענק W-24 $20.50 4 מערב Beth 01/03/2016
3 דלת D-01X $15.00 2 דרום Amir 15/03/2016
4 מסגרת FR-0B1 $34.00 8 מזרח חנה 12/03/2016

סינון של דוגמת קוד לתצוגה

בדוגמת הקוד הבאה אפשר לראות איך יוצרים תצוגת מסנן, משכפלים אותה ואז מעדכנים את הגרסה המשוכפלת באמצעות נתוני המכירות לדוגמה.

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