ফিল্টার ব্যবহার করে ডেটা দৃশ্যমানতা পরিচালনা করুন

এই ডকুমেন্টটি একটি স্প্রেডশিটে প্রদর্শিত ডেটা সাজাতে ও ফিল্টার করতে ফিল্টার ব্যবহারের বিষয়ে।

ফিল্টার আপনাকে একটি স্প্রেডশীট দেখার সময় প্রদর্শিত ডেটা সাজাতে এবং ফিল্টার করতে সাহায্য করে। ফিল্টার আপনার স্প্রেডশীটের ডেটার মান পরিবর্তন করে না। আপনি সাময়িকভাবে তথ্য লুকাতে বা সাজাতে ফিল্টার ব্যবহার করতে পারেন। ফিল্টার চালু থাকা অবস্থায়, নির্দিষ্ট ফিল্টার শর্তের সাথে মিলে যাওয়া ডেটা প্রদর্শিত হয় না। ফিল্টার ভিউ-এর মাধ্যমে, আপনি বিভিন্ন নামের ফিল্টার সংরক্ষণ করতে পারেন এবং যখন খুশি সেগুলোর মধ্যে পরিবর্তন করতে পারেন।

Google Sheets API অনুরোধে প্রাপ্ত ডেটা ফিল্টার করতে DataFilter অবজেক্টটি ব্যবহার করুন। আরও তথ্যের জন্য, “Read, write, and search metadata” দেখুন।

ফিল্টার ব্যবহারের ক্ষেত্র

ফিল্টার ব্যবহারের কিছু উদাহরণ নিচে দেওয়া হলো:

  • কোনো নির্দিষ্ট কলাম অনুযায়ী ডেটা সাজান। উদাহরণস্বরূপ, ব্যবহারকারীর রেকর্ডগুলো শেষ নাম অনুযায়ী সাজান।
  • নির্দিষ্ট শর্ত পূরণ করে এমন ডেটা লুকান। উদাহরণস্বরূপ, দুই বছরের বেশি পুরোনো সমস্ত রেকর্ড লুকান।
  • একটি নির্দিষ্ট মানের সাথে মেলে এমন ডেটা লুকান। উদাহরণস্বরূপ, 'closed' স্ট্যাটাসযুক্ত সমস্ত ইস্যু লুকান।

মৌলিক ফিল্টার

একটি স্প্রেডশীটের BasicFilter অবজেক্টটি হলো ডিফল্ট ফিল্টার, যা যে কেউ স্প্রেডশীটটি দেখার সময় প্রয়োগ করা হয়। একটি স্প্রেডশীটে প্রতি শীটে কেবল একটি বেসিক ফিল্টার থাকতে পারে। আপনি বেসিক ফিল্টারটি ক্লিয়ার করে বন্ধ করতে পারেন। এটি স্প্রেডশীট থেকে ফিল্টার এবং এর সমস্ত সেটিংস মুছে দেয়। আপনি যদি একই ফিল্টারটি আবার চালু করতে চান, তবে আপনাকে অবশ্যই ক্রাইটেরিয়া পুনরায় সেট করতে হবে।

বেসিক ফিল্টার পরিচালনা করুন

বেসিক ফিল্টার সেট বা ক্লিয়ার করতে, উপযুক্ত রিকোয়েস্ট টাইপ সহ spreadsheets.batchUpdate মেথডটি ব্যবহার করুন:

  • বেসিক ফিল্টার সেট করতে SetBasicFilterRequest মেথডটি ব্যবহার করুন।
  • বেসিক ফিল্টারটি বাতিল করতে ClearBasicFilterRequest মেথডটি ব্যবহার করুন।

বেসিক ফিল্টার তালিকাভুক্ত করতে, spreadsheets.get মেথডটি ব্যবহার করুন এবং fields URL প্যারামিটারটি sheets/basicFilter এ সেট করুন। নিম্নলিখিত spreadsheets.get কোড নমুনাটি একটি ফিল্ড মাস্ক সহ একটি গুগল শিটস URL দেখাচ্ছে:

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

ফিল্টার ভিউ

FilterView হলো একটি নামযুক্ত ফিল্টার যা আপনি নিজের ইচ্ছামতো চালু বা বন্ধ করতে পারেন। একটি শীটে একাধিক ফিল্টার ভিউ সংরক্ষণ করা থাকতে পারে, কিন্তু আপনি একবারে কেবল একটিই প্রয়োগ করতে পারবেন। একটি শীটে একটি সাধারণ ফিল্টার এবং একাধিক ফিল্টার ভিউ উভয়ই থাকতে পারে, কিন্তু আপনি একই ডেটা রেঞ্জে উভয়টি একসাথে প্রয়োগ করতে পারবেন না।

ফিল্টার ভিউ ব্যবহারের ক্ষেত্রসমূহ

ফিল্টার ভিউ ব্যবহারের কিছু উদাহরণ নিচে দেওয়া হলো:

  • ডেটা দেখার সময় আপনি বিভিন্ন ফিল্টারের মধ্যে পরিবর্তন করতে চান।
  • আপনার একটি স্প্রেডশিট সম্পাদনা করার অ্যাক্সেস নেই, কিন্তু আপনি তবুও একটি ফিল্টার প্রয়োগ করতে চান। এই ক্ষেত্রে, আপনি একটি অস্থায়ী ফিল্টার ভিউ তৈরি করতে পারেন যা শুধুমাত্র আপনার কাছেই দৃশ্যমান থাকবে।
  • আপনি চান যে আপনার স্প্রেডশীটটি যাদের সাথে শেয়ার করছেন, তাদের প্রত্যেকে যেন ডেটা ভিন্নভাবে দেখে। স্প্রেডশীট URL-এ spreadsheetId এবং filterViewId উল্লেখ করে আপনি কোন ফিল্টার ভিউটি প্রয়োগ করতে চান তা নির্দিষ্ট করে দিতে পারেন। এটি করার জন্য, ফিল্টার ভিউ তৈরি করার সময় রেসপন্সে প্রাপ্ত filterViewId টি ব্যবহার করুন।

    নিম্নলিখিত কোড নমুনাটি একটি ফিল্টার ভিউ সহ একটি শীটস ইউআরএল দেখাচ্ছে:

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

ফিল্টার ভিউ পরিচালনা করুন

ফিল্টার ভিউ তৈরি, অনুলিপি, পরিবর্তন বা মুছে ফেলার জন্য, উপযুক্ত অনুরোধ প্রকার সহ spreadsheets.batchUpdate পদ্ধতিটি ব্যবহার করুন:

  • ফিল্টার ভিউ তৈরি করতে AddFilterViewRequest মেথডটি ব্যবহার করুন।
  • ফিল্টার ভিউয়ের একটি অনুলিপি তৈরি করতে, DuplicateFilterViewRequest মেথডটি ব্যবহার করুন।
  • ফিল্টার ভিউয়ের বৈশিষ্ট্যগুলো পরিবর্তন করতে UpdateFilterViewRequest মেথডটি ব্যবহার করুন।
  • ফিল্টার ভিউ মুছে ফেলার জন্য DeleteFilterViewRequest মেথডটি ব্যবহার করুন।

আপনার সমস্ত ফিল্টার ভিউ তালিকাভুক্ত করতে, spreadsheets.get মেথডটি ব্যবহার করুন এবং fields URL প্যারামিটারটি sheets/filterViews এ সেট করুন। নিম্নলিখিত spreadsheets.get কোড নমুনাটি একটি ফিল্ড মাস্ক সহ একটি শীটস URL দেখাচ্ছে:

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

একটি ফিল্টারের JSON উপস্থাপনা

নিম্নলিখিত কোড নমুনাটি একটি FilterView অবজেক্টের JSON উপস্থাপনা দেখায়। BasicFilter অবজেক্টটি একই, তবে এতে filterViewId এবং title ফিল্ড নেই এবং এটি একটি নেমড রেঞ্জ ব্যবহার করতে পারে না।

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

নমুনা বিক্রয় ডেটা

এই নথির বাকি অংশে নিম্নলিখিত নমুনা বিক্রয় তথ্য সারণীটির উল্লেখ করা হয়েছে:

সারণি ১. নমুনা বিক্রয় তথ্য
একটি বি সি ডি এফ জি
আইটেম বিভাগ মডেল নম্বর খরচ পরিমাণ অঞ্চল বিক্রয়কর্মী চালানের তারিখ
চাকা W-24 ২০.৫০ ডলার পশ্চিম বেথ ৩/১/২০১৬
দরজা ডি-০১এক্স $১৫.০০ দক্ষিণ আমির ৩/১৫/২০১৬
ফ্রেম FR-0B1 ৩৪.০০ ডলার পূর্ব হানা ৩/১২/২০১৬
প্যানেল পি-০৩৪ $৬.০০ উত্তর ডেভিন ৩/১৫/২০১৬
প্যানেল পি-০৫২ ১১.৫০ ডলার পূর্ব এরিক ৫/১৬/২০১৬
চাকা W-24 ২০.৫০ ডলার ১১ দক্ষিণ শেলডন ৩০/৪/২০১৬
ইঞ্জিন ইএনজি-০১৬১ $৩৩০.০০ উত্তর জেসি ৭/২/২০১৬

সাজানোর স্পেসিফিকেশন

একটি ফিল্টারে একাধিক সর্ট স্পেসিফিকেশন থাকতে পারে। এই স্পেসিফিকেশনগুলো নির্ধারণ করে ডেটা কীভাবে সর্ট করা হবে এবং এগুলো নির্দিষ্ট ক্রমে প্রয়োগ করা হয়। SortSpec.dimensionIndex অ্যাট্রিবিউটটি সেই কলাম ইনডেক্স নির্দিষ্ট করে, যার উপর সর্টটি প্রয়োগ করা হবে।

নিম্নলিখিত কোড নমুনাটি একটি সর্ট স্পেসিফিকেশন দেখায়:

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

নমুনা বিক্রয় ডেটার ক্ষেত্রে প্রয়োগ করা হলে, এই স্পেসিফিকেশনটি প্রথমে 'Quantity' কলাম অনুসারে এবং তারপর, যদি দুটি সারিতে একই পরিমাণ থাকে, তাহলে 'Ship Date' অনুসারে ডেটা সাজায়।

সারণি ২. দুটি কলাম অনুসারে সাজানো বিক্রয়ের তথ্য
একটি বি সি ডি এফ জি
আইটেম বিভাগ মডেল নম্বর খরচ পরিমাণ অঞ্চল বিক্রয়কর্মী চালানের তারিখ
দরজা ডি-০১এক্স $১৫.০০ দক্ষিণ আমির ৩/১৫/২০১৬
ইঞ্জিন ইএনজি-০১৬১ $৩৩০.০০ উত্তর জেসি ৭/২/২০১৬
চাকা W-24 ২০.৫০ ডলার পশ্চিম বেথ ৩/১/২০১৬
প্যানেল পি-০৩৪ $৬.০০ উত্তর ডেভিন ৩/১৫/২০১৬
প্যানেল পি-০৫২ ১১.৫০ ডলার পূর্ব এরিক ৫/১৬/২০১৬
ফ্রেম FR-0B1 ৩৪.০০ ডলার পূর্ব হানা ৩/১২/২০১৬
চাকা W-24 ২০.৫০ ডলার ১১ দক্ষিণ শেলডন ৩০/৪/২০১৬

ফিল্টার মানদণ্ড

FilterCriteria অবজেক্টটি নির্ধারণ করে যে একটি বেসিক ফিল্টার বা ফিল্টার ভিউতে স্প্রেডশীটের কোন ডেটা দেখানো বা লুকানো হবে। প্রতিটি ক্রাইটেরিয়া একটি নির্দিষ্ট কলামের মানের উপর নির্ভর করে। আপনি ফিল্টার ক্রাইটেরিয়া একটি ম্যাপ হিসাবে সরবরাহ করেন, যেখানে কীগুলি হলো কলাম ইনডেক্স এবং ভ্যালুগুলি হলো ক্রাইটেরিয়া।

বুলিয়ান condition ব্যবহার করে নির্দিষ্ট করা মানদণ্ডের ক্ষেত্রে, মানগুলি প্রদর্শিত হওয়ার জন্য শর্তটি অবশ্যই true হতে হবে। শর্তটি hiddenValues ওভাররাইড করে না। যদি কোনো মান hiddenValues অধীনে তালিকাভুক্ত থাকে, তবে সেই মানের জন্য সমস্ত মিল লুকানোই থাকে।

নিম্নলিখিত কোড নমুনাটি একটি ফিল্টার ক্রাইটেরিয়া ম্যাপ দেখায়:

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

নমুনা বিক্রয় ডেটার উপর প্রয়োগ করা হলে, এই শর্তটি শুধুমাত্র সেই সারিগুলি দেখায় যেখানে 'আইটেম ক্যাটাগরি' কলামের মান 'প্যানেল' নয়, এবং যেখানে 'শিপ ডেট' কলামের মান 'এপ্রিল ৩০, ২০১৬'-এর আগে।

সারণি ৩. ফিল্টার মানদণ্ড ব্যবহার করে বিক্রয়ের তথ্য
একটি বি সি ডি এফ জি
আইটেম বিভাগ মডেল নম্বর খরচ পরিমাণ অঞ্চল বিক্রয়কর্মী চালানের তারিখ
চাকা ডাব্লিউ-২৪ ২০.৫০ ডলার পশ্চিম বেথ ৩/১/২০১৬
দরজা ডি-০১এক্স $১৫.০০ দক্ষিণ আমির ৩/১৫/২০১৬
ফ্রেম FR-0B1 ৩৪.০০ ডলার পূর্ব হানা ৩/১২/২০১৬

ফিল্টার ভিউ কোডের নমুনা

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে একটি ফিল্টার ভিউ তৈরি করতে হয়, সেটির একটি অনুলিপি তৈরি করতে হয় এবং তারপরে নমুনা বিক্রয় ডেটা ব্যবহার করে অনুলিপি করা সংস্করণটি আপডেট করতে হয়।

জাভা

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);
        }
    }
}

পাইথন

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