کار کردن با تراشه‌های منو کرکره‌ای

«میانای برنامه‌سازی کاربردی سندنگار Google» به شما امکان می‌دهد به‌صورت برنامه‌ریزی‌شده در اسناد «سندنگار Google» تراشه‌های کرکره‌ای ایجاد، درج، به‌روزرسانی، خواندن، و مدیریت کنید.

تراشه‌های منو کرکره‌ای چیست؟

تراشه‌های منو کرکره‌ای در «سندنگار Google» منو انتخابی تعاملی و سفارشی‌سازی‌پذیر را به‌صورت به‌خط در نوشتار سند دراختیار کاربران قرار می‌دهد. کاربران می‌توانند روی تراشه منو کرکره‌ای کلیک کنند تا از فهرست ازپیش‌تعریف‌شده‌ای از گزینه‌ها انتخاب کنند، هرکدام با نوشتار نمایش و سبک رنگی خاص خود. تراشه‌های کرکره‌ای اغلب برای ردیابی پروژه، به‌روزرسانی وضعیت، گردش کارهای مرور، و مراحل تأیید استفاده می‌شوند.

ازطریق «میانای برنامه‌سازی کاربردی سندنگار» می‌توانید:

  • الگوهای کرکره‌ای قابل‌استفاده مجدد را با عنوان‌های سفارشی، نام‌های گزینه، و رنگ‌ها تعریف کنید.
  • تراشه‌های منو کرکره‌ای را در مکان نویسه معتبری درج کنید.
  • گزینه انتخابی نمونه تراشه کرکره‌ای را به‌روزرسانی کنید.
  • تعریف‌های کرکره‌ای هم‌رسانی‌شده را درجا اصلاح کنید و همه تراشه‌های ارجاع‌دهنده را هم‌زمان به‌روز کنید.
  • گزینه‌ها را به‌طور ایمن جایگزین یا بازنشسته کنید و درعین‌حال یکپارچگی ارجاعی را در سراسر تراشه‌های موجود حفظ کنید.
  • الگوهای کرکره‌ای استفاده‌نشده را حذف کنید.

معماری: تعریف‌ها و نمونه‌ها

در «میانای برنامه‌سازی کاربردی سندنگار»، تراشه‌های منو کرکره‌ای تعریف‌ها و نمونه‌هایی دارند. تعریف گزینه‌های نمونه منو کرکره‌ای را تنظیم می‌کند. نمونه کرکره‌ای کرکره‌ای است که افراد می‌توانند با آن تعامل داشته باشند و اطلاعات مربوط به انتخاب‌ها را ذخیره می‌کند.

«میانای برنامه‌سازی کاربردی Docs» پیکربندی الگوی منو کرکره‌ای را از نمونه‌های تراشه منو کرکره‌ای درون‌خطی جدا می‌کند:

  1. DropdownDefinition: الگویی در سطح برگه که عنوان منو کرکره‌ای و مجموعه انتخاب‌های قابل‌انتخاب را تعریف می‌کند (DropdownOption). این الگو در افست نویسه خاصی در سند قرار ندارد؛ درعوض، در نقشه تعریف برگه ذخیره می‌شود: document.tabs[].documentTab.dropdownDefinitions.
  2. کرکره‌ای: نمونه تراشه تکی که به‌صورت درون‌خطی در عنصر پاراگراف جاسازی شده است (ParagraphElement.dropdown). هر نمونه کرکره‌ای به dropdownDefinitionId ارجاع می‌دهد و selectedOptionId فعال خود را ذخیره می‌کند.

اصلاح DropdownDefinition (برای نمونه، افزودن گزینه یا تغییر نام عنوان) همه تراشه‌های ارجاعی را در سراسر زبانه به‌روز می‌کند و نیازی به به‌روزرسانی هر عنصر جداگانه ندارد.

هر نمونه Dropdown selectedOptionId خودش را ردیابی می‌کند. تغییر دادن مقدار انتخاب‌شده یک تراشه تکی فقط بر آن نمونه خاص تأثیر می‌گذارد.

قوانین قالب و درستی‌سنجی شناسه

شناسه‌های ارائه‌شده توسط کاربر باید از مشخصات دقیق قالب، پیشوند، و طول پیروی کنند:

شناسه پیشوند اجباری عبارت باقاعده اعتبارسنجی حد طول مثال
شناسه تعریف منو کرکره‌ای (dropdownDefinitionId) kix. ^kix\.[a-zA-Z0-9_-]{2,14}$ ‫۶ تا ۱۸ نویسه kix.review_status
شناسه گزینه منو کرکره‌ای (optionId) dropdownItem. ^dropdownItem\.[a-zA-Z0-9_-]{2,14}$ ‫۱۵ تا ۲۷ نویسه dropdownItem.pending

تولید شناسه‌های ارائه‌شده ازسوی کاربر

برای تولید شناسه‌هایی که از پیشوند اجباری و الزامات عبارت باقاعده پیروی می‌کنند، از توابع کمکی زیر استفاده کنید. این یاری‌رسان‌ها پسوندهای الفبایی عددی پایه ۳۶ حروف کوچک تولید می‌کنند که با قالب تولیدشده توسط واسط کاربر «سندنگار Google» مطابقت دارد:

Python

import random
import string

def generate_dropdown_definition_id(suffix_len: int = 8) -> str:
    """Generates a valid user-provided DropdownDefinition ID (6-18 chars, starting with 'kix.')."""
    chars = string.ascii_lowercase + string.digits
    suffix = "".join(random.choices(chars, k=max(2, min(suffix_len, 14))))
    return f"kix.{suffix}"

def generate_dropdown_option_id(suffix_len: int = 8) -> str:
    """Generates a valid user-provided DropdownOption ID (15-27 chars, starting with 'dropdownItem.')."""
    chars = string.ascii_lowercase + string.digits
    suffix = "".join(random.choices(chars, k=max(2, min(suffix_len, 14))))
    return f"dropdownItem.{suffix}"

جاوا

import java.security.SecureRandom;

public final class DropdownIdGenerator {
  private static final String BASE36_CHARS =
      "abcdefghijklmnopqrstuvwxyz0123456789";
  private static final SecureRandom RANDOM = new SecureRandom();

  private DropdownIdGenerator() {}

  /** Generates a valid user-provided DropdownDefinition ID (6-18 chars, starting with "kix."). */
  public static String generateDefinitionId(int suffixLength) {
    int length = Math.max(2, Math.min(suffixLength, 14));
    StringBuilder sb = new StringBuilder("kix.");
    for (int i = 0; i < length; i++) {
      sb.append(BASE36_CHARS.charAt(RANDOM.nextInt(BASE36_CHARS.length())));
    }
    return sb.toString();
  }

  /** Generates a valid user-provided DropdownOption ID (15-27 chars, starting with "dropdownItem."). */
  public static String generateOptionId(int suffixLength) {
    int length = Math.max(2, Math.min(suffixLength, 14));
    StringBuilder sb = new StringBuilder("dropdownItem.");
    for (int i = 0; i < length; i++) {
      sb.append(BASE36_CHARS.charAt(RANDOM.nextInt(BASE36_CHARS.length())));
    }
    return sb.toString();
  }
}

ایجاد و درج تراشه‌های منو کرکره‌ای

ساخت دسته‌ای تکی (توصیه‌شده)

کارآمدترین الگو CreateDropdownDefinitionRequest و InsertDropdownRequest را در یک تماس documents.batchUpdate ترکیب می‌کند.

نمونه کد زیر تعریف کرکره‌ای «وضعیت مرور» را با سه انتخاب کدبندی‌شده با رنگ بااستفاده از شناسه‌های ارائه‌شده توسط کاربر ایجاد می‌کند و نمونه‌ای را در انتهای سند درج می‌کند:

Python

requests = [
    {
        "createDropdownDefinition": {
            "dropdownDefinition": {
                "dropdownDefinitionId": "kix.review_status",
                "dropdownDefinitionProperties": {
                    "title": "Review Status",
                    "options": [
                        {
                            "optionId": "dropdownItem.pending",
                            "displayValue": "Pending Review",
                            "textStyle": {
                                "backgroundColor": {
                                    "color": {"rgbColor": {"red": 0.99, "green": 0.90, "blue": 0.65}}
                                },
                                "foregroundColor": {
                                    "color": {"rgbColor": {"red": 0.45, "green": 0.30, "blue": 0.0}}
                                },
                            },
                        },
                        {
                            "optionId": "dropdownItem.approved",
                            "displayValue": "Approved",
                            "textStyle": {
                                "backgroundColor": {
                                    "color": {"rgbColor": {"red": 0.85, "green": 0.95, "blue": 0.85}}
                                },
                                "foregroundColor": {
                                    "color": {"rgbColor": {"red": 0.08, "green": 0.40, "blue": 0.15}}
                                },
                            },
                        },
                        {
                            "optionId": "dropdownItem.rejected",
                            "displayValue": "Needs Changes",
                            "textStyle": {
                                "backgroundColor": {
                                    "color": {"rgbColor": {"red": 0.98, "green": 0.84, "blue": 0.84}}
                                },
                                "foregroundColor": {
                                    "color": {"rgbColor": {"red": 0.65, "green": 0.10, "blue": 0.10}}
                                },
                            },
                        },
                    ],
                },
            }
        }
    },
    {
        "insertDropdown": {
            "endOfSegmentLocation": {},
            "dropdownDefinitionId": "kix.review_status",
            "selectedOptionId": "dropdownItem.pending",
        }
    },
]

result = service.documents().batchUpdate(
    documentId=DOCUMENT_ID,
    body={"requests": requests}
).execute()

جاوا

List<Request> requests = new ArrayList<>();

List<DropdownOption> options = Arrays.asList(
    new DropdownOption()
        .setOptionId("dropdownItem.pending")
        .setDisplayValue("Pending Review")
        .setTextStyle(new TextStyle()
            .setBackgroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.99f).setGreen(0.90f).setBlue(0.65f))))
            .setForegroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.45f).setGreen(0.30f).setBlue(0.0f))))),
    new DropdownOption()
        .setOptionId("dropdownItem.approved")
        .setDisplayValue("Approved")
        .setTextStyle(new TextStyle()
            .setBackgroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.85f).setGreen(0.95f).setBlue(0.85f))))
            .setForegroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.08f).setGreen(0.40f).setBlue(0.15f))))),
    new DropdownOption()
        .setOptionId("dropdownItem.rejected")
        .setDisplayValue("Needs Changes")
        .setTextStyle(new TextStyle()
            .setBackgroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.98f).setGreen(0.84f).setBlue(0.84f))))
            .setForegroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.65f).setGreen(0.10f).setBlue(0.10f))))));

DropdownDefinition definition = new DropdownDefinition()
    .setDropdownDefinitionId("kix.review_status")
    .setDropdownDefinitionProperties(new DropdownDefinitionProperties()
        .setTitle("Review Status")
        .setOptions(options));

requests.add(new Request().setCreateDropdownDefinition(
    new CreateDropdownDefinitionRequest().setDropdownDefinition(definition)));

requests.add(new Request().setInsertDropdown(
    new InsertDropdownRequest()
        .setEndOfSegmentLocation(new EndOfSegmentLocation())
        .setDropdownDefinitionId("kix.review_status")
        .setSelectedOptionId("dropdownItem.pending")));

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response = docsService.documents()
    .batchUpdate(DOCUMENT_ID, body)
    .execute();

قوانین و محدودیت‌های اعتبارسنجی منو کرکره‌ای

هنگام ایجاد یا اصلاح تعاریف کرکره‌ای، محدودیت‌های زیر اعمال می‌شود:

  • تعداد گزینه: تعریف منوِ کرکره‌ای باید بین ۲ و ۵۰ گزینه داشته باشد.
  • طول عنوان: تعریف title نمی‌تواند خالی باشد و نباید از ۲۰۰ نویسه بیشتر باشد.
  • طول مقدار نمایش: displayValue هر گزینه نمی‌تواند خالی باشد و نباید از ۲۰۰ نویسه بیشتر باشد.
  • سبک‌بندی گزینه: فقط foregroundColor و backgroundColor در DropdownOption.textStyle پشتیبانی می‌شوند. تنظیم کردن ویژگی‌های سبک دیگر خطای 400 Bad Request برمی‌گرداند.
  • انتخاب پیش‌فرض: در InsertDropdownRequest، اگر selectedOptionId حذف شود، تراشه به‌طور پیش‌فرض به اولین گزینه تعریف‌شده در DropdownDefinition برمی‌گردد.

به‌روزرسانی انتخاب تراشه منوِ کرکره‌ای تکی

برای تغییر دادن گزینه انتخاب‌شده نمونه تراشه کرکره‌ای موجود بدون تغییر دادن الگوی آن یا تراشه‌های دیگر، از UpdateDropdownPropertiesRequest استفاده کنید:

  • dropdownId: (الزامی) شناسه نمونه تراشه کرکره‌ای خاص برای به‌روزرسانی.
  • ‫tabId: شناسه برگه‌ای که منو کرکره‌ای در آن قرار دارد (اگر حذف شود، به‌طور پیش‌فرض به اولین برگه اختصاص می‌یابد).
  • ‫fields: روی "selectedOptionId" تنظیم شد.

نمونه کد زیر انتخاب فعال تراشه منو کرکره‌ای را به "dropdownItem.approved" به‌روز می‌کند:

Python

requests = [
    {
        "updateDropdownProperties": {
            "dropdownId": "kix.chip_abc1",
            "tabId": "t.0",
            "dropdownProperties": {
                "selectedOptionId": "dropdownItem.approved",
            },
            "fields": "selectedOptionId",
        }
    }
]

result = service.documents().batchUpdate(
    documentId=DOCUMENT_ID,
    body={"requests": requests}
).execute()

جاوا

List<Request> requests = new ArrayList<>();
requests.add(new Request().setUpdateDropdownProperties(
    new UpdateDropdownPropertiesRequest()
        .setDropdownId("kix.chip_abc1")
        .setTabId("t.0")
        .setDropdownProperties(new DropdownProperties()
            .setSelectedOptionId("dropdownItem.approved"))
        .setFields("selectedOptionId")));

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response = docsService.documents()
    .batchUpdate(DOCUMENT_ID, body)
    .execute();

به‌روزرسانی تعریف‌ها و گزینه‌های منوِ کرکره‌ای

برای تغییر دادن خود الگو (عنوان، فهرست گزینه‌ها، برچسب‌های نمایشگر، یا رنگ‌ها)، از UpdateDropdownDefinitionPropertiesRequest استفاده کنید. به‌روزرسانی تعریف باعث می‌شود همه تراشه‌های منو کرکره‌ای که به آن در سراسر برگه ارجاع می‌دهند به‌طور خودکار به‌روز شوند.

جایگزینی فهرست کامل برای گزینه‌ها

وقتی dropdownDefinitionProperties.options در پوشش fields قرار می‌گیرد، درخواست جایگزینی فهرست کامل را انجام می‌دهد. باید فهرست کامل گزینه‌ها را به ترتیب انتخاب‌شده ارائه دهید. سرور فهرست ورودی را با تعریف کنونی مقایسه می‌کند:

  • گزینه جدید: افزودن گزینه‌ای بدون optionId (یا با optionId جدیدی که کاربر ارائه کرده است) آن را به تعریف اضافه می‌کند.
  • گزینه به‌روزرسانی‌شده: ارائه optionId موجود با displayValue اصلاح‌شده یا textStyle به‌روزرسانی، آن گزینه را جایگزین می‌کند.
  • گزینه‌های مرتب‌شده: فهرست گزینه‌ها دقیقاً به همان ترتیبی که در درخواست ارائه شده است ذخیره می‌شود.
  • گزینه حذف‌شده: حذف یک optionId موجود باعث حذف آن گزینه از تعریف می‌شود.

یکپارچگی مرجع و جایگزینی گزینه

اگر گزینه‌ای که درحال حذف شدن است در هریک از تراشه‌های منو کرکره‌ای در سند انتخاب شده باشد، باید در selectedOptionIdReplacements (map<string, string>) نگاشت ارائه دهید. کلیدها شناسه‌های گزینه‌هایی هستند که درحال حذف شدن هستند و مقادیر شناسه‌های گزینه‌های جایگزین هستند.

نمونه کد زیر نشان می‌دهد که چگونه تعریف منو کرکره‌ای را با جایگزینی گزینه‌ها به‌روز کنید:

Python

requests = [
    {
        "updateDropdownDefinitionProperties": {
            "dropdownDefinitionId": "kix.review_status",
            "tabId": "t.0",
            "dropdownDefinitionProperties": {
                "title": "Editorial Review Status",
                "options": [
                    {
                        "optionId": "dropdownItem.approved",
                        "displayValue": "Approved",
                        "textStyle": {
                            "backgroundColor": {
                                "color": {"rgbColor": {"red": 0.85, "green": 0.95, "blue": 0.85}}
                            },
                            "foregroundColor": {
                                "color": {"rgbColor": {"red": 0.08, "green": 0.40, "blue": 0.15}}
                            },
                        },
                    },
                    {
                        "optionId": "dropdownItem.rejected",
                        "displayValue": "Changes Requested",
                        "textStyle": {
                            "backgroundColor": {
                                "color": {"rgbColor": {"red": 0.98, "green": 0.84, "blue": 0.84}}
                            },
                            "foregroundColor": {
                                "color": {"rgbColor": {"red": 0.65, "green": 0.10, "blue": 0.10}}
                            },
                        },
                    },
                ],
            },
            "selectedOptionIdReplacements": {
                "dropdownItem.pending": "dropdownItem.rejected"
            },
            "fields": "title,options",
        }
    }
]

result = service.documents().batchUpdate(
    documentId=DOCUMENT_ID,
    body={"requests": requests}
).execute()

جاوا

List<DropdownOption> updatedOptions = Arrays.asList(
    new DropdownOption()
        .setOptionId("dropdownItem.approved")
        .setDisplayValue("Approved")
        .setTextStyle(new TextStyle()
            .setBackgroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.85f).setGreen(0.95f).setBlue(0.85f))))
            .setForegroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.08f).setGreen(0.40f).setBlue(0.15f))))),
    new DropdownOption()
        .setOptionId("dropdownItem.rejected")
        .setDisplayValue("Changes Requested")
        .setTextStyle(new TextStyle()
            .setBackgroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.98f).setGreen(0.84f).setBlue(0.84f))))
            .setForegroundColor(new OptionalColor().setColor(
                new Color().setRgbColor(new RgbColor().setRed(0.65f).setGreen(0.10f).setBlue(0.10f))))));

Map<String, String> replacements = new HashMap<>();
replacements.put("dropdownItem.pending", "dropdownItem.rejected");

List<Request> requests = new ArrayList<>();
requests.add(new Request().setUpdateDropdownDefinitionProperties(
    new UpdateDropdownDefinitionPropertiesRequest()
        .setDropdownDefinitionId("kix.review_status")
        .setTabId("t.0")
        .setDropdownDefinitionProperties(new DropdownDefinitionProperties()
            .setTitle("Editorial Review Status")
            .setOptions(updatedOptions))
        .setSelectedOptionIdReplacements(replacements)
        .setFields("title,options")));

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response = docsService.documents()
    .batchUpdate(DOCUMENT_ID, body)
    .execute();

حذف تعریف منو کرکره‌ای

برای برداشتن الگوی منو کرکره‌ای استفاده‌نشده، از DeleteDropdownDefinitionRequest استفاده کنید.

نمونه کد زیر نحوه حذف تعریف منو کرکره‌ای را نشان می‌دهد:

Python

requests = [
    {
        "deleteDropdownDefinition": {
            "dropdownDefinitionId": "kix.review_status",
            "tabId": "t.0",
        }
    }
]

result = service.documents().batchUpdate(
    documentId=DOCUMENT_ID,
    body={"requests": requests}
).execute()

جاوا

List<Request> requests = new ArrayList<>();
requests.add(new Request().setDeleteDropdownDefinition(
    new DeleteDropdownDefinitionRequest()
        .setDropdownDefinitionId("kix.review_status")
        .setTabId("t.0")));

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response = docsService.documents()
    .batchUpdate(DOCUMENT_ID, body)
    .execute();

مدیریت خطا و عیب‌یابی

شرایط خطا و راه‌حل‌های رایج:

رمز وضعیت علت وضوح
400 INVALID_ARGUMENT پیشوند شناسه یا قالب عبارت باقاعده نامعتبر است. مطمئن شوید dropdownDefinitionId با kix. شروع شود (۶ تا ۱۸ نویسه) و optionId با dropdownItem. شروع شود (۱۵ تا ۲۷ نویسه).
400 INVALID_ARGUMENT تعداد گزینه خارج از محدوده است. تعریف منوِ کرکره‌ای باید بین ۲ تا ۵۰ گزینه داشته باشد.
400 INVALID_ARGUMENT عنوان یا مقدار نمایش‌داده‌شده خالی است یا از ۲۰۰ نویسه فراتر رفته است. رشته‌ای غیرخالی بین ۱ تا ۲۰۰ نویسه ارائه دهید.
400 INVALID_ARGUMENT دارایی سبک نوشتار پشتیبانی‌نشده در گزینه. فقط foregroundColor و backgroundColor در گزینه‌های منو کرکره‌ای پشتیبانی می‌شوند. قلم، اندازه، یا مشخصه‌های دیگر را بردارید.
400 INVALID_ARGUMENT تخصیص جایگزین گزینه در حذف وجود ندارد. هنگام حذف کردن گزینه‌ای که توسط تراشه‌ای انتخاب شده است، جایگزین معتبری در selectedOptionIdReplacements ارائه دهید.
400 INVALID_ARGUMENT تلاش برای حذف تعریفی که درحال استفاده است. قبل‌از حذف کردن تعریف، همه نمونه‌های تراشه منو کرکره‌ای را که به آن تعریف ارجاع می‌دهند حذف کنید یا هدف‌یابی مجدد کنید.
400 INVALID_ARGUMENT شناسه ارائه‌شده کاربر تکراری است. مطمئن شوید شناسه‌های ارائه‌شده توسط کاربر در زبانه سند یکتا باشند.