از اشیاء اکشن برای ایجاد رفتار تعاملی در افزونههای Google Workspace استفاده کنید.
اشیاء اکشن تعریف میکنند که وقتی کاربر با یک ویجت (مثلاً یک دکمه) در رابط کاربری افزونه تعامل میکند، چه اتفاقی میافتد.
افزودن یک اکشن به یک ویجت
برای اتصال یک اکشن به یک ویجت، از یک تابع مدیریتکننده ویجت استفاده کنید که همچنین شرطی را که باعث فعال شدن اکشن میشود، تعریف میکند. وقتی اکشن فعال میشود، یک تابع فراخوانی تعیینشده را اجرا میکند. به تابع فراخوانی، یک شیء رویداد ارسال میشود که اطلاعاتی در مورد تعاملات سمت کلاینت کاربر را در خود جای داده است. شما باید تابع فراخوانی را پیادهسازی کنید و کاری کنید که یک شیء پاسخ خاص را برگرداند.
مثال: نمایش یک کارت جدید با کلیک روی یک دکمه
اگر میخواهید دکمهای به افزونه خود اضافه کنید که با کلیک روی آن، یک کارت جدید ایجاد و نمایش داده شود، مراحل زیر را دنبال کنید:
- یک ویجت دکمه ایجاد کنید.
- برای تنظیم یک اکشن ساخت کارت، تابع
setOnClickAction(action)را به عنوان کنترلکنندهی ویجت دکمه اضافه کنید. - یک تابع فراخوانی Apps Script برای اجرا ایجاد کنید و آن را به عنوان
(action)درون تابع کنترلکننده ویجت مشخص کنید. در این حالت، تابع فراخوانی باید کارت مورد نظر شما را بسازد و یک شیءActionResponseرا برگرداند. شیء پاسخ به افزونه میگوید که کارتی را که تابع فراخوانی ساخته است، نمایش دهد.
مثال زیر ایجاد یک ویجت دکمه را نشان میدهد. این اکشن از طرف افزونه، دامنهی drive.file را برای فایل فعلی درخواست میکند.
/** * Adds a section to the Card Builder that displays a "REQUEST PERMISSION" button. * When it's clicked, the callback triggers file scope permission flow. This is used in * the add-on when the home-page displays basic data. */ function addRequestFileScopeButtonToBuilder(cardBuilder) { var buttonSection = CardService.newCardSection(); // If the add-on does not have access permission, add a button that // allows the user to provide that permission on a per-file basis. var buttonAction = CardService.newAction() .setFunctionName("onRequestFileScopeButtonClickedInEditor"); var button = CardService.newTextButton() .setText("Request permission") .setBackgroundColor("#4285f4") .setTextButtonStyle(CardService.TextButtonStyle.FILLED) .setOnClickAction(buttonAction); buttonSection.addWidget(button); cardBuilder.addSection(buttonSection); } /** * Callback function for a button action. Instructs Docs to display a * permissions dialog to the user, requesting `drive.file` scope for the * current file on behalf of this add-on. * * @param {Object} e The parameters object that contains the document’s ID * @return {editorFileScopeActionResponse} */ function onRequestFileScopeButtonClickedInEditor(e) { return CardService.newEditorFileScopeActionResponseBuilder() .requestFileScopeForActiveDocument().build();
تعاملات دسترسی به فایل برای APIهای REST
افزونههای Google Workspace که ویرایشگرها را توسعه میدهند و از REST APIها استفاده میکنند، میتوانند شامل یک اکشن ویجت اضافی برای درخواست دسترسی به فایل باشند. این اکشن نیاز به تابع فراخوانی اکشن مرتبط دارد تا یک شیء پاسخ تخصصی را برگرداند:
| اقدام انجام شد | تابع فراخوانی باید مقدار بازگشتی را برگرداند |
|---|---|
| درخواست دسترسی به فایل برای current_document | EditorFileScopeActionResponse |
برای استفاده از اکشن و شیء پاسخ این ویجت، همه موارد زیر باید صحیح باشند:
- این افزونه از API های REST استفاده می کند.
- این افزونه با استفاده از متد
CardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();کادر محاورهای مربوط به محدودهی فایل درخواست را نمایش میدهد. - این افزونه شامل دامنه ویرایشگر
https://www.googleapis.com/auth/drive.fileو تریگرonFileScopeGrantedدر مانیفست خود است.
درخواست دسترسی به فایل برای سند فعلی
برای درخواست دسترسی به فایل سند فعلی، مراحل زیر را دنبال کنید:
- یک کارت صفحه اصلی بسازید که بررسی کند آیا افزونه دامنه
drive.fileدارد یا خیر. - برای مواردی که به افزونه دامنهی
drive.fileاعطا نشده است، راهی ایجاد کنید تا از کاربران درخواست شود دامنهیdrive.fileرا برای سند فعلی اعطا کنند.
مثال: دسترسی به سند فعلی در Google Docs
مثال زیر رابطی برای Google Docs میسازد که اندازه سند فعلی را نمایش میدهد. اگر افزونه مجوز drive.file نداشته باشد، دکمهای را برای شروع مجوز دامنه فایل نمایش میدهد.
/**
* Build a simple card that checks selected items' quota usage. Checking
* quota usage requires user-permissions, so this add-on provides a button
* to request `drive.file` scope for items the add-on doesn't yet have
* permission to access.
*
* @param e The event object passed containing information about the
* current document.
* @return {Card}
*/
function onDocsHomepage(e) {
return createAddOnView(e);
}
function onFileScopeGranted(e) {
return createAddOnView(e);
}
/**
* For the current document, display either its quota information or
* a button that allows the user to provide permission to access that
* file to retrieve its quota details.
*
* @param e The event containing information about the current document
* @return {Card}
*/
function createAddOnView(e) {
var docsEventObject = e['docs'];
var builder = CardService.newCardBuilder();
var cardSection = CardService.newCardSection();
if (docsEventObject['addonHasFileScopePermission']) {
cardSection.setHeader(docsEventObject['title']);
// This add-on uses the recommended, limited-permission `drive.file`
// scope to get granular per-file access permissions.
// See: https://developers.google.com/drive/api/v2/about-auth
// If the add-on has access permission, read and display its quota.
cardSection.addWidget(
CardService.newTextParagraph().setText(
"This file takes up: " + getQuotaBytesUsed(docsEventObject['id'])));
} else {
// If the add-on does not have access permission, add a button that
// allows the user to provide that permission on a per-file basis.
cardSection.addWidget(
CardService.newTextParagraph().setText(
"The add-on needs permission to access this file's quota."));
var buttonAction = CardService.newAction()
.setFunctionName("onRequestFileScopeButtonClicked");
var button = CardService.newTextButton()
.setText("Request permission")
.setOnClickAction(buttonAction);
cardSection.addWidget(button);
}
return builder.addSection(cardSection).build();
}
/**
* Callback function for a button action. Instructs Docs to display a
* permissions dialog to the user, requesting `drive.file` scope for the
* current file on behalf of this add-on.
*
* @param {Object} e The parameters object that contains the document’s ID
* @return {editorFileScopeActionResponse}
*/
function onRequestFileScopeButtonClicked(e) {
return CardService.newEditorFileScopeActionResponseBuilder()
.requestFileScopeForActiveDocument().build();
}