با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
از اشیاء Action برای ایجاد رفتار تعاملی در افزونههای Google Workspace استفاده کنید.
اشیاء عمل تعریف می کنند که وقتی کاربر با یک ویجت (مثلاً یک دکمه) در رابط کاربری افزونه تعامل می کند چه اتفاقی می افتد.
یک اقدام به ویجت اضافه کنید
برای پیوست کردن یک کنش به یک ویجت، از یک تابع کنترل کننده ویجت استفاده کنید، که همچنین شرایطی را که اقدام را راهاندازی میکند، تعریف میکند. وقتی فعال میشود، عملکرد یک تابع بازخوانی تعیینشده را اجرا میکند. تابع callback به یک شی رویداد ارسال می شود که اطلاعات مربوط به تعاملات سمت مشتری کاربر را حمل می کند. شما باید تابع callback را پیاده سازی کنید و از آن بخواهید یک شی پاسخ خاص را برگرداند.
مثال: با کلیک روی یک دکمه، یک کارت جدید را نمایش دهید
اگر می خواهید دکمه ای را به افزونه خود اضافه کنید که با کلیک روی آن یک کارت جدید ساخته و نمایش داده شود، مراحل زیر را دنبال کنید:
برای تنظیم یک اقدام ساخت کارت، تابع کنترل کننده ویجت دکمه setOnClickAction(action) را اضافه کنید.
یک تابع فراخوانی Apps Script ایجاد کنید تا اجرا شود و آن را به عنوان (action) در تابع کنترل کننده ویجت مشخص کنید. در این حالت، تابع callback باید کارت مورد نظر را بسازد و یک شی ActionResponse را برگرداند. شیء پاسخ به افزونه میگوید که کارتی را که تابع پاسخ به تماس ساخته شده است نمایش دهد.
مثال زیر ایجاد یک ویجت دکمه را نشان می دهد. این عمل از طرف افزونه، محدوده drive.file را برای فایل فعلی درخواست می کند.
/***AddsasectiontotheCardBuilderthatdisplaysa"REQUEST PERMISSION"button.*Whenit's clicked, the callback triggers file scope permission flow. This is used in*theadd-onwhenthehome-pagedisplaysbasicdata.*/functionaddRequestFileScopeButtonToBuilder(cardBuilder){varbuttonSection=CardService.newCardSection();//Iftheadd-ondoesnothaveaccesspermission,addabuttonthat//allowstheusertoprovidethatpermissiononaper-filebasis.varbuttonAction=CardService.newAction().setFunctionName("onRequestFileScopeButtonClickedInEditor");varbutton=CardService.newTextButton().setText("Request permission").setBackgroundColor("#4285f4").setTextButtonStyle(CardService.TextButtonStyle.FILLED).setOnClickAction(buttonAction);buttonSection.addWidget(button);cardBuilder.addSection(buttonSection);}/***Callbackfunctionforabuttonaction.InstructsDocstodisplaya*permissionsdialogtotheuser,requesting`drive.file`scopeforthe*currentfileonbehalfofthisadd-on.**@param{Object}eTheparametersobjectthatcontainsthedocument’sID*@return{editorFileScopeActionResponse}*/functiononRequestFileScopeButtonClickedInEditor(e){returnCardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();
تعاملات دسترسی به فایل برای REST API
افزونههای Google Workspace که ویرایشگرها را گسترش میدهند و از REST API استفاده میکنند، میتوانند شامل یک اقدام ویجت اضافی برای درخواست دسترسی به فایل باشند. این عمل به تابع مربوط به تماس پاسخ نیاز دارد تا یک شی پاسخ تخصصی را برگرداند:
برای استفاده از این شیء اقدام و پاسخ ویجت، تمام موارد زیر باید درست باشد:
این افزونه از REST API استفاده می کند.
افزودنی گفتگوی دامنه پرونده درخواست را با استفاده از CardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build(); روش
این افزونه شامل https://www.googleapis.com/auth/drive.file دامنه ویرایشگر و فعال کننده onFileScopeGranted در مانیفست خود است.
درخواست دسترسی به فایل برای سند فعلی
برای درخواست دسترسی به فایل برای سند فعلی، این مراحل را دنبال کنید:
یک کارت صفحه اصلی بسازید که بررسی می کند که آیا افزونه دارای محدوده drive.file است یا خیر.
برای مواردی که افزودنی drive.file دامنه داده نشده است ، راهی برای درخواست کاربران به drive.file Scope برای سند فعلی ایجاد کنید.
مثال: دسترسی به سند فعلی را در Google Docs دریافت کنید
مثال زیر یک رابط برای Google Docs می سازد که اندازه سند فعلی را نمایش می دهد. اگر افزونه دارای مجوز drive.file نباشد، دکمه ای را برای شروع مجوز دامنه فایل نمایش می دهد.
/***Buildasimplecardthatchecksselecteditems' quota usage. Checking*quotausagerequiresuser-permissions,sothisadd-onprovidesabutton*torequest`drive.file`scopeforitemstheadd-ondoesn't yet have*permissiontoaccess.**@parameTheeventobjectpassedcontaininginformationaboutthe*currentdocument.*@return{Card}*/functiononDocsHomepage(e){returncreateAddOnView(e);}functiononFileScopeGranted(e){returncreateAddOnView(e);}/***Forthecurrentdocument,displayeitheritsquotainformationor*abuttonthatallowstheusertoprovidepermissiontoaccessthat*filetoretrieveitsquotadetails.**@parameTheeventcontaininginformationaboutthecurrentdocument*@return{Card}*/functioncreateAddOnView(e){vardocsEventObject=e['docs'];varbuilder=CardService.newCardBuilder();varcardSection=CardService.newCardSection();if(docsEventObject['addonHasFileScopePermission']){cardSection.setHeader(docsEventObject['title']);//Thisadd-onusestherecommended,limited-permission`drive.file`//scopetogetgranularper-fileaccesspermissions.//See:https://developers.google.com/drive/api/v2/about-auth//Iftheadd-onhasaccesspermission,readanddisplayitsquota.cardSection.addWidget(CardService.newTextParagraph().setText("This file takes up: "+getQuotaBytesUsed(docsEventObject['id'])));}else{//Iftheadd-ondoesnothaveaccesspermission,addabuttonthat//allowstheusertoprovidethatpermissiononaper-filebasis.cardSection.addWidget(CardService.newTextParagraph().setText("The add-on needs permission to access this file's quota."));varbuttonAction=CardService.newAction().setFunctionName("onRequestFileScopeButtonClicked");varbutton=CardService.newTextButton().setText("Request permission").setOnClickAction(buttonAction);cardSection.addWidget(button);}returnbuilder.addSection(cardSection).build();}/***Callbackfunctionforabuttonaction.InstructsDocstodisplaya*permissionsdialogtotheuser,requesting`drive.file`scopeforthe*currentfileonbehalfofthisadd-on.**@param{Object}eTheparametersobjectthatcontainsthedocument’sID*@return{editorFileScopeActionResponse}*/functiononRequestFileScopeButtonClicked(e){returnCardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();}
تاریخ آخرین بهروزرسانی 2025-07-25 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-25 بهوقت ساعت هماهنگ جهانی."],[[["\u003cp\u003eGoogle Workspace add-ons use Action objects to define interactive behavior triggered by user interactions with UI widgets.\u003c/p\u003e\n"],["\u003cp\u003eAn action's callback function executes when triggered and receives an event object containing interaction details, requiring a specific response object to be returned.\u003c/p\u003e\n"],["\u003cp\u003eAdd-ons extending Editors and using REST APIs can request file access using a widget action with a specialized response object returned by its callback function.\u003c/p\u003e\n"],["\u003cp\u003eRequesting file access involves building a homepage card to check for \u003ccode\u003edrive.file\u003c/code\u003e scope and providing a way for users to grant this scope if needed.\u003c/p\u003e\n"]]],["Action objects enable interactive behavior in Google Workspace add-ons by defining responses to user interactions with widgets. To implement actions, you must define a widget handler function that triggers a callback function upon a specific condition. This callback function then receives an event object with client-side interaction data and must return a specific response object. For file access, add-ons use a specialized response object, `EditorFileScopeActionResponse`, and need `drive.file` scope in the manifest.\n"],null,["# Editor actions\n\nUse [Action](/workspace/add-ons/concepts/actions) objects to build interactive\nbehavior into Google Workspace add-ons.\n\nAction objects define what happens when a user interacts with a widget\n(for example, a button) in the add-on UI.\n\nAdd an action to a widget\n-------------------------\n\nTo attach an action to a widget, use a [widget handler function](/workspace/add-ons/concepts/actions#widget_handler_functions),\nwhich also defines the condition that triggers the action. When triggered, the\naction executes a designated [callback function](/workspace/add-ons/concepts/actions#callback_functions).\nThe callback function is passed an [event object](/workspace/add-ons/concepts/event-objects)\nthat carries information about the user's client-side interactions. You must\nimplement the callback function and have it return a specific response object.\n\n### Example: Display a new card when a button is clicked\n\nIf you want to add a button to your add-on that builds and displays a new card\nwhen clicked, follow the steps below:\n\n1. Create a button [widget](/workspace/add-ons/concepts/widgets#user_interaction_widgets).\n2. To set a card-building action, add the button widget handler function [`setOnClickAction(action)`](/apps-script/reference/card-service/text-button#setOnClickAction(Action)).\n3. Create an Apps Script callback function to execute and specify it as the [`(action)`](/apps-script/reference/card-service/text-button#setOnClickAction(Action)) within the widget handler function. In this case, the callback function should build the card you want and return an [`ActionResponse`](/apps-script/reference/card-service/action-response) object. The response object tells the add-on to display the card the callback function built.\n\nThe following example shows the creation of a button widget. The action requests\nthe `drive.file` scope for the current file on behalf of the add-on. \n\n```gdscript\n/**\n * Adds a section to the Card Builder that displays a \"REQUEST PERMISSION\" button.\n * When it's clicked, the callback triggers file scope permission flow. This is used in\n * the add-on when the home-page displays basic data.\n */\nfunction addRequestFileScopeButtonToBuilder(cardBuilder) {\n var buttonSection = CardService.newCardSection();\n // If the add-on does not have access permission, add a button that\n // allows the user to provide that permission on a per-file basis.\n var buttonAction = CardService.newAction()\n .setFunctionName(\"onRequestFileScopeButtonClickedInEditor\");\n\n var button = CardService.newTextButton()\n .setText(\"Request permission\")\n .setBackgroundColor(\"#4285f4\")\n .setTextButtonStyle(CardService.TextButtonStyle.FILLED)\n .setOnClickAction(buttonAction);\n\n buttonSection.addWidget(button);\n cardBuilder.addSection(buttonSection);\n}\n\n/**\n * Callback function for a button action. Instructs Docs to display a\n * permissions dialog to the user, requesting `drive.file` scope for the \n * current file on behalf of this add-on.\n *\n * @param {Object} e The parameters object that contains the document's ID\n * @return {editorFileScopeActionResponse}\n */\nfunction onRequestFileScopeButtonClickedInEditor(e) {\n return CardService.newEditorFileScopeActionResponseBuilder()\n .requestFileScopeForActiveDocument().build();\n```\n\nFile access interactions for REST APIs\n--------------------------------------\n\nGoogle Workspace add-ons that extend the Editors and use REST APIs can include an\nadditional widget action to request file access. This action requires the\nassociated action callback function to return a specialized response object:\n\n| Action attempted | Callback function should return |\n|---------------------------------------------------------------------------------------|---------------------------------|\n| [Request file access for current_document](#request_file_access_for_current_document) | `EditorFileScopeActionResponse` |\n\nTo make use of this widget action and response object, all of the following must\nbe true:\n\n- The add-on uses REST APIs.\n- The add-on presents the request file scope dialog using the `CardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();` method.\n- The add-on includes the `https://www.googleapis.com/auth/drive.file` editor scope and `onFileScopeGranted` trigger in its manifest.\n\n### Request file access for current document\n\nTo request file access for the current document, follow these steps:\n\n1. Build a homepage card that checks whether the add-on has `drive.file` scope.\n2. For cases where the add-on hasn't been granted `drive.file` scope, build a way to request that users grant `drive.file` scope for the current document.\n\n#### Example: Get current document access in Google Docs\n\nThe following example builds an interface for Google Docs that displays the size\nof the current document. If the add-on doesn't have `drive.file` authorization,\nit displays a button to initiate the file scope authorization. \n\n /**\n * Build a simple card that checks selected items' quota usage. Checking\n * quota usage requires user-permissions, so this add-on provides a button\n * to request `drive.file` scope for items the add-on doesn't yet have\n * permission to access.\n *\n * @param e The event object passed containing information about the\n * current document.\n * @return {Card}\n */\n function onDocsHomepage(e) {\n return createAddOnView(e);\n }\n\n function onFileScopeGranted(e) {\n return createAddOnView(e);\n }\n\n /**\n * For the current document, display either its quota information or\n * a button that allows the user to provide permission to access that\n * file to retrieve its quota details.\n *\n * @param e The event containing information about the current document\n * @return {Card}\n */\n function createAddOnView(e) {\n var docsEventObject = e['docs'];\n var builder = CardService.newCardBuilder();\n\n var cardSection = CardService.newCardSection();\n if (docsEventObject['addonHasFileScopePermission']) {\n cardSection.setHeader(docsEventObject['title']);\n // This add-on uses the recommended, limited-permission `drive.file`\n // scope to get granular per-file access permissions.\n // See: https://developers.google.com/drive/api/v2/about-auth\n // If the add-on has access permission, read and display its quota.\n cardSection.addWidget(\n CardService.newTextParagraph().setText(\n \"This file takes up: \" + getQuotaBytesUsed(docsEventObject['id'])));\n } else {\n // If the add-on does not have access permission, add a button that\n // allows the user to provide that permission on a per-file basis.\n cardSection.addWidget(\n CardService.newTextParagraph().setText(\n \"The add-on needs permission to access this file's quota.\"));\n\n var buttonAction = CardService.newAction()\n .setFunctionName(\"onRequestFileScopeButtonClicked\");\n\n var button = CardService.newTextButton()\n .setText(\"Request permission\")\n .setOnClickAction(buttonAction);\n\n cardSection.addWidget(button);\n }\n return builder.addSection(cardSection).build();\n }\n\n /**\n * Callback function for a button action. Instructs Docs to display a\n * permissions dialog to the user, requesting `drive.file` scope for the\n * current file on behalf of this add-on.\n *\n * @param {Object} e The parameters object that contains the document's ID\n * @return {editorFileScopeActionResponse}\n */\n function onRequestFileScopeButtonClicked(e) {\n return CardService.newEditorFileScopeActionResponseBuilder()\n .requestFileScopeForActiveDocument().build();\n }"]]