איך אוספים ומנהלים אנשי קשר ב-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 היא הודעת טקסט עם הלחצן Add a contact (הוספת איש קשר). המשתמשים יכולים ללחוץ על הלחצן כדי לפתוח תיבת דו-שיח עם טופס הקשר.
  3. כשהמשתמש רואה את טופס יצירת הקשר, הוא מזין את פרטי הקשר בשדות ובווידג'טים הבאים:

    • שם פרטי ושם משפחה: הווידג'ט textInput שמקבל מחרוזות.
    • Birthdate: הווידג'ט dateTimePicker שמקבל תאריכים בלבד.
    • סוג איש קשר: ווידג'ט של selectionInput עם לחצני בחירה שמאפשר למשתמשים לבחור ולשלוח ערך של מחרוזת יחידה (Personal או Work).
    • הלחצן בדיקה ושליחה: מערך buttonList עם ווידג'ט button, שבו המשתמש לוחץ כדי לשלוח את הערכים שהזין.
  4. אפליקציית Google Chat מטפלת באירוע אינטראקציה מסוג CARD_CLICKED כדי לעבד את הערכים שהמשתמש מזין, ולהציג את הערכים בכרטיס אישור.

  5. המשתמש בודק את כרטיס האישור ולוחץ על הלחצן Submit כדי לסיים את הזנת הפרטים ליצירת קשר.

  6. אפליקציית Google Chat שולחת הודעת טקסט פרטית לאישור שליחת הבקשה.

מכינים את הסביבה

בקטע הזה נסביר איך יוצרים ומגדירים פרויקט ב-Google Cloud לאפליקציית Chat.

יצירת פרויקט של Google Cloud

מסוף Google Cloud

  1. במסוף Google Cloud, עוברים לתפריט > IAM & Admin > Create a Project.

    כניסה לדף Create a Project

  2. בשדה Project Name, מזינים שם תיאורי לפרויקט.

    אופציונלי: כדי לערוך את Project ID, לוחצים על Edit. אי אפשר לשנות את מזהה הפרויקט אחרי יצירת הפרויקט, לכן חשוב לבחור מזהה שמתאים לצרכים שלכם לכל משך החיים של הפרויקט.

  3. בשדה Location, לוחצים על Browse כדי להציג מיקומים פוטנציאליים לפרויקט. לאחר מכן לוחצים על בחירה.
  4. לוחצים על יצירה. מסוף Google Cloud מנווט לדף Dashboard והפרויקט נוצר תוך כמה דקות.

CLI של gcloud

ניגשים ל-CLI של Google Cloud (gcloud) באחת מסביבות הפיתוח הבאות:

  • Cloud Shell: כדי להשתמש בטרמינל אונליין שבו כבר מוגדר ה-CLI של gcloud, צריך להפעיל את Cloud Shell.
    הפעלת Cloud Shell
  • מעטפת מקומית: כדי להשתמש בסביבת פיתוח מקומית צריך להתקין ולהפעיל את ה-CLI של gcloud.
    כדי ליצור פרויקט ב-Cloud, משתמשים בפקודה gcloud projects create:
    gcloud projects create PROJECT_ID
    מחליפים את PROJECT_ID במזהה של הפרויקט שרוצים ליצור.

הגדרת אימות והרשאה

כדי להשתמש באפליקציות של Google Chat, צריך להגדיר מסך הסכמה של OAuth, שמאפשר למשתמשים לאשר את האפליקציה באפליקציות של Google Workspace, כולל ב-Google Chat.

במדריך הזה פורסים אפליקציית Chat לצורכי בדיקה ולשימוש פנימי בלבד, לכן מותר להשתמש במידע למעקב אחרי מקום פנוי במסך ההסכמה. לפני פרסום אפליקציית Chat, צריך להחליף את פרטי ה-placeholder במידע אמיתי.

  1. במסוף Google Cloud, נכנסים אל תפריט > APIs & Services> OAuth consent screen.

    מעבר למסך ההסכמה של OAuth

  2. בקטע סוג משתמש, בוחרים באפשרות פנימי ולוחצים על יצירה.

  3. בשדה App name, מקלידים Contact Manager.

  4. בקטע User support email, בוחרים את כתובת האימייל שלכם או קבוצת Google מתאימה.

  5. בקטע פרטים ליצירת קשר עם המפתח, מזינים את כתובת האימייל שלכם.

  6. לוחצים על שמירה והמשך.

  7. בדף היקפים, לוחצים על שמירה והמשך. (אפליקציית Chat לא דורשת היקפי הרשאות OAuth).

  8. מעיינים בסיכום ולוחצים על חזרה ללוח הבקרה.

יצירה ופריסה של אפליקציית Chat

בקטע הבא תעתיקו ותעדכנו פרויקט Apps Script שלם שמכיל את כל קוד האפליקציה הנדרש לאפליקציית 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": {}
}

איך מוצאים את מספר הפרויקט והמזהה שלו ב-Cloud

  1. במסוף Google Cloud, נכנסים לפרויקט ב-Cloud.

    כניסה למסוף Google Cloud

  2. לוחצים על סמל ההגדרות והכלים > הגדרות הפרויקט.

  3. שימו לב לערכים בשדות Project number ו-Project ID. תוכלו להשתמש בהם בקטעים הבאים.

יצירת פרויקט Apps Script

כדי ליצור פרויקט Apps Script ולקשר אותו לפרויקט ב-Cloud:

  1. לוחצים על הלחצן הבא כדי לפתוח את פרויקט Apps Script‏ ניהול אנשי קשר ב-Google Chat.
    פתיחת הפרויקט
  2. לוחצים על סקירה כללית.
  3. בדף הסקירה הכללית, לוחצים על הסמל ליצירת עותק יצירת עותק.
  4. נותנים שם להעתקה של פרויקט Apps Script:

    1. לוחצים על עותק של 'ניהול אנשי קשר ב-Google Chat'.

    2. בשדה Project title, מקלידים Contact Manager - Google Chat app.

    3. לוחצים על Rename.

הגדרת הפרויקט ב-Cloud של פרויקט Apps Script

  1. בפרויקט של Apps Script, לוחצים על הסמל של הגדרות הפרויקט Project Settings.
  2. בקטע פרויקט Google Cloud Platform ‏ (GCP), לוחצים על שינוי פרויקט.
  3. בקטע מספר פרויקט GCP, מדביקים את מספר הפרויקט ב-Cloud.
  4. לוחצים על Set project (הגדרת פרויקט). הפרויקט ב-Cloud ופרויקט Apps Script מחוברים עכשיו.

יצירת פריסה של Apps Script

עכשיו, אחרי שכל הקוד מוכן, פורסים את הפרויקט ב-Apps Script. משתמשים במזהה הפריסה כשמגדירים את אפליקציית Chat ב-Google Cloud.

  1. ב-Apps Script, פותחים את הפרויקט של אפליקציית Chat.

    כניסה לדף Apps Script

  2. לוחצים על פריסה > פריסה חדשה.

  3. אם האפשרות Add-on (תוסף) עדיין לא מסומנת, לוחצים על סמל סוגי הפריסה הסמל של הגדרות הפרויקט לצד Select type (בחירת סוג) ובוחרים באפשרות Add-on (תוסף).

  4. בשדה Description, מזינים תיאור של הגרסה הזו, למשל Test of Contact Manager.

  5. לוחצים על פריסת. מערכת Apps Script תדווח על פריסת הסקריפט ותספק מזהה פריסת הסקריפט.

  6. לוחצים על Copy כדי להעתיק את מזהה הפריסה, ואז לוחצים על Done.

הגדרת אפליקציית Chat במסוף Google Cloud

בקטע הזה נסביר איך להגדיר את Google Chat API במסוף Google Cloud עם מידע על אפליקציית Chat, כולל מזהה הפריסה שיצרתם זה עתה מהפרויקט ב-Apps Script.

  1. במסוף Google Cloud, לוחצים על תפריט &gt; מוצרים נוספים &gt; Google Workspace &gt; ספריית מוצרים &gt; Google Chat API &gt; ניהול &gt; הגדרות אישיות.

    כניסה להגדרת Chat API

  2. בשדה App name, מקלידים Contact Manager.

  3. בשדה כתובת URL של הדמות, מקלידים https://developers.google.com/chat/images/contact-icon.png.

  4. בקטע תיאור, מקלידים Manage your personal and business contacts.

  5. מעבירים את המתג הפעלת תכונות אינטראקטיביות למצב פעיל.

  6. בקטע Functionality, מסמנים את התיבות קבלת הודעות 1:1 והצטרפות למרחבים משותפים ולשיחות קבוצתיות.

  7. בקטע הגדרות החיבור, בוחרים באפשרות Apps Script.

  8. בשדה Deployment ID, מדביקים את מזהה הפריסה של Apps Script שהעתקתם בקטע הקודם כשיצרתם את הפריסה של Apps Script.

  9. בקטע פקודות דרך שורת הפקודות, מגדירים את פקודות הלוכסן /about ו-/addContact:

    1. לוחצים על הוספת פקודה של שורת הפקודות כדי להגדיר את הפקודה הראשונה של הלוכסן.
    2. בשדה Name, מקלידים /about.
    3. בשדה Command ID, מקלידים 1.
    4. בקטע תיאור, מקלידים Learn how to use this Chat app to manage your contacts.
    5. בוחרים באפשרות פתיחת תיבת דו-שיח.
    6. לוחצים על סיום.
    7. לוחצים על הוספת פקודה דרך שורת הפקודות כדי להגדיר פקודה נוספת דרך שורת הפקודות.
    8. בשדה Name, מקלידים /addContact.
    9. בשדה Command ID, מקלידים 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. בשדה Add 1 or more people, מקלידים את שם אפליקציית Chat.
  4. בוחרים את אפליקציית Chat בתוצאות. תיפתח צ'אט אישי.

  1. בצ'אט האישי החדש עם אפליקציית Chat, מקלידים /addContact ומקישים על Enter.

  2. בתיבת הדו-שיח שנפתחת, מזינים את הפרטים ליצירת קשר:

    1. בשדה הטקסט First and last name, מזינים שם.
    2. בוחרים תאריך בחלונית לבחירת תאריך Birthdate.
    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, עוברים לדף Manage resources. לוחצים על תפריט > IAM & Admin > Manage Resources.

    כניסה ל-Resource Manager

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete .
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.