Google Chat के मैसेज में लिंक की झलक देखना

जब उपयोगकर्ता Google Chat में कोई लिंक शेयर करते हैं, तो कॉन्टेक्स्ट स्विच होने से रोकने के लिए, आपका Chat ऐप्लिकेशन उनके मैसेज में कार्ड अटैच करके, लिंक की झलक दिखा सकता है. इस कार्ड से, उपयोगकर्ताओं को ज़्यादा जानकारी मिलती है और वे Google Chat से ही कार्रवाई कर पाते हैं.

Google Chat में, ऐड-ऑन उपयोगकर्ताओं को Google Chat ऐप्लिकेशन के तौर पर दिखते हैं. ज़्यादा जानने के लिए, Google Chat के एक्सटेंशन के बारे में खास जानकारी देखें.

उदाहरण के लिए, मान लें कि किसी कंपनी के सभी ग्राहक सेवा एजेंट और Case-y नाम का चैट ऐप्लिकेशन, Google Chat के एक स्पेस में शामिल हैं. एजेंट अक्सर चैट स्पेस में, ग्राहक सेवा से जुड़े केस के लिंक शेयर करते हैं. ऐसा करने पर, उनके सहयोगियों को केस का लिंक खोलकर, असाइनी, स्टेटस, और विषय जैसी जानकारी देखनी पड़ती है. इसी तरह, अगर किसी व्यक्ति को किसी केस का मालिकाना हक लेना है या उसका स्टेटस बदलना है, तो उसे लिंक खोलना होगा.

लिंक की झलक दिखाने की सुविधा चालू होने पर, स्पेस में मौजूद Chat ऐप्लिकेशन, Case-y, जब भी कोई व्यक्ति केस का लिंक शेयर करता है, तो वह एक कार्ड अटैच करता है. इस कार्ड में, असाइनी, स्टेटस, और विषय की जानकारी दिखती है. कार्ड पर मौजूद बटन की मदद से, एजेंट केस का मालिकाना हक ले सकते हैं और सीधे चैट स्ट्रीम से स्टेटस बदल सकते हैं.

जब कोई व्यक्ति अपने मैसेज में लिंक जोड़ता है, तो एक चिप दिखता है. इससे उसे पता चलता है कि चैट ऐप्लिकेशन में लिंक की झलक दिख सकती है.

चैट ऐप्लिकेशन में लिंक की झलक दिखाने की सुविधा के बारे में बताने वाला चिप

मैसेज भेजने के बाद, लिंक को Chat ऐप्लिकेशन पर भेजा जाता है. इसके बाद, यह ऐप्लिकेशन कार्ड जनरेट करता है और उसे उपयोगकर्ता के मैसेज से अटैच करता है.

चैट ऐप्लिकेशन, मैसेज में कार्ड अटैच करके लिंक की झलक दिखा रहा है

लिंक के साथ-साथ, कार्ड में लिंक के बारे में ज़्यादा जानकारी भी दी जाती है. इसमें बटन जैसे इंटरैक्टिव एलिमेंट भी शामिल होते हैं. आपका Chat ऐप्लिकेशन, बटन पर क्लिक करने जैसे उपयोगकर्ता के इंटरैक्शन के हिसाब से, अटैच किए गए कार्ड को अपडेट कर सकता है.

अगर किसी व्यक्ति को अपने मैसेज में कार्ड अटैच करके, Chat ऐप्लिकेशन में लिंक की झलक नहीं दिखानी है, तो वह झलक वाले चिप पर पर क्लिक करके, झलक दिखाने की सुविधा को बंद कर सकता है. उपयोगकर्ता, झलक हटाएं पर क्लिक करके, अटैच किए गए कार्ड को किसी भी समय हटा सकते हैं.

ज़रूरी शर्तें

Node.js

Google Workspace का एक ऐड-ऑन, जो Google Chat की सुविधाओं को बेहतर बनाता है. इसे बनाने के लिए, एचटीटीपी से जुड़ी शुरुआती जानकारी वाला लेख पढ़ें.

Apps Script

Google Workspace का एक ऐड-ऑन, जो Google Chat की सुविधाओं को बेहतर बनाता है. कोई ऐप्लिकेशन बनाने के लिए, Apps Script का शुरुआती कोर्स पूरा करें.

Google Cloud Console में, Chat ऐप्लिकेशन के कॉन्फ़िगरेशन पेज पर, example.com, support.example.com, और support.example.com/cases/ जैसे खास लिंक को यूआरएल पैटर्न के तौर पर रजिस्टर करें, ताकि आपका Chat ऐप्लिकेशन उनकी झलक दिखा सके.

लिंक की झलक दिखाने की सुविधा का कॉन्फ़िगरेशन मेन्यू

  1. Google Cloud Console खोलें.
  2. "Google Cloud" के बगल में, डाउन ऐरो पर क्लिक करें और Chat ऐप्लिकेशन का प्रोजेक्ट खोलें.
  3. खोज फ़ील्ड में, Google Chat API टाइप करें और Google Chat API पर क्लिक करें.
  4. मैनेज करें > कॉन्फ़िगरेशन पर क्लिक करें.
  5. 'लिंक की झलक' में जाकर, यूआरएल पैटर्न जोड़ें या उसमें बदलाव करें.
    1. नए यूआरएल पैटर्न के लिए, लिंक की झलकें कॉन्फ़िगर करने के लिए, यूआरएल पैटर्न जोड़ें पर क्लिक करें.
    2. किसी मौजूदा यूआरएल पैटर्न के कॉन्फ़िगरेशन में बदलाव करने के लिए, डाउन ऐरो पर क्लिक करें.
  6. होस्ट पैटर्न फ़ील्ड में, यूआरएल पैटर्न का डोमेन डालें. Chat ऐप्लिकेशन, इस डोमेन के लिंक की झलक दिखाएगा.

    अगर आपको Chat ऐप्लिकेशन में subdomain.example.com जैसे किसी खास सबडोमेन के लिंक की झलक देखनी है, तो सबडोमेन शामिल करें.

    Chat ऐप्लिकेशन में पूरे डोमेन के लिंक की झलक देखने के लिए, सबडोमेन के तौर पर तारे के निशान (*) के साथ वाइल्डकार्ड वर्ण डालें. उदाहरण के लिए, *.example.com, subdomain.example.com और any.number.of.subdomains.example.com से मैच करता है.

  7. पाथ प्रीफ़िक्स फ़ील्ड में, होस्ट पैटर्न डोमेन में जोड़ने के लिए कोई पाथ डालें.

    होस्ट पैटर्न डोमेन में मौजूद सभी यूआरएल से मैच करने के लिए, पाथ प्रीफ़िक्स को खाली छोड़ दें.

    उदाहरण के लिए, अगर होस्ट पैटर्न support.example.com है, तो support.example.com/cases/ पर होस्ट किए गए केस के यूआरएल मैच करने के लिए, cases/ डालें.

  8. हो गया पर क्लिक करें.

  9. सेव करें पर क्लिक करें.

अब जब भी कोई व्यक्ति, Chat ऐप्लिकेशन से जुड़े चैट स्पेस में किसी मैसेज में ऐसा लिंक शामिल करता है जो लिंक की झलक दिखाने वाले यूआरएल के पैटर्न से मैच करता है, तो आपका ऐप्लिकेशन उस लिंक की झलक दिखाता है.

किसी लिंक के लिए, लिंक की झलक दिखाने की सुविधा कॉन्फ़िगर करने के बाद, आपका Chat ऐप्लिकेशन उस लिंक को पहचान सकता है और उस पर ज़्यादा जानकारी अटैच करके उसकी झलक दिखा सकता है.

जब किसी व्यक्ति के मैसेज में ऐसा लिंक शामिल होता है जो लिंक की झलक दिखाने वाले यूआरएल पैटर्न से मेल खाता है, तो Chat के उन स्पेस में आपके Chat ऐप्लिकेशन को MessagePayload के साथ एक इवेंट ऑब्जेक्ट मिलता है जिनमें आपका Chat ऐप्लिकेशन शामिल होता है. पेलोड में, message.matchedUrl ऑब्जेक्ट में वह लिंक होता है जिसे उपयोगकर्ता ने मैसेज में शामिल किया है:

JSON

message: {
  matchedUrl: {
    url: "https://support.example.com/cases/case123"
  },
  ... // other message attributes redacted
}

MESSAGE इवेंट के पेलोड में matchedUrl फ़ील्ड मौजूद होने पर, आपका Chat ऐप्लिकेशन, झलक वाले लिंक की मदद से मैसेज में जानकारी जोड़ सकता है. आपका Chat ऐप्लिकेशन, टेक्स्ट मैसेज या कार्ड अटैच करके जवाब दे सकता है.

मैसेज से जवाब देना

सामान्य जवाबों के लिए, आपका Chat ऐप्लिकेशन किसी लिंक की झलक दिखा सकता है. इसके लिए, वह लिंक पर मैसेज भेजकर जवाब देता है. इस उदाहरण में एक मैसेज अटैच किया गया है, जिसमें लिंक की झलक वाले यूआरएल के पैटर्न से मैच करने वाले लिंक यूआरएल को दोहराया गया है.

Node.js

/**
 * Google Cloud Function that handles messages that have links whose
 * URLs match URL patterns configured for link previewing.
 *
 *
 * @param {Object} req Request sent from Google Chat space
 * @param {Object} res Response to send back
 */
exports.previewLinks = function previewLinks(req, res) {
  const chatEvent = req.body.chat;

  // Handle MESSAGE events
  if(chatEvent.messagePayload) {
    return res.send(handlePreviewLink(chatEvent.messagePayload.message));
  // Handle button clicks
  } else if(chatEvent.buttonClickedPayload) {
    return res.send(handleCardClick(chatEvent.buttonClickedPayload.message));
  }
};

/**
 * Respond to messages that have links whose URLs match URL patterns configured
 * for link previewing.
 *
 * @param {Object} chatMessage The chat message object from Google Workspace Add On event.
 * @return {Object} Response to send back depending on the matched URL.
 */
function handlePreviewLink(chatMessage) {
  // If the Chat app does not detect a link preview URL pattern, reply
  // with a text message that says so.
  if (!chatMessage.matchedUrl) {
    return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'No matchedUrl detected.'
    }}}}};
  }

  // Reply with a text message for URLs of the subdomain "text"
  if (chatMessage.matchedUrl.url.includes("text.example.com")) {
    return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'event.chat.messagePayload.message.matchedUrl.url: ' + chatMessage.matchedUrl.url
    }}}}};
  }
}

Apps Script

/**
 * Reply to messages that have links whose URLs match the pattern
 * "text.example.com" configured for link previewing.
 *
 * @param {Object} event The event object from Google Workspace Add-on.
 *
 * @return {Object} The action response.
 */
function onMessage(event) {
  // Stores the Google Chat event as a variable.
  const chatMessage = event.chat.messagePayload.message;

  // If the Chat app doesn't detect a link preview URL pattern, reply
  // with a text message that says so.
  if (!chatMessage.matchedUrl) {
    return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'No matchedUrl detected.'
    }}}}};
  }

  // Reply with a text message for URLs of the subdomain "text".
  if (chatMessage.matchedUrl.url.includes("text.example.com")) {
    return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'event.chat.messagePayload.message.matchedUrl.url: ' + chatMessage.matchedUrl.url
    }}}}};
  }
}

झलक वाले लिंक में कार्ड अटैच करने के लिए, DataActions ऐक्शन के साथ UpdateInlinePreviewAction टाइप का ChatDataActionMarkup ऑब्जेक्ट दिखाएं.

नीचे दिए गए उदाहरण में, Chat ऐप्लिकेशन उन मैसेज में झलक वाला कार्ड जोड़ता है जिनमें यूआरएल पैटर्न support.example.com शामिल होता है.

चैट ऐप्लिकेशन, मैसेज में कार्ड अटैच करके लिंक की झलक दिखा रहा है

Node.js

/**
 * Google Cloud Function that handles messages that have links whose
 * URLs match URL patterns configured for link previewing.
 *
 *
 * @param {Object} req Request sent from Google Chat space
 * @param {Object} res Response to send back
 */
exports.previewLinks = function previewLinks(req, res) {
  const chatEvent = req.body.chat;

  // Handle MESSAGE events
  if(chatEvent.messagePayload) {
    return res.send(handlePreviewLink(chatEvent.messagePayload.message));
  // Handle button clicks
  } else if(chatEvent.buttonClickedPayload) {
    return res.send(handleCardClick(chatEvent.buttonClickedPayload.message));
  }
};

/**
 * Respond to messages that have links whose URLs match URL patterns configured
 * for link previewing.
 *
 * @param {Object} chatMessage The chat message object from Google Workspace Add On event.
 * @return {Object} Response to send back depending on the matched URL.
 */
function handlePreviewLink(chatMessage) {
  // Attach a card to the message for URLs of the subdomain "support"
  if (chatMessage.matchedUrl.url.includes("support.example.com")) {
    // A hard-coded card is used in this example. In a real-life scenario,
    // the case information would be fetched and used to build the card.
    return { hostAppDataAction: { chatDataAction: { updateInlinePreviewAction: { cardsV2: [{
      cardId: 'attachCard',
      card: {
        header: {
          title: 'Example Customer Service Case',
          subtitle: 'Case basics',
        },
        sections: [{ widgets: [
        { decoratedText: { topLabel: 'Case ID', text: 'case123'}},
        { decoratedText: { topLabel: 'Assignee', text: 'Charlie'}},
        { decoratedText: { topLabel: 'Status', text: 'Open'}},
        { decoratedText: { topLabel: 'Subject', text: 'It won\'t turn on...' }},
        { buttonList: { buttons: [{
          text: 'OPEN CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123'
          }},
        }, {
          text: 'RESOLVE CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123?resolved=y',
          }},
        }, {
          text: 'ASSIGN TO ME',
          // Use runtime environment variable set with self URL
          onClick: { action: { function: process.env.BASE_URL }}
        }]}}
        ]}]
      }
    }]}}}};
  }
}

Apps Script

इस उदाहरण में, कार्ड का JSON दिखाकर कार्ड का मैसेज भेजा जाता है. Apps Script की कार्ड सेवा का भी इस्तेमाल किया जा सकता है.

/**
 * Attach a card to messages that have links whose URLs match the pattern
 * "support.example.com" configured for link previewing.
 *
 * @param {Object} event The event object from Google Workspace Add-on.
 *
 * @return {Object} The action response.
 */
function onMessage(event) {
  // Stores the Google Chat event as a variable.
  const chatMessage = event.chat.messagePayload.message;

  // Attach a card to the message for URLs of the subdomain "support".
  if (chatMessage.matchedUrl.url.includes("support.example.com")) {
    // A hard-coded card is used in this example. In a real-life scenario,
    // the case information would be fetched and used to build the card.
    return { hostAppDataAction: { chatDataAction: { updateInlinePreviewAction: { cardsV2: [{
      cardId: 'attachCard',
      card: {
        header: {
          title: 'Example Customer Service Case',
          subtitle: 'Case summary',
        },
        sections: [{ widgets: [
        { decoratedText: { topLabel: 'Case ID', text: 'case123'}},
        { decoratedText: { topLabel: 'Assignee', text: 'Charlie'}},
        { decoratedText: { topLabel: 'Status', text: 'Open'}},
        { decoratedText: { topLabel: 'Subject', text: 'It won\'t turn on...' }},
        { buttonList: { buttons: [{
          text: 'OPEN CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123'
          }},
        }, {
          text: 'RESOLVE CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123?resolved=y',
          }},
        }, {
          text: 'ASSIGN TO ME',
          // Clicking this button triggers the execution of the function
          // "assign" from the Apps Script project.
          onClick: { action: { function: 'assign'}}
        }]}}
        ]}]
      }
    }]}}}};
  }
}

जब उपयोगकर्ता लिंक की झलक दिखाने वाले कार्ड से इंटरैक्ट करते हैं, तो आपका Chat ऐप्लिकेशन उस कार्ड को अपडेट कर सकता है. जैसे, कार्ड पर बटन पर क्लिक करना.

कार्ड को अपडेट करने के लिए, आपके Chat ऐप्लिकेशन को इनमें से किसी एक ChatDataActionMarkup ऑब्जेक्ट के साथ ऐक्शन DataActions दिखाना होगा:

  • अगर मैसेज किसी उपयोगकर्ता ने भेजा है, तो UpdateMessageAction ऑब्जेक्ट दिखाएं.
  • अगर Chat ऐप्लिकेशन ने मैसेज भेजा है, तो UpdateInlinePreviewAction ऑब्जेक्ट दिखाएं.

मैसेज किसने भेजा है, यह पता करने के लिए इवेंट पेलोड (buttonClickedPayload) का इस्तेमाल करें. इससे यह पता चलता है कि मैसेज भेजने वाला व्यक्ति (message.sender.type), HUMAN (उपयोगकर्ता) या BOT (Chat ऐप्लिकेशन) पर सेट है या नहीं.

इस उदाहरण में दिखाया गया है कि जब कोई उपयोगकर्ता मुझे असाइन करें बटन पर क्लिक करता है, तो Chat ऐप्लिकेशन कैसे लिंक की झलक को अपडेट करता है. इसके लिए, कार्ड के असाइन करने वाला फ़ील्ड को अपडेट किया जाता है और बटन को बंद किया जाता है.

चैट ऐप्लिकेशन में, मैसेज में अटैच किए गए कार्ड के अपडेट किए गए वर्शन के साथ लिंक की झलक

Node.js

/**
 * Google Cloud Function that handles messages that have links whose
 * URLs match URL patterns configured for link previewing.
 *
 *
 * @param {Object} req Request sent from Google Chat space
 * @param {Object} res Response to send back
 */
exports.previewLinks = function previewLinks(req, res) {
  const chatEvent = req.body.chat;

  // Handle MESSAGE events
  if(chatEvent.messagePayload) {
    return res.send(handlePreviewLink(chatEvent.messagePayload.message));
  // Handle button clicks
  } else if(chatEvent.buttonClickedPayload) {
    return res.send(handleCardClick(chatEvent.buttonClickedPayload.message));
  }
};

/**
 * Respond to clicks by assigning user and updating the card that was attached to a
 * message with a previewed link.
 *
 * @param {Object} chatMessage The chat message object from Google Workspace Add On event.
 * @return {Object} Action response depending on the original message.
 */
function handleCardClick(chatMessage) {
  // Creates the updated card that displays "You" for the assignee
  // and that disables the button.
  //
  // A hard-coded card is used in this example. In a real-life scenario,
  // an actual assign action would be performed before building the card.
  const message = { cardsV2: [{
    cardId: 'attachCard',
    card: {
      header: {
        title: 'Example Customer Service Case',
        subtitle: 'Case basics',
      },
      sections: [{ widgets: [
        { decoratedText: { topLabel: 'Case ID', text: 'case123'}},
        // The assignee is now "You"
        { decoratedText: { topLabel: 'Assignee', text: 'You'}},
        { decoratedText: { topLabel: 'Status', text: 'Open'}},
        { decoratedText: { topLabel: 'Subject', text: 'It won\'t turn on...' }},
        { buttonList: { buttons: [{
          text: 'OPEN CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123'
          }},
        }, {
          text: 'RESOLVE CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123?resolved=y',
          }},
        }, {
          text: 'ASSIGN TO ME',
          // The button is now disabled
          disabled: true,
          // Use runtime environment variable set with self URL
          onClick: { action: { function: process.env.BASE_URL }}
        }]}}
      ]}]
    }
  }]};

  // Checks whether the message event originated from a human or a Chat app
  // to return the adequate action response.
  if(chatMessage.sender.type === 'HUMAN') {
    return { hostAppDataAction: { chatDataAction: { updateInlinePreviewAction: message }}};
  } else {
    return { hostAppDataAction: { chatDataAction: { updateMessageAction: message }}};
  }
}

Apps Script

इस उदाहरण में, कार्ड का JSON दिखाकर कार्ड का मैसेज भेजा जाता है. Apps Script की कार्ड सेवा का भी इस्तेमाल किया जा सकता है.

/**
 * Assigns and updates the card that's attached to a message with a
 * previewed link of the pattern "support.example.com".
 *
 * @param {Object} event The event object from the Google Workspace Add-on.
 *
 * @return {Object} Action response depending on the message author.
 */
function assign(event) {
  // Creates the updated card that displays "You" for the assignee
  // and that disables the button.
  //
  // A hard-coded card is used in this example. In a real-life scenario,
  // an actual assign action would be performed before building the card.
  const message = { cardsV2: [{
    cardId: 'attachCard',
    card: {
      header: {
        title: 'Example Customer Service Case',
        subtitle: 'Case summary',
      },
      sections: [{ widgets: [
        { decoratedText: { topLabel: 'Case ID', text: 'case123'}},
        // The assignee is now "You"
        { decoratedText: { topLabel: 'Assignee', text: 'You'}},
        { decoratedText: { topLabel: 'Status', text: 'Open'}},
        { decoratedText: { topLabel: 'Subject', text: 'It won\'t turn on...' }},
        { buttonList: { buttons: [{
          text: 'OPEN CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123'
          }},
        }, {
          text: 'RESOLVE CASE',
          onClick: { openLink: {
            url: 'https://support.example.com/orders/case123?resolved=y',
          }},
        }, {
          text: 'ASSIGN TO ME',
          // The button is now disabled
          disabled: true,
          onClick: { action: { function: 'assign'}}
        }]}}
      ]}]
    }
  }]};

  // Use the adequate action response type. It depends on whether the message
  // the preview link card is attached to was created by a human or a Chat app.
  if(event.chat.buttonClickedPayload.message.sender.type === 'HUMAN') {
    return { hostAppDataAction: { chatDataAction: { updateInlinePreviewAction: message }}};
  } else {
    return { hostAppDataAction: { chatDataAction: { updateMessageAction: message }}};
  }
}

सीमाएं और ज़रूरी बातें

Chat ऐप्लिकेशन के लिए, लिंक की झलक दिखाने की सुविधा कॉन्फ़िगर करते समय, इन सीमाओं और बातों का ध्यान रखें:

  • हर चैट ऐप्लिकेशन, ज़्यादा से ज़्यादा पांच यूआरएल पैटर्न के लिए लिंक की झलक दिखाने की सुविधा देता है.
  • Chat ऐप्लिकेशन में, हर मैसेज में एक लिंक की झलक दिखती है. अगर किसी मैसेज में, झलक दिखाने वाले एक से ज़्यादा लिंक मौजूद हैं, तो सिर्फ़ झलक दिखाने वाला पहला लिंक दिखता है.
  • चैट ऐप्लिकेशन सिर्फ़ उन लिंक की झलक दिखाते हैं जो https:// से शुरू होते हैं. इसलिए, https://support.example.com/cases/ की झलक दिखती है, लेकिन support.example.com/cases/ की नहीं.
  • अगर मैसेज में ऐसी कोई जानकारी शामिल नहीं है जो Chat ऐप्लिकेशन में भेजी जाती है, जैसे कि स्लैश कमांड, तो लिंक की झलक दिखाने की सुविधा से, Chat ऐप्लिकेशन में सिर्फ़ लिंक का यूआरएल भेजा जाता है.
  • अगर कोई उपयोगकर्ता लिंक पोस्ट करता है, तो Chat ऐप्लिकेशन सिर्फ़ तब लिंक की झलक दिखाने वाले कार्ड को अपडेट कर सकता है, जब उपयोगकर्ता उस कार्ड के साथ इंटरैक्ट करते हैं. जैसे, बटन पर क्लिक करना. उपयोगकर्ता के मैसेज को अलग-अलग समय पर अपडेट करने के लिए, Message संसाधन पर Chat API के update() तरीके को कॉल नहीं किया जा सकता.
  • चैट ऐप्लिकेशन को स्पेस में मौजूद सभी लोगों के लिए लिंक की झलक दिखानी होगी. इसलिए, मैसेज में privateMessageViewer फ़ील्ड को शामिल नहीं किया जाना चाहिए.

लिंक की झलक दिखाने की सुविधा लागू करने के दौरान, आपको अपने Chat ऐप्लिकेशन के लॉग पढ़कर, उसे डीबग करना पड़ सकता है. लॉग पढ़ने के लिए, Google Cloud Console पर लॉग एक्सप्लोरर पर जाएं.