جمع جهات الاتصال وإدارتها في Google Chat

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

اطّلِع على تطبيق Chat أثناء تشغيله:

  • نموذج التواصل من خلال أمر يبدأ بشرطة مائلة
    الشكل 1. يردّ تطبيق Chat على الرمز المائل /about برسالة نصية وزر يؤديان إلى فتح نموذج تواصل.
  • نموذج تواصل في مربّع حوار
    الشكل 2. يفتح تطبيق Chat مربّع حوار يمكن للمستخدمين فيه إدخال معلومات عن جهة اتصال.
  • مربّع حوار التأكيد والمراجعة
    الشكل 3. يعرض تطبيق Chat مربّع حوار تأكيد ليتمكّن المستخدمون من مراجعة المعلومات وتأكيدها قبل إرسالها.
  • رسالة نصية تؤكّد جهة الاتصال الجديدة
    الشكل 4. بعد إرسال المستخدم للنموذج، يرسل تطبيق Chat رسالة نصية خاصة لتأكيد عملية الإرسال.
  • نموذج التواصل من رسالة البطاقة
    الشكل 5 يطلب تطبيق Chat من المستخدمين أيضًا إضافة جهة اتصال من بطاقة في رسالة.

المتطلبات الأساسية

الأهداف

البنية

تم إنشاء تطبيق Chat باستخدام Google Apps Script ويستخدم أحداث التفاعل لمعالجة طلبات مستخدمي Chat والردّ عليها.

يوضّح ما يلي كيفية تفاعل المستخدم عادةً مع تطبيق Chat:

  1. يفتح مستخدم رسالة مباشرة باستخدام تطبيق Chat، أو يضيف تطبيق Chat إلى مساحة حالية.

  2. يطلب تطبيق Chat من المستخدم إضافة جهة اتصال من خلال إنشاء نموذج تواصل وعرضه كعنصر card. لعرض نموذج التواصل، يردّ تطبيق Chat على المستخدمين بالطُرق التالية:

    • يتم الرد على الإشارات باستخدام @والرسائل المباشرة برسالة بطاقة تحتوي على نموذج الاتصال.
    • الاستجابة لأمر الشرطة المائلة /addContact من خلال فتح مربّع حوار يحتوي على نموذج التواصل
    • يستجيب للأمر الشرطة المائلة /about برسالة نصية تحتوي على زر إضافة جهة اتصال يمكن للمستخدمين النقر عليه لفتح مربع حوار يتضمن نموذج الاتصال.
  3. عند عرض نموذج التواصل، يُدخل المستخدم معلومات الاتصال في الحقول والتطبيقات المصغّرة التالية:

    • الاسم الأول واسم العائلة: أداة textInput تقبل سلاسل.
    • تاريخ الميلاد: أداة dateTimePicker لا تقبل سوى التواريخ
    • نوع جهة الاتصال: عنصر تحكم selectionInput أزرار اختيار تتيح للمستخدمين اختيار قيمة سلسلة واحدة إرسالها (إما Personal أو Work).
    • الزر مراجعة وإرسال: صفيف buttonList يحتوي على عنصر تحكّم button ينقر عليه المستخدم لإرسال القيم التي أدخلها.
  4. يعالج تطبيق Google Chat حدث تفاعل CARD_CLICKED لمعالجة القيم التي يُدخلها المستخدم، ويعرض القيم في بطاقة تأكيد.

  5. يراجع المستخدم بطاقة التأكيد وينقر على الزر إرسال لإنهاء معلومات الاتصال.

  6. يُرسِل تطبيق Google Chat رسالة نصية خاصة تؤكِّد إرسال العينة.

إعداد البيئة

يوضّح هذا القسم كيفية إنشاء مشروع على Google Cloud وضبط إعداداته لتطبيق Chat.

إنشاء مشروع على Google Cloud

Google Cloud Console

  1. في Google Cloud Console، انتقِل إلى القائمة > إدارة الهوية وإمكانية الوصول والمشرف > إنشاء مشروع.

    الانتقال إلى صفحة "إنشاء مشروع"

  2. في حقل اسم المشروع، أدخِل اسمًا وصفيًا لمشروعك.

    اختياري: لتعديل رقم تعريف المشروع، انقر على تعديل. لا يمكن تغيير معرّف المشروع بعد إنشائه، لذا اختَر معرّفًا يلبي احتياجاتك طوال مدّة المشروع.

  3. في حقل الموقع الجغرافي، انقر على تصفّح لعرض المواقع الجغرافية المحتملة لمشروعك. بعد ذلك، انقر على اختيار.
  4. انقر على إنشاء. تنتقل وحدة تحكّم Google Cloud إلى صفحة "لوحة البيانات" ويتم إنشاء مشروعك خلال بضع دقائق.

gcloud CLI

في إحدى بيئات التطوير التالية، يمكنك الوصول إلى Google Cloud CLI (gcloud):

  • Cloud Shell: لاستخدام وحدة طرفية على الإنترنت تم إعداد واجهة سطر أوامر gcloud CLI عليها، فعِّل Cloud Shell.
    تفعيل Cloud Shell
  • Shell على الجهاز: لاستخدام بيئة تطوير على الجهاز، ثبِّت ابدأ أداة gcloud CLI.
    لإنشاء مشروع على Cloud، استخدِم الأمر gcloud projects create:
    gcloud projects create PROJECT_ID
    استبدِل PROJECT_ID بتحديد رقم تعريف المشروع الذي تريد إنشاؤه.

إعداد المصادقة والتفويض

تتطلّب تطبيقات Google Chat منك ضبط شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth لكي تتمكّن المستخدمون من تفويض تطبيقك في تطبيقات Google Workspace، بما في ذلك Google Chat.

في هذا الدليل التعليمي، يتم نشر تطبيق Chat مخصّص فقط للاختبار والاستخدام الداخلي، لذا لا بأس باستخدام معلومات العنصر النائب لشاشة الموافقة. قبل نشر تطبيق Chat، استبدِل أي معلومات عن العناصر النائبة بمعلومات حقيقية.

  1. في وحدة تحكّم Google Cloud، انتقِل إلى القائمة > واجهات برمجة التطبيقات والخدمات > شاشة موافقة OAuth.

    الانتقال إلى شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth

  2. ضمن نوع المستخدم، اختَر داخلي، ثم انقر على إنشاء.

  3. في اسم التطبيق، اكتب Contact Manager.

  4. في عنوان البريد الإلكتروني لفريق دعم المستخدمين، اختَر عنوان بريدك الإلكتروني أو مجموعة مناسبة في Google.

  5. ضمن معلومات الاتصال بالمطوِّر، أدخِل عنوان بريدك الإلكتروني.

  6. انقر على حفظ ومتابعة.

  7. في صفحة النطاقات، انقر على حفظ ومتابعة. (لا يتطلب تطبيق Chat أي نطاقات OAuth).

  8. راجِع الملخص، ثم انقر على الرجوع إلى لوحة البيانات.

إنشاء تطبيق Chat ونشره

في القسم التالي، ستنسخ وتُعدِّل مشروعًا كاملاً من "برمجة تطبيقات Google" يحتوي على كل رمز التطبيق المطلوب لتطبيق Chat، لذا لن يكون عليك نسخ كل ملف ولصقه.

يمكنك اختياريًا عرض المشروع بأكمله على GitHub.

العرض على GitHub

في ما يلي نظرة عامة على كل ملف:

main.gs

تعالج جميع منطق التطبيق، بما في ذلك أحداث التفاعل عندما يرسل المستخدمون رسائل إلى تطبيق Chat أو ينقرون على الأزرار من رسالة تطبيق Chat أو يفتحون مربّعات الحوار ويغلقونها.

عرض رمز main.gs

apps-script/contact-form-app/main.gs
/**
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Responds to a MESSAGE interaction event in Google Chat.
 *
 * @param {Object} event the MESSAGE interaction event from Chat API.
 * @return {Object} message response that opens a dialog or sends private
 *                          message with text and card.
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    switch (event.message.slashCommand.commandId) {
      case 1:
        // If the slash command is "/about", responds with a text message and button
        // that opens a dialog.
        return {
          text: "Manage your personal and business contacts 📇. To add a " +
                  "contact, use the slash command `/addContact`.",
          accessoryWidgets: [{
            buttonList: { buttons: [{
              text: "Add Contact",
              onClick: { action: {
                function: "openInitialDialog",
                interaction: "OPEN_DIALOG"
              }}
            }]}
          }]
        }
      case 2:
        // If the slash command is "/addContact", opens a dialog.
        return openInitialDialog();
    }
  }

  // If user sends the Chat app a message without a slash command, the app responds
  // privately with a text and card to add a contact.
  return {
    privateMessageViewer: event.user,
    text: "To add a contact, try `/addContact` or complete the form below:",
    cardsV2: [{
      cardId: "addContactForm",
      card: {
        header: { title: "Add a contact" },
        sections:[{ widgets: CONTACT_FORM_WIDGETS.concat([{
          buttonList: { buttons: [{
            text: "Review and submit",
            onClick: { action: { function : "openConfirmation" }}
          }]}
        }])}]
      }
    }]
  };
}

/**
 * Responds to CARD_CLICKED interaction events in Google Chat.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @return {Object} message responses specific to the dialog handling.
 */
function onCardClick(event) {
  // Initial dialog form page
  if (event.common.invokedFunction === "openInitialDialog") {
    return openInitialDialog();
  // Confirmation dialog form page
  } else if (event.common.invokedFunction === "openConfirmation") {
    return openConfirmation(event);
  // Submission dialog form page
  } else if (event.common.invokedFunction === "submitForm") {
    return submitForm(event);
  }
}

/**
 * Opens the initial step of the dialog that lets users add contact details.
 *
 * @return {Object} a message with an action response to open a dialog.
 */
function openInitialDialog() {
  return { actionResponse: {
    type: "DIALOG",
    dialogAction: { dialog: { body: { sections: [{
      header: "Add new contact",
      widgets: CONTACT_FORM_WIDGETS.concat([{
        buttonList: { buttons: [{
          text: "Review and submit",
          onClick: { action: { function: "openConfirmation" }}
        }]}
      }])
    }]}}}
  }};
}

/**
 * Returns the second step as a dialog or card message that lets users confirm details.
 *
 * @param {Object} event the interactive event with form inputs.
 * @return {Object} returns a dialog or private card message.
 */
function openConfirmation(event) {
  const name = fetchFormValue(event, "contactName") ?? "";
  const birthdate = fetchFormValue(event, "contactBirthdate") ?? "";
  const type = fetchFormValue(event, "contactType") ?? "";
  const cardConfirmation = {
    header: "Your contact",
    widgets: [{
      textParagraph: { text: "Confirm contact information and submit:" }}, {
      textParagraph: { text: "<b>Name:</b> " + name }}, {
      textParagraph: {
        text: "<b>Birthday:</b> " + convertMillisToDateString(birthdate)
      }}, {
      textParagraph: { text: "<b>Type:</b> " + type }}, {
      buttonList: { buttons: [{
        text: "Submit",
        onClick: { action: {
          function: "submitForm",
          parameters: [{
            key: "contactName", value: name }, {
            key: "contactBirthdate", value: birthdate }, {
            key: "contactType", value: type
          }]
        }}
      }]}
    }]
  };

  // Returns a dialog with contact information that the user input.
  if (event.isDialogEvent) {
    return { action_response: {
      type: "DIALOG",
      dialogAction: { dialog: { body: { sections: [ cardConfirmation ]}}}
    }};
  }

  // Updates existing card message with contact information that the user input.
  return {
    actionResponse: { type: "UPDATE_MESSAGE" },
    privateMessageViewer: event.user,
    cardsV2: [{
      card: { sections: [cardConfirmation]}
    }]
  }
}

/**
  * Validates and submits information from a dialog or card message
  * and notifies status.
  *
  * @param {Object} event the interactive event with parameters.
  * @return {Object} a message response that opens a dialog or posts a private
  *                  message.
  */
function submitForm(event) {
  const contactName = event.common.parameters["contactName"];
  // Checks to make sure the user entered a contact name.
  // If no name value detected, returns an error message.
  if (!contactName) {
    const errorMessage = "Don't forget to name your new contact!";
    if (event.dialogEventType === "SUBMIT_DIALOG") {
      return { actionResponse: {
        type: "DIALOG",
        dialogAction: { actionStatus: {
          statusCode: "INVALID_ARGUMENT",
          userFacingMessage: errorMessage
        }}
      }};
    } else {
      return {
        privateMessageViewer: event.user,
        text: errorMessage
      };
    }
  }

  // The Chat app indicates that it received form data from the dialog or card.
  // Sends private text message that confirms submission.
  const confirmationMessage = "✅ " + contactName + " has been added to your contacts.";
  if (event.dialogEventType === "SUBMIT_DIALOG") {
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: { actionStatus: {
          statusCode: "OK",
          userFacingMessage: "Success " + contactName
        }}
      }
    }
  } else {
    return {
      actionResponse: { type: "NEW_MESSAGE" },
      privateMessageViewer: event.user,
      text: confirmationMessage
    };
  }
}

/**
 * Extracts form input value for a given widget.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @param {String} widgetName a unique ID for the widget, specified in the widget's name field.
 * @returns the value inputted by the user, null if no value can be found.
 */
function fetchFormValue(event, widgetName) {
  const formItem = event.common.formInputs[widgetName][""];
  // For widgets that receive StringInputs data, the value input by the user.
  if (formItem.hasOwnProperty("stringInputs")) {
    const stringInput = event.common.formInputs[widgetName][""].stringInputs.value[0];
    if (stringInput != null) {
      return stringInput;
    }
  // For widgets that receive dateInput data, the value input by the user.
  } else if (formItem.hasOwnProperty("dateInput")) {
    const dateInput = event.common.formInputs[widgetName][""].dateInput.msSinceEpoch;
     if (dateInput != null) {
       return dateInput;
     }
  }

  return null;
}

/**
 * Converts date in milliseconds since epoch to user-friendly string.
 *
 * @param {Object} millis the milliseconds since epoch time.
 * @return {string} Display-friend date (English US).
 */
function convertMillisToDateString(millis) {
  const date = new Date(millis);
  const options = { year: 'numeric', month: 'long', day: 'numeric' };
  return date.toLocaleDateString('en-US', options);
}
contactForm.gs

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

عرض رمز contactForm.gs

apps-script/contact-form-app/contactForm.gs
/**
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * The section of the contact card that contains the form input widgets. Used in a dialog and card message.
 * To add and preview widgets, use the Card Builder: https://addons.gsuite.google.com/uikit/builder
 */
const CONTACT_FORM_WIDGETS = [
  {
    "textInput": {
      "name": "contactName",
      "label": "First and last name",
      "type": "SINGLE_LINE"
    }
  },
  {
    "dateTimePicker": {
      "name": "contactBirthdate",
      "label": "Birthdate",
      "type": "DATE_ONLY"
    }
  },
  {
    "selectionInput": {
      "name": "contactType",
      "label": "Contact type",
      "type": "RADIO_BUTTON",
      "items": [
        {
          "text": "Work",
          "value": "Work",
          "selected": false
        },
        {
          "text": "Personal",
          "value": "Personal",
          "selected": false
        }
      ]
    }
  }
];
appsscript.json

بيان Apps Script الذي يحدِّد مشروع Apps Script ويضبطه لتطبيق Chat

عرض رمز appsscript.json

apps-script/contact-form-app/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {}
}

البحث عن رقم مشروعك على Google Cloud ورقم تعريفه

  1. في وحدة تحكّم Google Cloud، انتقِل إلى مشروعك على Cloud.

    الانتقال إلى وحدة التحكّم في Google Cloud

  2. انقر على "الإعدادات والأدوات" > إعدادات المشروع.

  3. دوِّن القيم في حقلَي رقم المشروع ورقم تعريف المشروع. ويمكنك استخدامها في الأقسام التالية.

إنشاء مشروع "برمجة تطبيقات Google"

لإنشاء مشروع "برمجة تطبيقات Google" وربطه بمشروعك على Google Cloud:

  1. انقر على الزر التالي لفتح مشروع Apps Script‏ إدارة جهات الاتصال في Google Chat.
    فتح المشروع
  2. انقر على رمز نظرة عامة.
  3. في صفحة النظرة العامة، انقر على رمز لإنشاء نسخة إنشاء نسخة.
  4. أدخِل اسمًا لنسختك من مشروع Apps Script:

    1. انقر على نسخة من مقالة "إدارة جهات الاتصال في Google Chat".

    2. في عنوان المشروع، اكتب Contact Manager - Google Chat app.

    3. انقر على إعادة تسمية.

ضبط مشروع Cloud لمشروع "برمجة التطبيقات"

  1. في مشروعك على Apps Script، انقر على رمز إعدادات المشروع إعدادات المشروع.
  2. ضمن مشروع Google Cloud Platform (GCP)، انقر على تغيير المشروع.
  3. في رقم مشروع Google Cloud Platform، الصِق رقم مشروعك على Cloud.
  4. انقر على ضبط المشروع. تم ربط مشروع Cloud بمشروع Apps Script.

إنشاء عملية نشر في Apps Script

الآن بعد أن أصبحت جميع الرموز في مكانها الصحيح، انشر مشروع "برمجة تطبيقات Google". يتم استخدام معرّف النشر عند ضبط إعدادات تطبيق Chat في Google Cloud.

  1. في Apps Script، افتح مشروع تطبيق Chat.

    الانتقال إلى Apps Script

  2. انقر على نشر > نشر جديد.

  3. إذا لم يسبق اختيار إضافة، انقر على أنواع عمليات النشر رمز إعدادات المشروع بجانب اختيار النوع واختَر إضافة.

  4. في الوصف، أدخِل وصفًا لهذا الإصدار، مثل Test of Contact Manager.

  5. انقر على نشر. تسجِّل خدمة "برمجة التطبيقات" عملية النشر الناجحة وتوفّر رقم تعريف النشر.

  6. انقر على نسخ لنسخ رقم تعريف عملية النشر، ثم انقر على تم.

ضبط تطبيق Chat في Google Cloud Console

يعرض هذا القسم كيفية ضبط Google Chat API في Google Cloud Console باستخدام معلومات عن تطبيق Chat، بما في ذلك رقم تعريف عملية النشر التي أنشأتها للتو من مشروع "برمجة التطبيقات".

  1. في وحدة تحكّم Google Cloud، انقر على القائمة > المزيد من المنتجات > Google Workspace > مكتبة المنتجات > Google Chat API > إدارة > الضبط.

    الانتقال إلى إعدادات Chat API

  2. في اسم التطبيق، اكتب Contact Manager.

  3. في عنوان URL للصورة الرمزية، اكتب https://developers.google.com/chat/images/contact-icon.png.

  4. في الوصف، اكتب Manage your personal and business contacts.

  5. انقر على مفتاح التبديل تفعيل الميزات التفاعلية لتفعيل هذه الميزة.

  6. ضمن الوظيفة، ضَع علامة في مربّعَي الاختيار تلقّي رسائل بين شخصَين و الانضمام إلى المساحات والمحادثات الجماعية.

  7. ضمن إعدادات الاتصال، اختَر Apps Script.

  8. في معرّف عملية النشر، الصِق معرّف عملية النشر في Apps Script الذي نسخته في القسم السابق عند إنشاء عملية النشر في Apps Script.

  9. ضِمن أوامر الشرطة المائلة، يمكنك إعداد الأوامر التي تبدأ بشرطة مائلة /about و/addContact:

    1. انقر على إضافة أمر شرطة مائلة لإعداد أول أمر شرطة مائلة.
    2. في الاسم، اكتب /about.
    3. في رقم تعريف الطلب، اكتب 1.
    4. في الوصف، اكتب Learn how to use this Chat app to manage your contacts.
    5. اختَر فتح مربّع حوار.
    6. انقر على تم.
    7. انقر على إضافة أمر يبدأ بشرطة مائلة لإعداد أمر آخر يبدأ بشرطة مائلة.
    8. في Name (الاسم)، اكتب /addContact
    9. في رقم تعريف الطلب، اكتب 2.
    10. في الوصف، اكتب Submit information about a contact.
    11. اختَر فتح مربّع حوار.
    12. انقر على تم.
  10. ضمن مستوى الرؤية، ضَع علامة في مربّع الاختيار إتاحة تطبيق Chat هذا لمستخدمين محدّدين ومجموعات محدّدة في YOUR DOMAIN وأدخِل عنوان بريدك الإلكتروني.

  11. ضمن السجلّات، اختَر تسجيل الأخطاء في السجلّ.

  12. انقر على حفظ. ستظهر رسالة محفوظة للإعدادات.

تطبيق Chat جاهز للتثبيت والاختبار في Chat.

اختبار تطبيق Chat

لاختبار تطبيق Chat، افتح مساحة رسالة مباشرة باستخدام تطبيق Chat وأرسِل رسالة:

  1. افتح Google Chat باستخدام حساب Google Workspace الذي قدّمته عند إضافة نفسك كمختبِر موثوق به.

    الانتقال إلى Google Chat

  2. انقر على رمز محادثة جديدة.
  3. في حقل إضافة مستخدم واحد أو أكثر، اكتب اسم تطبيق Chat.
  4. اختَر تطبيق Chat من النتائج. ستظهر رسالة مباشرة .

  1. في الرسالة المباشرة الجديدة مع تطبيق Chat، اكتب /addContactواضغط على مفتاح Enter.

  2. في مربّع الحوار الذي يفتح، أدخِل معلومات الاتصال:

    1. في حقل النص الاسم الأول واسم العائلة، أدخِل اسمًا.
    2. في أداة اختيار التاريخ تاريخ الميلاد، اختَر تاريخًا.
    3. ضمن نوع جهة الاتصال، انقر على زر الاختيار العمل أو شخصي.
  3. انقر على المراجعة والإرسال.

  4. في مربّع حوار التأكيد، راجِع المعلومات التي أرسلتها وانقر على إرسال. يردّ تطبيق Chat برسالة نصية بعنوان CONTACT NAME has been added to your contacts..

  5. يمكنك أيضًا اختياريًا اختبار نموذج التواصل وإرساله بالطُرق التالية:

    • استخدِم الأمر /about الذي يتضمّن الشرطة المائلة. يردّ تطبيق Chat برسالة نصية وزرّ تطبيق مصغّر ملحق يظهر عليه Add a contact. يمكنك النقر على الزر لفتح مربّع حوار يتضمّن نموذج التواصل.
    • أرسِل رسالة مباشرة إلى تطبيق Chat بدون استخدام الأمر الشرطة المائلة، مثل Hello. يردّ تطبيق Chat برسالة نصية وبطاقة تحتوي على نموذج التواصل.

تَنظيم

لتجنُّب تحمُّل رسوم على حسابك على Google Cloud مقابل موارد المستخدَمة في هذا الدليل التعليمي، ننصحك بحذف مشروع Cloud.

  1. في وحدة تحكُّم Google Cloud، انتقِل إلى صفحة إدارة الموارد. انقر على القائمة > إدارة الهوية وإمكانية الوصول والمشرف > إدارة الموارد.

    انتقِل إلى "مدير الموارد"

  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف .
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.