الإجراءات العامة

الإجراءات الشاملة هي عناصر قائمة تتيح للمستخدم فتح صفحة ويب جديدة أو عرض بطاقات جديدة لواجهة المستخدم أو تنفيذ دالة محدّدة في "برمجة تطبيقات Google" عند تحديدها. وتتشابه هذه الإجراءات كثيرًا مع إجراءات البطاقة، إلا أنّ الإجراءات العامة يتم وضعها دائمًا على كل بطاقة في الإضافة، بغض النظر عن سياق الإضافة الحالي.

باستخدام الإجراءات العامة، يمكنك التأكّد من أنّ المستخدم يمكنه دائمًا الوصول إلى وظائف معيّنة، بغض النظر عن الجزء الذي يتفاعل معه في الإضافة. في ما يلي بعض الأمثلة على حالات استخدام الإجراءات الشاملة:

  • افتح صفحة ويب خاصة بالإعدادات (أو اعرض بطاقة إعدادات).
  • عرض معلومات المساعدة للمستخدم
  • ابدأ سير عمل جديدًا، مثل "إضافة عميل جديد".
  • عرض بطاقة تتيح للمستخدم إرسال ملاحظات حول الإضافة

عندما يكون لديك إجراء لا يعتمد على السياق الحالي، عليك التفكير في تحويله إلى إجراء عام.

استخدام الإجراءات العامة

يتم ضبط الإجراءات الشاملة في بيان مشروع الإضافة. بعد ضبط إجراء عالمي، يصبح متاحًا دائمًا لمستخدمي الإضافة. إذا كان المستخدم يعرض بطاقة، ستظهر دائمًا مجموعة الإجراءات الشاملة التي حدّدتها في قائمة البطاقة، بعد أي إجراءات بطاقة حدّدتها لتلك البطاقة. تظهر الإجراءات العامة في قوائم البطاقات بالترتيب نفسه الذي تم تحديدها به في ملف بيان الإضافة.

ضبط الإجراءات العامة

يمكنك ضبط الإجراءات الشاملة في ملف البيان الخاص بالإضافة. اطّلِع على ملفات البيان للحصول على مزيد من التفاصيل.

بالنسبة إلى كل إجراء، عليك تحديد النص الذي يجب أن يظهر في القائمة الخاصة بهذا الإجراء. يمكنك بعد ذلك تحديد حقل openLink يشير إلى أنّ الإجراء يجب أن يفتح صفحة ويب مباشرةً في علامة تبويب جديدة. بدلاً من ذلك، يمكنك تحديد حقل runFunction يحدّد دالة ردّ اتصال في Apps Script يتم تنفيذها عند اختيار الإجراء العام.

عند استخدام runFunction، تنفّذ دالة رد الاتصال المحدّدة عادةً أحد الإجراءات التالية:

  • تنشئ هذه الدالة بطاقات واجهة المستخدم لعرضها على الفور من خلال عرض كائن UniversalActionResponse تم إنشاؤه.
  • يفتح عنوان URL، ربما بعد تنفيذ مهام أخرى، من خلال عرض كائن UniversalActionResponse تم إنشاؤه.
  • تنفيذ مهام في الخلفية لا تؤدي إلى التبديل إلى بطاقة جديدة أو فتح عنوان URL في هذه الحالة، لا تعرض دالة رد الاتصال أي قيمة.

عند استدعاء دالة رد الاتصال، يتم تمرير عنصر حدث إليها يحتوي على معلومات حول البطاقة المفتوحة وسياق الإضافة.

مثال

يعرض مقتطف الرمز التالي مثالاً على جزء من ملف البيان لإضافة Google Workspace تستخدم الإجراءات الشاملة مع توسيع نطاق Gmail. يضبط الرمز نطاق البيانات الوصفية بشكل صريح حتى يتمكّن الإضافة من تحديد هوية مرسل الرسالة المفتوحة.

  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata"
  ],
  "addOns": {
    "common": {
      "name": "Universal Actions Only Addon",
      "logoUrl": "https://www.example.com/hosted/images/2x/my-icon.png",
      "openLinkUrlPrefixes": [
        "https://www.google.com",
        "https://www.example.com/urlbase"
      ],
      "universalActions": [{
          "label": "Open google.com",
          "openLink": "https://www.google.com"
        }, {
          "label": "Open contact URL",
          "runFunction": "openContactURL"
        }, {
          "label": "Open settings",
          "runFunction": "createSettingsResponse"
        }, {
          "label": "Run background sync",
          "runFunction": "runBackgroundSync"
      }],
      ...
    },
    "gmail": {
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "getContextualAddOn"
        }
      ]
    },
    ...
  },
  ...

تنفّذ الإجراءات العامة الثلاثة المحدّدة في المثال السابق ما يلي:

  • يؤدي فتح google.com إلى فتح https://www.google.com في علامة تبويب جديدة.
  • ينفّذ الأمر فتح عنوان URL الخاص بجهة الاتصال دالة تحدّد عنوان URL الذي سيتم فتحه، ثم يفتحه في علامة تبويب جديدة باستخدام عنصر OpenLink. ينشئ الرمز عنوان URL باستخدام عنوان البريد الإلكتروني للمرسِل.
  • يؤدي تنفيذ فتح الإعدادات إلى تشغيل الدالة createSettingsCards() المحدّدة في مشروع البرنامج النصي للإضافة. تعرض هذه الدالة كائن UniversalActionResponse صالحًا يحتوي على مجموعة من البطاقات مع إعدادات الإضافات ومعلومات أخرى. بعد أن تنتهي الدالة من إنشاء هذا العنصر، تعرض واجهة المستخدم قائمة البطاقات (راجِع عرض بطاقات متعددة).
  • يؤدي تشغيل المزامنة في الخلفية إلى تنفيذ الدالة runBackgroundSync() المحدّدة في مشروع نص برمجي للإضافة. لا تنشئ هذه الدالة بطاقات، بل تنفّذ بعض مهام الخلفية الأخرى التي لا تغيّر واجهة المستخدم. بما أنّ الدالة لا تعرض UniversalActionResponse، لن تعرض واجهة المستخدم بطاقة جديدة عند انتهاء الدالة. بدلاً من ذلك، تعرض واجهة المستخدم مؤشر تحميل دائريًا أثناء تشغيل الدالة.

في ما يلي مثال على كيفية إنشاء الدوال openContactURL() وcreateSettingsResponse() وrunBackgroundSync():

/**
 * Open a contact URL.
 * @param {Object} e an event object
 * @return {UniversalActionResponse}
 */
function openContactURL(e) {
  // Activate temporary Gmail scopes, in this case so that the
  // open message metadata can be read.
  var accessToken = e.gmail.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  // Build URL to open based on a base URL and the sender's email.
  // This URL must be included in the openLinkUrlPrefixes whitelist.
  var messageId = e.gmail.messageId;
  var message = GmailApp.getMessageById(messageId);
  var sender = message.getFrom();
  var url = "https://www.example.com/urlbase/" + sender;
  return CardService.newUniversalActionResponseBuilder()
      .setOpenLink(CardService.newOpenLink()
          .setUrl(url))
      .build();
}

/**
 * Create a collection of cards to control the add-on settings and
 * present other information. These cards are displayed in a list when
 * the user selects the associated "Open settings" universal action.
 *
 * @param {Object} e an event object
 * @return {UniversalActionResponse}
 */
function createSettingsResponse(e) {
  return CardService.newUniversalActionResponseBuilder()
      .displayAddOnCards(
          [createSettingCard(), createAboutCard()])
      .build();
}

/**
 * Create and return a built settings card.
 * @return {Card}
 */
function createSettingCard() {
  return CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle('Settings'))
      .addSection(CardService.newCardSection()
          .addWidget(CardService.newSelectionInput()
              .setType(CardService.SelectionInputType.CHECK_BOX)
              .addItem("Ask before deleting contact", "contact", false)
              .addItem("Ask before deleting cache", "cache", false)
              .addItem("Preserve contact ID after deletion", "contactId", false))
          // ... continue adding widgets or other sections here ...
      ).build();   // Don't forget to build the card!
}

/**
 * Create and return a built 'About' informational card.
 * @return {Card}
 */
function createAboutCard() {
  return CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle('About'))
      .addSection(CardService.newCardSection()
          .addWidget(CardService.newTextParagraph()
              .setText('This add-on manages contact information. For more '
                  + 'details see the <a href="https://www.example.com/help">'
                  + 'help page</a>.'))
      // ... add other information widgets or sections here ...
      ).build();  // Don't forget to build the card!
}

/**
 * Run background tasks, none of which should alter the UI.
 * Also records the time of sync in the script properties.
 *
 * @param {Object} e an event object
 */
function runBackgroundSync(e) {
  var props = PropertiesService.getUserProperties();
  props.setProperty("syncTime", new Date().toString());

  syncWithContacts();  // Not shown.
  updateCache();       // Not shown.
  validate();          // Not shown.

  // no return value tells the UI to keep showing the current card.
}