CINXE.COM

Manage projects with Google Chat, Vertex AI, and Firestore  |  Google for Developers

<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Google for Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#fff"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/developers/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/touchicon-180-new.png"><link rel="canonical" href="https://developers.google.com/workspace/chat/tutorial-project-management"><link rel="search" type="application/opensearchdescription+xml" title="Google for Developers" href="https://developers.google.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developers.google.com/workspace/chat/tutorial-project-management" /><link rel="alternate" hreflang="x-default" href="https://developers.google.com/workspace/chat/tutorial-project-management" /><link rel="alternate" hreflang="ar" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=fr" /><link rel="alternate" hreflang="de" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=de" /><link rel="alternate" hreflang="he" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=he" /><link rel="alternate" hreflang="hi" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=hi" /><link rel="alternate" hreflang="id" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=id" /><link rel="alternate" hreflang="it" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=it" /><link rel="alternate" hreflang="ja" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=th" /><link rel="alternate" hreflang="tr" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developers.google.com/workspace/chat/tutorial-project-management?hl=vi" /><title>Manage projects with Google Chat, Vertex AI, and Firestore &nbsp;|&nbsp; Google for Developers</title> <meta property="og:title" content="Manage projects with Google Chat, Vertex AI, and Firestore &nbsp;|&nbsp; Google for Developers"><meta property="og:url" content="https://developers.google.com/workspace/chat/tutorial-project-management"><meta property="og:image" content="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/opengraph/white.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Manage projects with Google Chat, Vertex AI, and Firestore" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Google Workspace", "item": "https://developers.google.com/workspace" },{ "@type": "ListItem", "position": 2, "name": "Google Chat", "item": "https://developers.google.com/workspace/chat" },{ "@type": "ListItem", "position": 3, "name": "Manage projects with Google Chat, Vertex AI, and Firestore", "item": "https://developers.google.com/workspace/chat/tutorial-project-management" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="white" type="article" layout="docs" concierge='closed' display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/workspace"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="Google Workspace" src="https://fonts.gstatic.com/s/i/productlogos/googleg/v6/16px.svg" srcset=" https://fonts.gstatic.com/s/i/productlogos/googleg/v6/16px.svg" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item devsite-has-google-wordmark"> <a href="https://developers.google.com/workspace" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Google Workspace" > <svg class="devsite-google-wordmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 148 48"> <title>Google</title> <path class="devsite-google-wordmark-svg-path" d="M19.58,37.65c-9.87,0-18.17-8.04-18.17-17.91c0-9.87,8.3-17.91,18.17-17.91c5.46,0,9.35,2.14,12.27,4.94l-3.45,3.45c-2.1-1.97-4.93-3.49-8.82-3.49c-7.21,0-12.84,5.81-12.84,13.02c0,7.21,5.64,13.02,12.84,13.02c4.67,0,7.34-1.88,9.04-3.58c1.4-1.4,2.32-3.41,2.66-6.16H19.58v-4.89h16.47c0.18,0.87,0.26,1.92,0.26,3.06c0,3.67-1.01,8.21-4.24,11.44C28.93,35.9,24.91,37.65,19.58,37.65z M61.78,26.12c0,6.64-5.1,11.53-11.36,11.53s-11.36-4.89-11.36-11.53c0-6.68,5.1-11.53,11.36-11.53S61.78,19.43,61.78,26.12z M56.8,26.12c0-4.15-2.96-6.99-6.39-6.99c-3.43,0-6.39,2.84-6.39,6.99c0,4.11,2.96,6.99,6.39,6.99C53.84,33.11,56.8,30.22,56.8,26.12z M87.25,26.12c0,6.64-5.1,11.53-11.36,11.53c-6.26,0-11.36-4.89-11.36-11.53c0-6.68,5.1-11.53,11.36-11.53C82.15,14.59,87.25,19.43,87.25,26.12zM82.28,26.12c0-4.15-2.96-6.99-6.39-6.99c-3.43,0-6.39,2.84-6.39,6.99c0,4.11,2.96,6.99,6.39,6.99C79.32,33.11,82.28,30.22,82.28,26.12z M112.09,15.29v20.7c0,8.52-5.02,12.01-10.96,12.01c-5.59,0-8.95-3.76-10.22-6.81l4.41-1.83c0.79,1.88,2.71,4.1,5.81,4.1c3.8,0,6.16-2.36,6.16-6.77v-1.66h-0.18c-1.14,1.4-3.32,2.62-6.07,2.62c-5.76,0-11.05-5.02-11.05-11.49c0-6.51,5.28-11.57,11.05-11.57c2.75,0,4.93,1.22,6.07,2.58h0.18v-1.88H112.09z M107.64,26.16c0-4.06-2.71-7.03-6.16-7.03c-3.49,0-6.42,2.97-6.42,7.03c0,4.02,2.93,6.94,6.42,6.94C104.93,33.11,107.64,30.18,107.64,26.16z M120.97,3.06v33.89h-5.07V3.06H120.97z M140.89,29.92l3.93,2.62c-1.27,1.88-4.32,5.11-9.61,5.11c-6.55,0-11.28-5.07-11.28-11.53c0-6.86,4.77-11.53,10.71-11.53c5.98,0,8.91,4.76,9.87,7.34l0.52,1.31l-15.42,6.38c1.18,2.31,3.01,3.49,5.59,3.49C137.79,33.11,139.58,31.84,140.89,29.92zM128.79,25.77l10.31-4.28c-0.57-1.44-2.27-2.45-4.28-2.45C132.24,19.04,128.66,21.31,128.79,25.77z"/> </svg>Workspace </a> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab > <a href="https://developers.google.com/workspace" track-metadata-eventdetail="https://developers.google.com/workspace" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - home" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Home" track-name="home" > Home </a> </tab> <tab class="devsite-active"> <a href="https://developers.google.com/workspace/chat" track-metadata-eventdetail="https://developers.google.com/workspace/chat" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - google chat" track-metadata-module="primary nav" aria-label="Google Chat, selected" data-category="Site-Wide Custom Events" data-label="Tab: Google Chat" track-name="google chat" > Google Chat </a> </tab> <tab class="devsite-dropdown "> <a href="https://developers.google.com/workspace/products-menu" track-metadata-eventdetail="https://developers.google.com/workspace/products-menu" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - all products" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: All products" track-name="all products" > All products </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for All products" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/products-menu" track-metadata-position="nav - all products" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: All products" track-name="all products" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Google Workspace apps</li> <li class="devsite-nav-item"> <a href="https://developers.google.com/admin-sdk" track-type="nav" track-metadata-eventdetail="https://developers.google.com/admin-sdk" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Admin console" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Admin console </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/cloud-search" track-type="nav" track-metadata-eventdetail="https://developers.google.com/cloud-search" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Cloud Search" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Cloud Search </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/gmail" track-type="nav" track-metadata-eventdetail="https://developers.google.com/gmail" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Gmail" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Gmail </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/calendar" track-type="nav" track-metadata-eventdetail="https://developers.google.com/calendar" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Google Calendar" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Calendar </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/chat" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/chat" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Google Chat" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Chat </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/classroom" track-type="nav" track-metadata-eventdetail="https://developers.google.com/classroom" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Google Classroom" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Classroom </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/docs" track-type="nav" track-metadata-eventdetail="https://developers.google.com/docs" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-label="Tab menu: All products - Google Docs" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Docs </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/drive" track-type="nav" track-metadata-eventdetail="https://developers.google.com/drive" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="google workspace apps" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: All products - Google Drive" > <div class="devsite-nav-item-title"> Google Drive </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/forms" track-type="nav" track-metadata-eventdetail="https://developers.google.com/forms" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Forms" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Forms </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/keep" track-type="nav" track-metadata-eventdetail="https://developers.google.com/keep" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Keep" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Keep </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/meet" track-type="nav" track-metadata-eventdetail="https://developers.google.com/meet" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Meet" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Meet </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/sheets" track-type="nav" track-metadata-eventdetail="https://developers.google.com/sheets" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Sheets" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Sheets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/sites" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/sites" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Sites" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Sites </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/slides" track-type="nav" track-metadata-eventdetail="https://developers.google.com/slides" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Slides" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Slides </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/tasks" track-type="nav" track-metadata-eventdetail="https://developers.google.com/tasks" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-category="Workspace top menu navigation" data-label="Tab menu: All products - Google Tasks" > <div class="devsite-nav-item-title"> Google Tasks </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/vault" track-type="nav" track-metadata-eventdetail="https://developers.google.com/vault" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline=" " tooltip data-label="Tab menu: All products - Google Vault" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Google Vault </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Extend, automate &amp; share</li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/add-ons" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/add-ons" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="extend, automate &amp; share" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: All products - Add-ons" > <div class="devsite-nav-item-title"> Add-ons </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/apps-script" track-type="nav" track-metadata-eventdetail="https://developers.google.com/apps-script" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="extend, automate &amp; share" tooltip data-label="Tab menu: All products - Apps Script" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Apps Script </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/chat/overview" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/chat/overview" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="extend, automate &amp; share" tooltip data-label="Tab menu: All products - Chat apps" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Chat apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/drive/api/guides/about-apps" track-type="nav" track-metadata-eventdetail="https://developers.google.com/drive/api/guides/about-apps" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="extend, automate &amp; share" tooltip data-label="Tab menu: All products - Drive apps" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Drive apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/marketplace" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/marketplace" track-metadata-position="nav - all products" track-metadata-module="tertiary nav" track-metadata-module_headline="extend, automate &amp; share" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: All products - Marketplace" > <div class="devsite-nav-item-title"> Marketplace </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown "> <a href="https://developers.google.com/workspace/resources-menu" track-metadata-eventdetail="https://developers.google.com/workspace/resources-menu" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - resources" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > Resources </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Resources" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/resources-menu" track-metadata-position="nav - resources" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Tools</li> <li class="devsite-nav-item"> <a href="https://admin.google.com/" track-type="nav" track-metadata-eventdetail="https://admin.google.com/" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools" tooltip data-category="Workspace top menu navigation" target="admin-console" data-label="Tab menu: Resources - Admin console" > <div class="devsite-nav-item-title"> Admin console </div> </a> </li> <li class="devsite-nav-item"> <a href="https://script.google.com/" track-type="nav" track-metadata-eventdetail="https://script.google.com/" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools" tooltip target="_blank" data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Apps Script dashboard" > <div class="devsite-nav-item-title"> Apps Script dashboard </div> </a> </li> <li class="devsite-nav-item"> <a href="https://console.cloud.google.com/workspace-api" track-type="nav" track-metadata-eventdetail="https://console.cloud.google.com/workspace-api" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools" tooltip target="console" data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Google Cloud console" > <div class="devsite-nav-item-title"> Google Cloud console </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/explore" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/explore" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools" tooltip data-label="Tab menu: Resources - APIs Explorer" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> APIs Explorer </div> </a> </li> <li class="devsite-nav-item"> <a href="https://addons.gsuite.google.com/uikit/builder" track-type="nav" track-metadata-eventdetail="https://addons.gsuite.google.com/uikit/builder" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="tools" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Card Builder" target="_blank" > <div class="devsite-nav-item-title"> Card Builder </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Training &amp; support</li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/guides/get-started" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/guides/get-started" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="training &amp; support" tooltip data-label="Tab menu: Resources - How to get started" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> How to get started </div> </a> </li> <li class="devsite-nav-item"> <a href="https://codelabs.developers.google.com/?product=googleworkspace" track-type="nav" track-metadata-eventdetail="https://codelabs.developers.google.com/?product=googleworkspace" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="training &amp; support" tooltip data-category="Workspace top menu navigation" target="_blank" data-label="Tab menu: Resources - Codelabs" > <div class="devsite-nav-item-title"> Codelabs </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/support" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/support" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="training &amp; support" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Developer support" > <div class="devsite-nav-item-title"> Developer support </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Updates</li> <li class="devsite-nav-item"> <a href="https://developers.googleblog.com/search/?query=Google+Workspace" track-type="nav" track-metadata-eventdetail="https://developers.googleblog.com/search/?query=Google+Workspace" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="updates" tooltip target="_blank" data-label="Tab menu: Resources - Blog" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> Blog </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/preview" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/preview" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="updates" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Developer previews" > <div class="devsite-nav-item-title"> Developer Previews </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/workspace/newsletters" track-type="nav" track-metadata-eventdetail="https://developers.google.com/workspace/newsletters" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="updates" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: Resources - Newsletter" > <div class="devsite-nav-item-title"> Newsletter </div> </a> </li> <li class="devsite-nav-item"> <a href="https://twitter.com/workspacedevs" track-type="nav" track-metadata-eventdetail="https://twitter.com/workspacedevs" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="updates" tooltip data-label="Tab menu: Resources - X (Twitter)" target="_blank" data-category="Workspace top menu navigation" > <div class="devsite-nav-item-title"> X (Twitter) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://www.youtube.com/channel/UCUcg6az6etU_gRtZVAhBXaw" track-type="nav" track-metadata-eventdetail="https://www.youtube.com/channel/UCUcg6az6etU_gRtZVAhBXaw" track-metadata-position="nav - resources" track-metadata-module="tertiary nav" track-metadata-module_headline="updates" tooltip data-category="Workspace top menu navigation" data-label="Tab menu: Resources - YouTube" target="_blank" > <div class="devsite-nav-item-title"> YouTube </div> </a> </li> </ul> </div> </div> </div> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Google Chat" tenant-name="Google for Developers" project-scope="/workspace/chat" url-scoped="https://developers.google.com/s/results/workspace/chat" > <form class="devsite-search-form" action="https://developers.google.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <devsite-user enable-profiles fp-auth id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/workspace/chat" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Google Chat" > Google Chat </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developers.google.com/workspace/chat" track-metadata-eventdetail="https://developers.google.com/workspace/chat" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developers.google.com/workspace/chat/overview" track-metadata-eventdetail="https://developers.google.com/workspace/chat/overview" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - guides" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" > Guides </a> </tab> <tab > <a href="https://developers.google.com/workspace/chat/api/reference" track-metadata-eventdetail="https://developers.google.com/workspace/chat/api/reference" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - reference" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" > Reference </a> </tab> <tab class="devsite-active"> <a href="https://developers.google.com/workspace/chat/samples" track-metadata-eventdetail="https://developers.google.com/workspace/chat/samples" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - samples" track-metadata-module="primary nav" aria-label="Samples, selected" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" > Samples </a> </tab> <tab > <a href="https://developers.google.com/workspace/chat/support" track-metadata-eventdetail="https://developers.google.com/workspace/chat/support" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - support" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Support" track-name="support" > Support </a> </tab> <tab > <a href="https://addons.gsuite.google.com/uikit/builder" track-metadata-eventdetail="https://addons.gsuite.google.com/uikit/builder" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - card builder" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Card builder" track-name="card builder" > Card builder </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/workspace"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="Google Workspace" src="https://fonts.gstatic.com/s/i/productlogos/googleg/v6/16px.svg" srcset=" https://fonts.gstatic.com/s/i/productlogos/googleg/v6/16px.svg" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item devsite-has-google-wordmark"> <a href="https://developers.google.com/workspace" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Google Workspace" > <svg class="devsite-google-wordmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 148 48"> <title>Google</title> <path class="devsite-google-wordmark-svg-path" d="M19.58,37.65c-9.87,0-18.17-8.04-18.17-17.91c0-9.87,8.3-17.91,18.17-17.91c5.46,0,9.35,2.14,12.27,4.94l-3.45,3.45c-2.1-1.97-4.93-3.49-8.82-3.49c-7.21,0-12.84,5.81-12.84,13.02c0,7.21,5.64,13.02,12.84,13.02c4.67,0,7.34-1.88,9.04-3.58c1.4-1.4,2.32-3.41,2.66-6.16H19.58v-4.89h16.47c0.18,0.87,0.26,1.92,0.26,3.06c0,3.67-1.01,8.21-4.24,11.44C28.93,35.9,24.91,37.65,19.58,37.65z M61.78,26.12c0,6.64-5.1,11.53-11.36,11.53s-11.36-4.89-11.36-11.53c0-6.68,5.1-11.53,11.36-11.53S61.78,19.43,61.78,26.12z M56.8,26.12c0-4.15-2.96-6.99-6.39-6.99c-3.43,0-6.39,2.84-6.39,6.99c0,4.11,2.96,6.99,6.39,6.99C53.84,33.11,56.8,30.22,56.8,26.12z M87.25,26.12c0,6.64-5.1,11.53-11.36,11.53c-6.26,0-11.36-4.89-11.36-11.53c0-6.68,5.1-11.53,11.36-11.53C82.15,14.59,87.25,19.43,87.25,26.12zM82.28,26.12c0-4.15-2.96-6.99-6.39-6.99c-3.43,0-6.39,2.84-6.39,6.99c0,4.11,2.96,6.99,6.39,6.99C79.32,33.11,82.28,30.22,82.28,26.12z M112.09,15.29v20.7c0,8.52-5.02,12.01-10.96,12.01c-5.59,0-8.95-3.76-10.22-6.81l4.41-1.83c0.79,1.88,2.71,4.1,5.81,4.1c3.8,0,6.16-2.36,6.16-6.77v-1.66h-0.18c-1.14,1.4-3.32,2.62-6.07,2.62c-5.76,0-11.05-5.02-11.05-11.49c0-6.51,5.28-11.57,11.05-11.57c2.75,0,4.93,1.22,6.07,2.58h0.18v-1.88H112.09z M107.64,26.16c0-4.06-2.71-7.03-6.16-7.03c-3.49,0-6.42,2.97-6.42,7.03c0,4.02,2.93,6.94,6.42,6.94C104.93,33.11,107.64,30.18,107.64,26.16z M120.97,3.06v33.89h-5.07V3.06H120.97z M140.89,29.92l3.93,2.62c-1.27,1.88-4.32,5.11-9.61,5.11c-6.55,0-11.28-5.07-11.28-11.53c0-6.86,4.77-11.53,10.71-11.53c5.98,0,8.91,4.76,9.87,7.34l0.52,1.31l-15.42,6.38c1.18,2.31,3.01,3.49,5.59,3.49C137.79,33.11,139.58,31.84,140.89,29.92zM128.79,25.77l10.31-4.28c-0.57-1.44-2.27-2.45-4.28-2.45C132.24,19.04,128.66,21.31,128.79,25.77z"/> </svg>Workspace </a> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/workspace" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Home" track-name="home" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Google Chat" track-name="google chat" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Chat" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Chat </span> </a> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/workspace/chat" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat/overview" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Guides" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Guides </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat/api/reference" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Reference" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Reference </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat/samples" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Samples </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat/support" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Support" track-name="support" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Support" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Support </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="https://addons.gsuite.google.com/uikit/builder" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Card builder" track-name="card builder" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Card builder" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Card builder </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/workspace/products-menu" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: All products" track-name="all products" data-category="Site-Wide Custom Events" data-label="Responsive Tab: All products" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All products </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: All products" track-name="all products" > <span class="devsite-nav-text" tooltip menu="All products"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="All products"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/workspace/resources-menu" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Resources" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Resources </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > <span class="devsite-nav-text" tooltip menu="Resources"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Resources"> </span> </span> </li> </ul> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/workspace/chat/samples" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/samples" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/samples" ><span class="devsite-nav-text" tooltip>Overview</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Tutorials</span> </div></li> <li class="devsite-nav-item"><a href="/workspace/chat/tutorial-ai-knowledge-assistant" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/tutorial-ai-knowledge-assistant" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/tutorial-ai-knowledge-assistant" ><span class="devsite-nav-text" tooltip>Answer questions with AI</span></a></li> <li class="devsite-nav-item"><a href="/workspace/chat/tutorial-incident-response" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/tutorial-incident-response" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/tutorial-incident-response" ><span class="devsite-nav-text" tooltip>Respond to incidents</span></a></li> <li class="devsite-nav-item"><a href="/workspace/chat/tutorial-project-management" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/tutorial-project-management" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/tutorial-project-management" ><span class="devsite-nav-text" tooltip>Manage projects</span></a></li> <li class="devsite-nav-item"><a href="/workspace/chat/tutorial-contact-app" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/tutorial-contact-app" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/tutorial-contact-app" ><span class="devsite-nav-text" tooltip>Collect and manage contacts</span></a></li> <li class="devsite-nav-item"><a href="/workspace/chat/tutorial-schedule-meetings" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /workspace/chat/tutorial-schedule-meetings" track-type="bookNav" track-name="click" track-metadata-eventdetail="/workspace/chat/tutorial-schedule-meetings" ><span class="devsite-nav-text" tooltip>Schedule meetings</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Codelabs</span> </div></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://codelabs.developers.google.com/codelabs/chat-apps-gemini" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://codelabs.developers.google.com/codelabs/chat-apps-gemini" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://codelabs.developers.google.com/codelabs/chat-apps-gemini" ><span class="devsite-nav-text" tooltip>Build apps for Google Chat with Gemini</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://developers.google.com/codelabs/google-chat-poll-app" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://developers.google.com/codelabs/google-chat-poll-app" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://developers.google.com/codelabs/google-chat-poll-app" ><span class="devsite-nav-text" tooltip>Interactive poll</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>GitHub</span> </div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Call the Chat API</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/apps-script-samples/tree/main/chat/advanced-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/apps-script-samples/tree/main/chat/advanced-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/apps-script-samples/tree/main/chat/advanced-service" ><span class="devsite-nav-text" tooltip>Apps Script</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/node-samples/tree/main/chat/client-libraries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/node-samples/tree/main/chat/client-libraries" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/node-samples/tree/main/chat/client-libraries" ><span class="devsite-nav-text" tooltip>Node.js</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/java-samples/tree/main/chat/client-libraries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/java-samples/tree/main/chat/client-libraries" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/java-samples/tree/main/chat/client-libraries" ><span class="devsite-nav-text" tooltip>Java</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/python-samples/tree/main/chat/client-libraries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/python-samples/tree/main/chat/client-libraries" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/python-samples/tree/main/chat/client-libraries" ><span class="devsite-nav-text" tooltip>Python</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Build an interactive Chat app</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/google-chat-samples/tree/main/apps-script" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/google-chat-samples/tree/main/apps-script" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/google-chat-samples/tree/main/apps-script" ><span class="devsite-nav-text" tooltip>Apps Script</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/google-chat-samples/tree/main/node" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/google-chat-samples/tree/main/node" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/google-chat-samples/tree/main/node" ><span class="devsite-nav-text" tooltip>Node.js</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/google-chat-samples/tree/main/java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/google-chat-samples/tree/main/java" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/google-chat-samples/tree/main/java" ><span class="devsite-nav-text" tooltip>Java</span></a></li><li class="devsite-nav-item"><a href="https://github.com/googleworkspace/google-chat-samples/tree/main/python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/googleworkspace/google-chat-samples/tree/main/python" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/googleworkspace/google-chat-samples/tree/main/python" ><span class="devsite-nav-text" tooltip>Python</span></a></li></ul></div></li> </ul> <ul class="devsite-nav-list" menu="All products" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Google Workspace apps </span> </span> </li> <li class="devsite-nav-item"> <a href="/admin-sdk" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Admin console" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Admin console </span> </a> </li> <li class="devsite-nav-item"> <a href="/cloud-search" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cloud Search" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cloud Search </span> </a> </li> <li class="devsite-nav-item"> <a href="/gmail" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gmail" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gmail </span> </a> </li> <li class="devsite-nav-item"> <a href="/calendar" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Calendar" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Calendar </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Chat" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Chat </span> </a> </li> <li class="devsite-nav-item"> <a href="/classroom" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Classroom" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Classroom </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Docs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Docs </span> </a> </li> <li class="devsite-nav-item"> <a href="/drive" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Drive" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Drive </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip >   </span> </span> </li> <li class="devsite-nav-item"> <a href="/forms" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Forms" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Forms </span> </a> </li> <li class="devsite-nav-item"> <a href="/keep" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Keep" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Keep </span> </a> </li> <li class="devsite-nav-item"> <a href="/meet" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Meet" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Meet </span> </a> </li> <li class="devsite-nav-item"> <a href="/sheets" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Sheets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Sheets </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/sites" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Sites" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Sites </span> </a> </li> <li class="devsite-nav-item"> <a href="/slides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Slides" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Slides </span> </a> </li> <li class="devsite-nav-item"> <a href="/tasks" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Tasks" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Tasks </span> </a> </li> <li class="devsite-nav-item"> <a href="/vault" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Vault" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Vault </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Extend, automate &amp; share </span> </span> </li> <li class="devsite-nav-item"> <a href="/workspace/add-ons" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Add-ons" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Add-ons </span> </a> </li> <li class="devsite-nav-item"> <a href="/apps-script" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Apps Script" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Apps Script </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/chat/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Chat apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Chat apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/drive/api/guides/about-apps" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Drive apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Drive apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/marketplace" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Marketplace" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Marketplace </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Resources" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools </span> </span> </li> <li class="devsite-nav-item"> <a href="https://admin.google.com/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Admin console" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Admin console </span> </a> </li> <li class="devsite-nav-item"> <a href="https://script.google.com/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Apps Script dashboard" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Apps Script dashboard </span> </a> </li> <li class="devsite-nav-item"> <a href="https://console.cloud.google.com/workspace-api" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud console" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud console </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/explore" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: APIs Explorer" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > APIs Explorer </span> </a> </li> <li class="devsite-nav-item"> <a href="https://addons.gsuite.google.com/uikit/builder" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Card Builder" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Card Builder </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Training &amp; support </span> </span> </li> <li class="devsite-nav-item"> <a href="/workspace/guides/get-started" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: How to get started" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > How to get started </span> </a> </li> <li class="devsite-nav-item"> <a href="https://codelabs.developers.google.com/?product=googleworkspace" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Codelabs" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Codelabs </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/support" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Developer support" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Developer support </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Updates </span> </span> </li> <li class="devsite-nav-item"> <a href="https://developers.googleblog.com/search/?query=Google+Workspace" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Blog" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Blog </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/preview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Developer Previews" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Developer Previews </span> </a> </li> <li class="devsite-nav-item"> <a href="/workspace/newsletters" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Newsletter" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Newsletter </span> </a> </li> <li class="devsite-nav-item"> <a href="https://twitter.com/workspacedevs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: X (Twitter)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > X (Twitter) </span> </a> </li> <li class="devsite-nav-item"> <a href="https://www.youtube.com/channel/UCUcg6az6etU_gRtZVAhBXaw" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: YouTube" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > YouTube </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" has-book-nav > <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="" > Home </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/workspace" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Google Workspace" > Google Workspace </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/workspace/chat" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Google Chat" > Google Chat </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/workspace/chat/samples" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Samples </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feedback position="header" project-name="Google Chat" product-id="717201" bucket="google-chat" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="header" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=350158&amp;template=1047215" project-icon="https://www.gstatic.com/images/branding/productlogos/chat_2023q4/v2/web-64dp/logo_chat_2023q4_color_1x_web_64dp.png" project-support-url="https://developers.google.com/workspace/chat/support" > <button> Send feedback </button> </devsite-feedback> <h1 class="devsite-page-title" tabindex="-1"> Manage projects with Google Chat, Vertex AI, and Firestore </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <p>This tutorial shows how to make a Google Chat app that a team can use to manage projects in real time. The Chat app uses Vertex AI to help teams write user stories (which represent features of a software system from the point of view of a user for the team to develop) and persists the stories in a Firestore database.</p> <div> <devsite-carousel> <ul> <li> <figure> <img src="/static/workspace/chat/images/project-management-1.png" alt="Mentioning the project management app prompts the app to offer help." class="screenshot" /> <figcaption align="center"><b>Figure 1.</b> Charlie discusses feature development in a Chat space with their team. Mentioning the project management Chat app prompts the Chat app to offer help.</figcaption> </figure> </li> <li> <img src="/static/workspace/chat/images/project-management-2.png" alt="Using the /createUserStory slash command to create a story." class="screenshot" /> <figcaption align="center"><b>Figure 2.</b> Using the <code translate="no" dir="ltr">/createUserStory</code> slash command, Charlie creates a story.</figcaption> </li> <li> <img src="/static/workspace/chat/images/project-management-3.png" alt="The project management Chat app uses Vertex AI to write the story description." class="screenshot" /> <figcaption align="center"><b>Figure 3.</b> The project management Chat app uses Vertex AI to write the story description, then shares the story in the space.</figcaption> </li> <li> <img src="/static/workspace/chat/images/project-management-4.png" alt="Charlie finalizes story details." class="screenshot" /> <figcaption align="center"><b>Figure 4.</b> Charlie clicks <b>Edit</b> to finalize the story details. The AI description is accurate, but Charlie wants more details, so Charlie clicks <b>Expand</b> to have Vertex AI add requirements to the story description. Charlie assigns the story to themself, sets status to started, selects an appropriate priority and size, then clicks <b>Save</b>.</figcaption> </li> <li> <img src="/static/workspace/chat/images/project-management-5.png" alt="Managing all the team's user stories." class="screenshot" /> <figcaption align="center"><b>Figure 5.</b> At any time, Charlie can see and manage all the team's user stories with the <code translate="no" dir="ltr">/manageUserStories</code> slash command.</figcaption> </li> </ul> </devsite-carousel> </div> <h2 id="prerequisites" data-text="Prerequisites" tabindex="-1">Prerequisites</h2> <ul> <li> A Business or Enterprise <a href="https://support.google.com/a/answer/6043576">Google Workspace</a> account with access to <a href="https://workspace.google.com/products/chat/">Google Chat</a>. </li> <li><p>Access to Google Cloud services to do the following:</p> <ul> <li>Create a Google Cloud project.</li> <li>Link a Google Cloud billing account to the Cloud project. To learn if you have access, see <a href="https://cloud.google.com/billing/docs/how-to/modify-project#required-permissions-enable">Permissions required to enable billing</a>.</li> <li><p>Use <a href="https://cloud.google.com/functions/docs/securing/managing-access-iam#allowing_unauthenticated_http_function_invocation">unauthenticated Google Cloud Function invocations</a>, which you can verify by determining whether your Google Cloud organization uses <a href="https://cloud.google.com/functions/docs/securing/managing-access-iam#domain_restricted_sharing">domain restricted sharing</a>.</p> <p> </p></li> </ul> <p>If necessary, ask your Google Cloud administrator for access or permission.</p></li> <li><p>If using the <a href="https://cloud.google.com/cli">Google Cloud CLI</a>, a Node.js development environment configured to work with gcloud CLI. See <a href="https://cloud.google.com/nodejs/docs/setup">Setting up a Node.js development environment</a>.</p></li> </ul> <h2 id="objectives" data-text="Objectives" tabindex="-1">Objectives</h2> <ul> <li>Build a Chat app that manages agile software projects.</li> <li>Help users write user stories with generative AI-assisted story writing tools powered by Vertex AI: <ul> <li>Generate and regenerate story descriptions.</li> <li>Expand story descriptions from notes to complete requirements.</li> <li>Correct grammar to fix typos.</li> </ul></li> <li>Keep work up-to-date by writing to, and reading from, a Firestore database.</li> <li>Facilitate collaboration in a Chat space by letting users create, edit, assign, and start stories directly from the conversation.</li> </ul> <h2 id="products-used" data-text="Products used" tabindex="-1">Products used</h2> <p>The project management app uses the following Google Workspace and Google Cloud products:</p> <ul> <li><a href="https://developers.google.com/chat">Chat API</a>: An API for developing Google Chat apps that receive and respond to Chat interaction events, like messages. The project management Google Chat app uses Chat API to receive and respond to interaction events sent by Chat, and to configure attributes that determine how it appears in Chat, like name and avatar image.</li> <li><a href="https://cloud.google.com/vertex-ai">Vertex AI API</a>: A generative AI platform. The project management Google Chat app uses the Vertex AI API to write user story titles and descriptions.</li> <li><a href="https://cloud.google.com/firestore">Firestore</a>: A serverless document database. The project management Google Chat app uses Firebase to store data about user stories.</li> <li><p><a href="https://cloud.google.com/functions">Cloud Functions</a>: A lightweight serverless compute service that lets you create single-purpose, standalone functions that can respond to Chat interaction events without the need to manage a server or runtime environment. The project management Google Chat app uses Cloud Functions to host the HTTP endpoint that Chat sends interaction events to and as a compute platform to run logic that processes and responds to these events.</p> <p>Cloud Functions uses the following Google Cloud products to build, process interaction events, and host compute resources:</p> <ul> <li><a href="https://cloud.google.com/build">Cloud Build</a>: A fully managed continuous integration, delivery and deployment platform that runs automated builds.</li> <li><a href="https://cloud.google.com/pubsub">Pub/Sub</a>: An asynchronous and scalable messaging service that decouples services that produce messages from services that process those messages.</li> <li><a href="https://cloud.google.com/run/docs/reference/rest">Cloud Run Admin API</a>: A fully managed environment for running containerized apps.</li> </ul></li> </ul> <h2 id="architecture" data-text="Architecture" tabindex="-1">Architecture</h2> <p>The project management Google Chat app architecture receives and processes Chat interaction events at an HTTP endpoint, uses Vertex AI to help write user stories, and stores user story details in a Firestore database. The following diagram shows the architecture of the Google Workspace and Google Cloud resources used.</p> <p><img src="/static/workspace/chat/images/tutorial-project-management-architecture-diagram.svg" alt="Architecture diagram for the project management Google Chat app"></p> <p>The project management Google Chat app works like this:</p> <ol> <li><p>A user sends a message in Chat and invokes the project management Google Chat app by either messaging it directly, mentioning it in a space, or entering a slash command.</p></li> <li><p>Chat sends a synchronous HTTP request to the Cloud Function&#39;s HTTP endpoint.</p></li> <li><p>The project management Google Chat app processes the HTTP request:</p> <ol> <li><p>Vertex AI helps write or update a user story.</p></li> <li><p>A Firestore database stores, retrieves, updates, or deletes user story data.</p></li> </ol></li> <li><p>Cloud Functions returns an HTTP response to Chat which displays it to the user as either a message or dialog.</p></li> </ol> <h2 id="prepare-environment" data-text="Prepare the environment" tabindex="-1">Prepare the environment</h2> <p>This section shows how to create and configure a Google Cloud project for the Chat app.</p> <h3 id="create-cloud-project" data-text="Create a Google Cloud project" tabindex="-1">Create a Google Cloud project</h3> <devsite-selector> <section> <h3 id="google-cloud-console" data-text="Google Cloud console" tabindex="-1">Google Cloud console</h3> <ol> <li> In the Google Cloud console, go to Menu <span class="material-icons" aria-hidden="true" translate="no">menu</span> <span aria-label="and then">></span> <b>IAM &amp; Admin</b> <span aria-label="and then">></span> <b>Create a Project</b>. <p><a href="https://console.cloud.google.com/projectcreate" class="button button-primary" target="console">Go to Create a Project</a></p> </li> <li> In the <b>Project Name</b> field, enter a descriptive name for your project. <p> Optional: To edit the <b>Project ID</b>, click <b>Edit</b>. The project ID can't be changed after the project is created, so choose an ID that meets your needs for the lifetime of the project. </p> </li> <li> In the <b>Location</b> field, click <b>Browse</b> to display potential locations for your project. Then, click <b>Select</b>. <aside class="caution"> <b>Caution: Can't find your Google Workspace organization?</b><br> This means you aren't signed in to a Google Workspace account. Some of the features described in Google Workspace developer documentation are only available to projects associated with an organization. </aside> </li> <li>Click <b>Create</b>. The Google Cloud console navigates to the Dashboard page and your project is created within a few minutes.</li> </ol> </section> <section> <h3 id="gcloud-cli" data-text="gcloud CLI" tabindex="-1">gcloud CLI</h3> <p>In one of the following development environments, access the Google Cloud CLI (<code translate="no" dir="ltr">gcloud</code>):</p> <ul> <li> <b>Cloud Shell</b>: To use an online terminal with the gcloud CLI already set up, activate Cloud Shell. <br/> <a href="https://console.cloud.google.com/?cloudshell=true" class="button button-blue" track-type="tasks" track-name="consoleLink" track-metadata-end-goal="activateCloudShell" target="console">Activate Cloud Shell</a> </li> <li> <b>Local Shell</b>: To use a local development environment, <a href="https://cloud.google.com/sdk/docs/install" class="external" target="_blank">install</a> and <a href="https://cloud.google.com/sdk/docs/initializing" class="external" target="_blank">initialize</a> the gcloud CLI. <br/> To create a Cloud project, use the <code translate="no" dir="ltr">gcloud projects create</code> command: <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash Session"><code class="devsite-terminal" translate="no" dir="ltr"><span class="devsite-syntax-go">gcloud projects create <var translate="no">PROJECT_ID</span></var></code></pre></devsite-code> Replace <var translate="no">PROJECT_ID</var> by setting the ID for the project you want to create. </ol> </section> </devsite-selector> <h3 id="enable-billing" data-text="Enable billing for the Cloud project" tabindex="-1">Enable billing for the Cloud project</h3> <aside class="caution"> If you're unable to link a billing account, you don't have the permissions needed to make this change. For more information, see <a href="https://cloud.google.com/billing/docs/how-to/modify-project#required-permissions-enable" target="_blank" class="external">Permissions required to enable billing</a>. </aside> <devsite-selector> <section> <h3 id="google-cloud-console_1" data-text="Google Cloud console" tabindex="-1">Google Cloud console</h3> <ol> <li>In the Google Cloud console, go to <b>Billing</b>. Click <b>Menu</b> <span class="material-icons" aria-hidden="true" translate="no">menu</span> <span aria-label="and then">></span> <b>Billing</b> <span aria-label="and then">></span> <b>My Projects</b>. <p><a href="https://console.cloud.google.com/billing/projects" class="button button-primary" target="console">Go to Billing for My Projects</a></p> </li> <li>In <b>Select an organization</b>, choose the organization associated with your Google Cloud project.</li> <li>In the project row, open the <b>Actions</b> menu (<span class="material-icons" aria-hidden="true" translate="no">more_vert</span>), click <b>Change billing</b>, and choose the Cloud Billing account.</li> <li>Click <b>Set account</b>.</li> </ol> </section> <section> <h3 id="gcloud-cli_1" data-text="gcloud CLI" tabindex="-1">gcloud CLI</h3> <ol> <li>To list available billing accounts, run: <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash Session"><code class="devsite-terminal" translate="no" dir="ltr"><span class="devsite-syntax-go">gcloud billing accounts list</span></var></code></pre></devsite-code> </li> <li>Link a billing account with a Google Cloud project: <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash Session"><code class="devsite-terminal" translate="no" dir="ltr"><span class="devsite-syntax-go">gcloud billing projects link <var translate="no">PROJECT_ID</var> --billing-account=<var translate="no">BILLING_ACCOUNT_ID</span></var></code></pre></devsite-code> <p>Replace the following:</p> <ul> <li><code translate="no" dir="ltr"><var translate="no">PROJECT_ID</var></code> is the <b>Project ID</b> for the Cloud project for which you want to enable billing.</li> <li><code translate="no" dir="ltr"><var translate="no">BILLING_ACCOUNT_ID</var></code> is the <b>billing account ID</b> to link with the Google Cloud project. </ol> </li> </ol> </section> </devsite-selector> <h3 id="enable-apis" data-text="Enable the APIs" tabindex="-1">Enable the APIs</h3> <div class="ds-selector-tabs" data-ds-scope="code-sample"> <section><h3 id="google-cloud-console_2" data-text=" Google Cloud console " tabindex="-1"> Google Cloud console </h3><ol> <li><p>In the Google Cloud console, enable the Google Chat API, the Vertex AI API, the Cloud Functions API, the Firestore API, the Cloud Build API, the Pub/Sub API, and the Cloud Run Admin API.</p> <p><a href="https://console.cloud.google.com/flows/enableapi?apiid=chat.googleapis.com,aiplatform.googleapis.com,cloudfunctions.googleapis.com,firestore.googleapis.com,cloudbuild.googleapis.com,pubsub.googleapis.com,run.googleapis.com" class="button button-blue" track-type="tasks" track-name="consoleLink" track-metadata-end-goal="enableApis" target="console">Enable the APIs</a> </p></li> <li><p>Confirm that you&#39;re enabling the APIs in the correct Cloud project, then click <strong>Next</strong>.</p></li> <li><p>Confirm that you&#39;re enabling the correct APIs, then click <strong>Enable</strong>.</p></li> </ol></section> <section><h3 id="gcloud-cli_2" data-text="gcloud CLI" tabindex="-1">gcloud CLI</h3><ol> <li><p>If necessary, set the current Cloud project to the one you created with the <code translate="no" dir="ltr">gcloud config set project</code> command:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr">gcloud<span class="devsite-syntax-w"> </span>config<span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">set</span><span class="devsite-syntax-w"> </span>project<span class="devsite-syntax-w"> </span><var translate="no">PROJECT_ID</var></code></pre></devsite-code> <p>Replace <var translate="no">PROJECT_ID</var> with the <strong>Project ID</strong> of the Cloud project you created.</p></li> <li><p>Enable the Google Chat API, the Vertex AI API, the Cloud Functions API, the Firestore API, the Cloud Build API, the Pub/Sub API, and the Cloud Run Admin API with the <code translate="no" dir="ltr">gcloud services enable</code> command:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr">gcloud<span class="devsite-syntax-w"> </span>services<span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">enable</span><span class="devsite-syntax-w"> </span>chat.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> aiplatform.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> cloudfunctions.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> firestore.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> cloudbuild.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> pubsub.googleapis.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> run.googleapis.com</code></pre></devsite-code> <p>The Cloud Build, Pub/Sub, and Cloud Run Admin APIs are prerequisites of Cloud Functions.</p></li> </ol></section> </div> <h3 id="set-up-auth" data-text="Authentication and authorization" tabindex="-1">Authentication and authorization</h3> <p>No authentication and authorization configuration is necessary to follow this tutorial.</p> <p>To call the Firestore and Vertex AI APIs, this tutorial uses <a href="https://cloud.google.com/docs/authentication/provide-credentials-adc">Application Default Credentials</a> with the default service account attached to the Cloud Function, which you don&#39;t need to set up. In the context of a production environment, you would typically <a href="https://cloud.google.com/iam/docs/service-accounts-create">create</a> and <a href="https://cloud.google.com/docs/authentication/provide-credentials-adc#attached-sa">attach</a> a service account to the Cloud Function instead.</p> <h2 id="create-deploy-app" data-text="Create and deploy the Google Chat app" tabindex="-1">Create and deploy the Google Chat app</h2> <p>Now that your Google Cloud project is created and configured, you&#39;re ready to build and deploy the Google Chat app. In this section, you do the following:</p> <ol> <li>Create a Firestore database in which to persist and retrieve user stories.</li> <li>Optionally, review the sample code.</li> <li>Create a Cloud Function to host and run the Chat app&#39;s code in response to events received from Chat as HTTP requests.</li> <li>Create and deploy a Google Chat app on the Google Chat API configuration page.</li> </ol> <h3 id="create-database" data-text="Create the Firestore database" tabindex="-1">Create the Firestore database</h3> <p>In this section, you create a Firestore database to persist and retrieve user stories, but you don&#39;t define the data model. The data model is set implicitly in the sample code by the <code translate="no" dir="ltr">model/user-story.js</code> and <code translate="no" dir="ltr">model/user.js</code> files.</p> <p>The project management Chat app database uses a NoSQL data model based on <span class="material-icons" aria-hidden="true" translate="no">class</span> <em>documents</em> organized into <span class="material-icons" aria-hidden="true" translate="no">collections_bookmark</span> <em>collections</em>. To learn more, see <a href="https://cloud.google.com/firestore/docs/data-model">Firestore data model</a>.</p> <p>The following diagram is an overview of the project management Google Chat app&#39;s data model:</p> <p><img src="/static/workspace/chat/images/tutorial-project-management-firebase-data-model.svg" alt="Data model of the Firestore database."></p> <p>The root collection is <code translate="no" dir="ltr">spaces</code>, where each document represents a space that the Chat app created stories in. Each user story is represented by a document in the <code translate="no" dir="ltr">userStories</code> subcollection, and each user is represented by a document in the <code translate="no" dir="ltr">users</code> subcollection.</p> <div> <devsite-expandable id="data-model"> <h4 class="showalways" id="view-collection,-document,-and-field-definitions" data-text="View collection, document, and field definitions" tabindex="-1">View collection, document, and field definitions</h4> <h4 id="spaces-document" data-text="spaces" tabindex="-1"><code translate="no" dir="ltr">spaces</code></h4> <p>Spaces the Chat app created stories in.</p> <table class="responsive"> <tr> <th colspan=2>Fields</th> </tr> <tr> <td><code translate="no" dir="ltr">Document ID</code></td><td><code translate="no" dir="ltr">String</code><br />Unique ID of a specific space where stories are created. Corresponds with the space's resource name in Chat API.</td> </tr> <tr> <td><code translate="no" dir="ltr">userStories</code></td><td><code translate="no" dir="ltr">Subcollection of Documents (<a href="#userStories-document"><code translate="no" dir="ltr">userStories</code></a>)</code><br />Stories created by the Chat app and its users. Corresponds with the <code translate="no" dir="ltr">Document ID</code> of a <code translate="no" dir="ltr">userStories</code> in Firebase.</td> </tr> <tr> <td><code translate="no" dir="ltr">users</code></td><td><code translate="no" dir="ltr">Subcollection of Documents (<a href="#users-document">user</a>)</code><br />Users who created or who are assigned stories.</td> </tr> <tr> <td><code translate="no" dir="ltr">displayName</code></td><td><code translate="no" dir="ltr">String</code><br />The display name of the space in the Chat API. Not set for direct messages with users.</td> </tr> </table> <h4 id="userStories-document" data-text="userStories" tabindex="-1"><code translate="no" dir="ltr">userStories</code></h4> <p>Stories created by the Chat app and its users.</p> <table class="responsive"> <tr> <th colspan=2>Fields</th> </tr> <tr> <td><code translate="no" dir="ltr">Document ID</code></td><td><code translate="no" dir="ltr">String</code><br />Unique ID of a specific user story created by the Chat app and its users.</td> </tr> <tr> <td><code translate="no" dir="ltr">assignee</code></td><td><code translate="no" dir="ltr">Document (<a href="#users-document">user</a>)</code><br />The resource name of the user assigned to complete the story. Corresponds with the <code translate="no" dir="ltr">Document ID</code> of the <code translate="no" dir="ltr">users</code> document and with a user's resource name in Chat API.</td> </tr> <tr> <td><code translate="no" dir="ltr">description</code></td><td><code translate="no" dir="ltr">String</code><br />A description of the software feature from the user's point of view.</td> </tr> <tr> <td><code translate="no" dir="ltr">priority</code></td><td><code translate="no" dir="ltr">Enum</code><br />The urgency with which to complete the work. Possible values are <code translate="no" dir="ltr">Low</code>, <code translate="no" dir="ltr">Medium</code>, or <code translate="no" dir="ltr">High</code>.</td> </tr> <tr> <td><code translate="no" dir="ltr">size</code></td><td><code translate="no" dir="ltr">Enum</code><br />The amount of work. Possible values are <code translate="no" dir="ltr">Small</code>, <code translate="no" dir="ltr">Medium</code>, or <code translate="no" dir="ltr">Large</code>.</td> </tr> <tr> <td><code translate="no" dir="ltr">status</code></td><td><code translate="no" dir="ltr">Enum</code><br />The phase of work. Possible values are <code translate="no" dir="ltr">OPEN</code>, <code translate="no" dir="ltr">STARTED</code>, or <code translate="no" dir="ltr">COMPLETED</code>.</td> </tr> <tr> <td><code translate="no" dir="ltr">title</code></td><td><code translate="no" dir="ltr">String</code><br />The title of the story; a brief summary.</td> </tr> </table> <h4 id="users-document" data-text="users" tabindex="-1"><code translate="no" dir="ltr">users</code></h4> <p>Users who created or who are assigned stories.</p> <table class="responsive"> <tr> <th colspan=2>Fields</th> </tr> <tr> <td><code translate="no" dir="ltr">Document ID</code></td><td><code translate="no" dir="ltr">String</code><br />Unique ID of a specific user. Corresponds with the <code translate="no" dir="ltr">assignee</code> of a <code translate="no" dir="ltr">userStories</code> in Firebase, and with a user's resource name in Chat API.</td> </tr> <tr> <td><code translate="no" dir="ltr">avatarUrl</code></td><td><code translate="no" dir="ltr">String</code><br />URL hosting the user's Chat avatar image.</td> </tr> <tr> <td><code translate="no" dir="ltr">displayName</code></td><td><code translate="no" dir="ltr">String</code><br />The user's Chat display name.</td> </tr> </table> </devsite-expandable> </div> <p>Here&#39;s how to create the Firestore database:</p> <div class="ds-selector-tabs" data-ds-scope="code-sample"> <section><h3 id="google-cloud-console_3" data-text=" Google Cloud console " tabindex="-1"> Google Cloud console </h3><ol> <li><p>In the Google Cloud console, go to Firestore. Click <strong>Menu</strong> <span class="material-icons" aria-hidden="true" translate="no">menu</span> <span aria-label="and then">&gt;</span> <strong>Firestore</strong>.</p> <p><a href="https://console.cloud.google.com/firestore/databases" class="button button-blue" track-type="tasks" track-name="consoleLink" track-metadata-end-goal="goToFirestore" target="console">Go to Firestore</a> </p></li> <li><p>Click <strong>Create database</strong>.</p></li> <li><p>From <strong>Select your Firestore mode</strong>, click <strong>Native mode</strong>.</p></li> <li><p>Click <strong>Continue</strong>.</p></li> <li><p>Configure the database:</p> <ol> <li><p>In <strong>Name your database</strong>, leave the <strong>Database ID</strong> as <code translate="no" dir="ltr">(default)</code>.</p></li> <li><p>In <strong>Location type</strong>, specify a region for your database, such as <code translate="no" dir="ltr">us-central1</code>. For best performance, select the same or nearby location as the Chat app&#39;s Cloud Function.</p></li> </ol></li> <li><p>Click <strong>Create database</strong>.</p></li> </ol></section> <section><h3 id="gcloud-cli_3" data-text="gcloud CLI" tabindex="-1">gcloud CLI</h3><ul> <li><p>Create a Firestore database in Native mode with the <code translate="no" dir="ltr">gcloud firestore databases create</code> command:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr">gcloud<span class="devsite-syntax-w"> </span>firestore<span class="devsite-syntax-w"> </span>databases<span class="devsite-syntax-w"> </span>create<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --location<span class="devsite-syntax-o">=</span><var translate="no">LOCATION</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --type<span class="devsite-syntax-o">=</span>firestore-native</code></pre></devsite-code> <p>Replace <var translate="no">LOCATION</var> with the name of a <a href="https://cloud.google.com/firestore/docs/locations#types">Firestore region</a>, such as <code translate="no" dir="ltr">us-central1</code>.</p></li> </ul></section> </div> <h3 id="review-sample-code" data-text="Review the sample code" tabindex="-1">Review the sample code</h3> <p>Optionally, before creating the Cloud Function, take a moment to review and familiarize yourself with the sample code hosted on GitHub.</p> <p><a href="https://github.com/googleworkspace/google-chat-samples/tree/main/node/project-management-app" track-type="tasks" track-name="viewGitHubRepot" track-metadata-end-goal="viewGitHubRepot" target="_blank" class="button">View on GitHub</a> </p> <p>Here&#39;s an overview of each file:</p> <dl> <dt><code translate="no" dir="ltr">env.js</code></dt> <dd>Environment configuration variables to deploy the Chat app to a specified Google Cloud project and region. You must update the configuration variables in this file.</dd> <dt><code translate="no" dir="ltr">package.json</code> and <code translate="no" dir="ltr">package-lock.json</code></dt> <dd>Node.js project settings and dependencies.</dd> <dt><code translate="no" dir="ltr">index.js</code></dt> <dd>Entry point for the Chat app&#39;s Cloud Function. It reads the <a href="/workspace/chat/events">Chat event</a> from the HTTP request, calls the app handler, and posts the HTTP response as a JSON object.</dd> <dt><code translate="no" dir="ltr">controllers/app.js</code></dt> <dd>The main application logic. Processes the <a href="/workspace/chat/events">interaction events</a> by handling the Chat app mentions and slash commands. To respond to card clicks, it calls <code translate="no" dir="ltr">app-action-handler.js</code>.</dd> <dt><code translate="no" dir="ltr">controllers/app-action-handler.js</code></dt> <dd>Application logic to handle card click <a href="/workspace/chat/events#card-clicked">Chat interaction events</a>.</dd> <dt><code translate="no" dir="ltr">services/space-service.js</code>, <code translate="no" dir="ltr">services/user-service.js</code>, and <code translate="no" dir="ltr">services/user-story-service.js</code></dt> <dd>These files contain the parts of the application logic specific to working with Chat spaces, users, and user stories. The functions in these files are called by <code translate="no" dir="ltr">app.js</code> or <code translate="no" dir="ltr">app-action-handler.js</code>. To perform database operations, the functions in these files call functions in <code translate="no" dir="ltr">firestore-service.js</code>.</dd> <dt><code translate="no" dir="ltr">services/firestore-service.js</code></dt> <dd>Handles database operations. The functions in this file are called by <code translate="no" dir="ltr">services/space-service.js</code>, <code translate="no" dir="ltr">services/user-service.js</code>, and <code translate="no" dir="ltr">services/user-story-service.js</code>.</dd> <dt><code translate="no" dir="ltr">services/aip-service.js</code></dt> <dd>Calls the Vertex AI API for generative AI text prediction.</dd> <dt><code translate="no" dir="ltr">model/*.js</code></dt> <dd>These files contain the definition of classes and enums that the application services use to store and pass data between functions. They set the data model for the Firestore database.</dd> <dt><code translate="no" dir="ltr">views/*.js</code></dt> <dd>Each file in this directory instantiates a <a href="/workspace/chat/api/reference/rest/v1/cards">card object</a> that the Chat app then sends back to Chat as either a <a href="/workspace/chat/messages-overview#anatomy-card">card message</a> or a <a href="/workspace/chat/dialogs">dialog action response</a>.</dd> <dt><code translate="no" dir="ltr">views/widgets/*.js</code></dt> <dd>Each file instantiates a type of <a href="/workspace/chat/api/reference/rest/v1/cards#widget">widget</a> object that the app uses to build the cards in the <code translate="no" dir="ltr">views/</code> directory.</dd> <dt><code translate="no" dir="ltr">test/**/*.test.js</code></dt> <dd>Each file in this directory and its subdirectories contains the unit tests for the corresponding function, controller, service, view, or widget. You can execute all the unit tests by running <code translate="no" dir="ltr">npm run test</code> while in the project&#39;s root directory.</dd> </dl> <h3 id="create_and_deploy_the_cloud_function" data-text="Create and deploy the Cloud Function" tabindex="-1">Create and deploy the Cloud Function</h3> <p>In this section, you create and deploy a Cloud Function that comprises the project management Chat app&#39;s application logic.</p> <p>The Cloud Function runs in response to an HTTP request from Chat containing a Chat interaction event. When run, the Cloud Function code processes the event and returns a response to Chat which Chat renders as a message, dialog, or other type of user interaction. If applicable, the Cloud Function also reads from, or writes to, the Firestore database.</p> <p>Here&#39;s how to create the Cloud Function:</p> <div class="ds-selector-tabs" data-ds-scope="code-sample"> <section><h3 id="google-cloud-console_4" data-text=" Google Cloud console " tabindex="-1"> Google Cloud console </h3><ol> <li><p>Download the code from GitHub as a zip file.</p> <p><a href="https://codeload.github.com/googleworkspace/google-chat-samples/zip/refs/heads/main" track-type="tasks" track-name="downloadCodeZip" track-metadata-end-goal="downloadCodeZip" class="button">Download the zip file</a> </p></li> <li><p>Extract the downloaded zip file.</p> <p>The extracted folder contains the entire Google Workspace samples repository.</p></li> <li><p>In the extracted folder, navigate to <code translate="no" dir="ltr">google-chat-samples-main/node/project-management-app/</code>, then compress the <code translate="no" dir="ltr">project-management-app</code> folder into a zip file.</p> <p>The root directory of the zip file must contain the following files and folders:</p> <ul> <li><code translate="no" dir="ltr">env.js</code></li> <li><code translate="no" dir="ltr">README.md</code></li> <li><code translate="no" dir="ltr">gcloudignore.text</code></li> <li><code translate="no" dir="ltr">package-lock.json</code></li> <li><code translate="no" dir="ltr">package.json</code></li> <li><code translate="no" dir="ltr">index.js</code></li> <li><code translate="no" dir="ltr">model/</code></li> <li><code translate="no" dir="ltr">controllers/</code></li> <li><code translate="no" dir="ltr">views/</code></li> <li><code translate="no" dir="ltr">services/</code></li> </ul></li> <li><p>In the Google Cloud console, go to the Cloud Functions page:</p> <p><a href="https://console.cloud.google.com//functions" track-type="tasks" track-name="consoleLink" track-metadata-end-goal="visitFunctions" target="console" class="button button-blue">Go to Cloud Functions</a> </p> <p>Make sure that the Google Cloud project for your Chat app is selected.</p></li> <li><p>Click <span class="material-icons" aria-hidden="true" translate="no">add_box</span> <strong>Create Function</strong>.</p></li> <li><p>On the <strong>Create function</strong> page, set up your function:</p> <ol> <li>In <strong>Environment</strong>, select <strong>Cloud Run Function</strong>.</li> <li>In <strong>Function name</strong>, enter <code translate="no" dir="ltr">project-management-tutorial</code>.</li> <li>In <strong>Region</strong>, select a region.</li> <li>Under <strong>Authentication</strong>, select <strong>Allow unauthenticated invocations</strong>.</li> <li>Click <strong>Next</strong>.</li> </ol></li> <li><p>In <strong>Runtime</strong>, select <strong>Node.js 20</strong>.</p></li> <li><p>In <strong>Entry point</strong>, delete the default text and enter <code translate="no" dir="ltr">projectManagementChatApp</code>.</p></li> <li><p>In <strong>Source code</strong>, select <strong>Zip upload</strong>.</p></li> <li><p>In <strong>Destination bucket</strong>, <a href="https://cloud.google.com/storage/docs/creating-buckets">create</a> or select a bucket:</p> <ol> <li>Click <strong>Browse</strong>.</li> <li>Choose a bucket.</li> <li>Click <strong>Select</strong>.</li> </ol> <p>Google Cloud uploads the zip file to and extracts the component files in this bucket. Cloud Functions then copies the component files into the Cloud Function.</p></li> <li><p>In <strong>Zip file</strong>, upload the zip file you downloaded from GitHub, extracted, and recompressed:</p> <ol> <li>Click <strong>Browse</strong>.</li> <li>Navigate to and select the zip file.</li> <li>Click <strong>Open</strong>.</li> </ol></li> <li><p>Click <strong>Deploy</strong>.</p> <p>The <strong>Cloud Functions detail</strong> page opens, and your function appears with two progress indicators: one for the build and one for the service. When both progress indicators disappear and are replaced with a check mark, your function is deployed and ready.</p></li> <li><p>Edit the sample code to set constants:</p> <ol> <li>On the <strong>Cloud Function detail</strong> page, click <strong>Edit</strong>.</li> <li>Click <strong>Next</strong>.</li> <li>In <strong>Source code</strong>, select <strong>Inline editor</strong>.</li> <li>In the inline editor, open the <code translate="no" dir="ltr">env.js</code> file.</li> <li>Replace <var translate="no">project-id</var> with your Cloud project ID.</li> <li>Optional: Update <var translate="no">us-central1</var> with a <a href="https://cloud.google.com/functions/docs/locations">supported location</a> for your Cloud Function.</li> </ol></li> <li><p>Click <strong>Deploy</strong>.</p></li> <li><p>When the function finishes deploying, copy the trigger URL:</p> <ol> <li>On the <strong>Function details</strong> page, click <strong>Trigger</strong>.</li> <li>Copy the URL. You need it to configure the Chat app in the following section.</li> </ol></li> </ol></section> <section><h3 id="gcloud-cli_4" data-text="gcloud CLI" tabindex="-1">gcloud CLI</h3><ol> <li><p>Clone the code from GitHub:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/googleworkspace/google-chat-samples.git</code></pre></devsite-code></li> <li><p>Switch to the directory that holds the code for this project management Chat app:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>google-chat-samples/node/project-management-app</code></pre></devsite-code></li> <li><p>Edit the <code translate="no" dir="ltr">env.js</code> file to set environment variables:</p> <ol> <li>Replace <var translate="no">project-id</var> with your Google Cloud project ID.</li> <li>Replace <var translate="no">us-central1</var> with your Google Cloud project location.</li> </ol></li> <li><p>Deploy the Cloud Function to Google Cloud:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code class="devsite-terminal" translate="no" dir="ltr">gcloud<span class="devsite-syntax-w"> </span>functions<span class="devsite-syntax-w"> </span>deploy<span class="devsite-syntax-w"> </span>project-management-tutorial<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --gen2<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --region<span class="devsite-syntax-o">=</span><var translate="no">REGION</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --runtime<span class="devsite-syntax-o">=</span>nodejs20<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --source<span class="devsite-syntax-o">=</span>.<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --entry-point<span class="devsite-syntax-o">=</span>projectManagementChatApp<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --trigger-http<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --allow-unauthenticated</code></pre></devsite-code> <p>Replace <var translate="no">REGION</var> with a <a href="https://cloud.google.com/functions/docs/locations">Cloud Function location</a> where its infrastructure is hosted, such as <code translate="no" dir="ltr">us-central1</code>.</p></li> </ol></section> </div> <ol> <li>When the function finishes deploying, copy the <code translate="no" dir="ltr">url</code> property from the response. This is the Trigger URL that you use in the following section to configure the Google Chat app.</li> </ol> <h3 id="configure-chat-app" data-text="Configure the Google Chat app in the Google Cloud console" tabindex="-1">Configure the Google Chat app in the Google Cloud console</h3> <p>This section shows how to configure the Chat API in the Google Cloud console with information about your Chat app, including the Chat app&#39;s name, supported slash commands, and the trigger URL of the Chat app&#39;s Cloud Function to which it sends Chat interaction events.</p> <ol> <li><p>In the Google Cloud console, click <strong>Menu</strong> <span class="material-icons" aria-hidden="true" translate="no">menu</span> <span aria-label="and then">&gt;</span> <b>More products</b> <span aria-label="and then">&gt;</span> <b>Google Workspace</b> <span aria-label="and then">&gt;</span> <b>Product Library</b> <span aria-label="and then">&gt;</span> <b>Google Chat API</b> <span aria-label="and then">&gt;</span> <b>Manage</b> <span aria-label="and then">&gt;</span> <b>Configuration</b>.</p> <p><a href="https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat" target="console" class="button button-blue">Go to Chat API configuration</a> </p></li> <li><p>In <strong>App name</strong>, type <code translate="no" dir="ltr">Project Manager</code>.</p></li> <li><p>In <strong>Avatar URL</strong>, type <code translate="no" dir="ltr">https://developers.google.com/chat/images/quickstart-app-avatar.png</code>.</p></li> <li><p>In <strong>Description</strong>, type <code translate="no" dir="ltr">Manages projects with user stories.</code></p></li> <li><p>Click the <strong>Enable Interactive features</strong> toggle to the on position.</p></li> <li><p>Under <strong>Functionality</strong>, select <strong>Receive 1:1 messages</strong>, <strong>Join spaces and group conversations</strong>.</p></li> <li><p>Under <strong>Connection settings</strong>, select <strong>HTTP endpoint URL</strong>.</p></li> <li><p>In <strong>HTTP endpoint URL</strong>, paste the Trigger URL you copied from the Cloud Functions deployment, formatted as <code translate="no" dir="ltr">https://</code><var translate="no">REGION</var><code translate="no" dir="ltr">-</code><var translate="no">PROJECT_ID</var><code translate="no" dir="ltr">.cloudfunctions.net/project-management-tutorial</code>. If you deployed the Cloud Function with the gcloud CLI, this is the <code translate="no" dir="ltr">url</code> property.</p></li> <li><p>Register the Chat app&#39;s <a href="/workspace/chat/slash-commands">slash commands</a>. To register a slash command:</p> <ol> <li>Under <strong>Slash commands</strong>, click <strong>Add a slash command</strong>.</li> <li><p>For each slash command detailed in the following table, enter the <strong>Name</strong>, <strong>Command ID</strong>, <strong>Description</strong>, and select whether the slash command <strong>Opens a dialog</strong>, then click <strong>Done</strong>:</p> <table> <tr> <th>Name</th> <th>Command ID</th> <th>Description</th> <th>Opens a dialog</th> </tr> <tr> <td><code translate="no" dir="ltr">/createUserStory</code></td> <td>1</td> <td>Create a story with the specified title.</td> <td>Unselected</td> </tr> <tr> <td><code translate="no" dir="ltr">/myUserStories</code></td> <td>2</td> <td>Lists all the stories assigned to the user.</td> <td>Unselected</td> </tr> <tr> <td><code translate="no" dir="ltr">/userStory</code></td> <td>3</td> <td>Displays current status of the specified story.</td> <td>Unselected</td> </tr> <tr> <td><code translate="no" dir="ltr">/manageUserStories</code></td> <td>4</td> <td>Opens a dialog where stories can be edited.</td> <td>Selected</td> </tr> <tr> <td><code translate="no" dir="ltr">/cleanupUserStories</code></td> <td>5</td> <td>Deletes all stories in the space.</td> <td>Unselected</td> </tr> </table></li> </ol></li> <li><p>Under <strong>Visibility</strong>, select <strong>Make this Chat app available to specific people and groups in your Workspace domain</strong> and enter your email address.</p></li> <li><p>Optionally, under <strong>Logs</strong>, select <strong>Log errors to Logging</strong>.</p></li> <li><p>Click <strong>Save</strong>. A configuration saved message appears, meaning the Chat app is ready to test.</p></li> </ol> <h2 id="test-chat-app" data-text="Test the Chat app" tabindex="-1">Test the Chat app</h2> <p>Test the project management Chat app by messaging it and using its slash commands to create, edit, and delete user stories.</p> <ol> <li><p>Open Google Chat using the Google Workspace account that you provided when you added yourself as a trusted tester.</p> <p><a href="https://chat.google.com" class="button" track-type="tasks" track-name="chatLink" track-metadata-end-goal="goToChat" target="external">Go to Google Chat</a></p> </li> <li>Click <span class="material-icons" aria-hidden="true" translate="no">add</span> <b>New chat</b>.</li> <li>In the <b>Add 1 or more people</b> field, type the name of your Chat app.</li> <li><p>Select your Chat app from the results. A direct message opens.</p> <aside><b>Note:</b> If you don't see your Chat app in the list of results, ensure that you've included your Google Workspace account in the <b>Visibility</b> settings of the <a href="/workspace/chat/configure-chat-api"><b>Chat API Configuration</b></a> page in the Google Cloud console.</aside> </li> <li>In the new direct message with the app, type <code translate="no" dir="ltr">Hello</code> and press <code translate="no" dir="ltr">enter</code>. The project management Chat app responds with a help menu detailing what it can do.</li> <li>To create a story, type <code translate="no" dir="ltr">/createUserStory Test story</code> in the message bar and send it. The project management Chat app responds with a card message detailing the user story it creates for you using generative AI from Vertex AI.</li> <li><p>In the console, check the Firestore database to review the records it created about the space you added the Chat app to, the users who have interacted with it, and the user story you created.</p> <p><a href="https://console.cloud.google.com/firestore/databases" class="button button-blue" track-type="tasks" track-name="consoleLink" track-metadata-end-goal="goToFirestore" target="console">Go to Firestore</a></p></li> <li><p>Return to Google Chat.</p> <p><a href="https://chat.google.com" class="button" track-type="tasks" track-name="chatLink" track-metadata-end-goal="goToChat" target="external">Go to Google Chat</a></p></li> <li>Optionally, to edit the story, click <b>Edit</b>. When you're satisfied with the story, click <b>Save</b>.</li> <li>Test each slash command supported by the app. To see them, type <code translate="no" dir="ltr">/</code> or mention the Chat app.</li> <li>Delete the test user story by issuing the <code translate="no" dir="ltr">/cleanupUserStories</code> slash command. Alternatively, <a href="https://support.google.com/chat/answer/7655820">remove or uninstall the app</a>. When removed, the app deletes all user stories created in that space.</li> </ol> <h2 id="troubleshoot" data-text="Troubleshoot" tabindex="-1">Troubleshoot</h2> <p> When a Google Chat app or <a href="/workspace/chat/create-messages#create">card</a> returns an error, the Chat interface surfaces a message saying "Something went wrong." or "Unable to process your request." Sometimes the Chat UI doesn't display any error message, but the Chat app or card produces an unexpected result; for example, a card message might not appear. </p> <p> Although an error message might not display in the Chat UI, descriptive error messages and log data are available to help you fix errors when error logging for Chat apps is turned on. For help viewing, debugging, and fixing errors, see <a href="/workspace/chat/troubleshoot">Troubleshoot and fix Google Chat errors</a>. </p> <h2 id="clean" data-text="Clean up" tabindex="-1">Clean up</h2> <p> To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, we recommend that you delete the Cloud project. </p> <aside class="caution"> <p><b>Caution:</b> Deleting a project has the following effects:</p> <ul> <li><b>Everything in the project is deleted.</b> If you used an existing project for this tutorial, when you delete it, you also delete any other work you've done in the project.</li> <li><b>Custom project IDs are lost.</b> When you created this project, you might have created a custom project ID that you want to use in the future. To preserve the URLs that use the project ID, such as a URL on appspot.com, delete the selected resources inside the project instead of deleting the whole project.</li> </ul> <p>If you plan to explore multiple tutorials and quickstarts, reusing projects can help you avoid exceeding project quota limits.</p> </aside> <ol> <li> In the Google Cloud console, go to the <b>Manage resources</b> page. Click <b>Menu</b> <span class="material-icons" aria-hidden="true" translate="no">menu</span> <span aria-label="and then">></span> <b>IAM & Admin</b> <span aria-label="and then">></span> <b>Manage Resources</b>. <p> <a href="https://console.cloud.google.com/cloud-resource-manager" class="button button-primary" target="console"> Go to Resource Manager </a> </p> </li> <li> In the project list, select the project you want to delete and then click <b>Delete</b> <span class="material-icons" aria-hidden="true" translate="no">delete</span>. </li> <li> In the dialog, type the project ID and then click <b>Shut down</b> to delete the project. </li> </ol> <h2 id="related-topics" data-text="Related topics" tabindex="-1">Related topics</h2> <ul> <li><a href="/workspace/chat/tutorial-ai-knowledge-assistant">Answer questions based on Chat conversations with a Gemini AI Chat app</a></li> <li><a href="/workspace/chat/tutorial-incident-response">Respond to incidents with Google Chat, Vertex AI, and Apps Script</a></li> </ul> <devsite-hats-survey class="nocontent" hats-id="SrQ6jyjMz0eGRuQsCn30Qs2P7pj5" listnr-id="717201"></devsite-hats-survey> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-feedback position="footer" project-name="Google Chat" product-id="717201" bucket="google-chat" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="footer" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=350158&amp;template=1047215" project-icon="https://www.gstatic.com/images/branding/productlogos/chat_2023q4/v2/web-64dp/logo_chat_2023q4_color_1x_web_64dp.png" project-support-url="https://developers.google.com/workspace/chat/support" > <button> Send feedback </button> </devsite-feedback> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2024-11-06 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-thumb-rating-feedback"> <devsite-feedback position="thumb-rating" project-name="Google Chat" product-id="717201" bucket="google-chat" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="thumb-rating" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=350158&amp;template=1047215" project-icon="https://www.gstatic.com/images/branding/productlogos/chat_2023q4/v2/web-64dp/logo_chat_2023q4_color_1x_web_64dp.png" project-support-url="https://developers.google.com/workspace/chat/support" > <button> Need to tell us more? </button> </devsite-feedback> </template> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-11-06 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="https://developers.googleblog.com/search/?query=Google+Workspace" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" target="_blank" data-label="Promo - Google Workspace Developers Blog" data-category="Workspace Footer" > <picture> <img class="devsite-footer-promo-icon" src="https://www.gstatic.com/images/branding/product/2x/google_cloud_64dp.png" loading="lazy" alt="Blog"> </picture> <span class="devsite-footer-promo-label"> Blog </span> </a> <div class="devsite-footer-promo-description">Read the Google Workspace Developers blog</div> </li> <li class="devsite-footer-promo"> <a href="https://twitter.com/workspacedevs" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer" target="_blank" data-label="Promo - Google Workspace on X (Twitter)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-x.svg" loading="lazy" alt="X (Twitter)"> </picture> <span class="devsite-footer-promo-label"> X (Twitter) </span> </a> <div class="devsite-footer-promo-description">Follow @workspacedevs on X (Twitter)</div> </li> <li class="devsite-footer-promo"> <a href="https://github.com/googleworkspace" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Promo - Google Workspace Github" data-category="Workspace Footer" target="_blank" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-github.svg" loading="lazy" alt="Code Samples"> </picture> <span class="devsite-footer-promo-label"> Code Samples </span> </a> <div class="devsite-footer-promo-description">Explore our sample apps or copy them to build your own</div> </li> <li class="devsite-footer-promo"> <a href="https://codelabs.developers.google.com/?product=googleworkspace" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer" data-label="Promo - Google Workspace Codelabs" target="_blank" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/developers-logo-color.svg" loading="lazy" alt="Codelabs"> </picture> <span class="devsite-footer-promo-label"> Codelabs </span> </a> <div class="devsite-footer-promo-description">Try a guided, hands-on coding experience</div> </li> <li class="devsite-footer-promo"> <a href="https://www.youtube.com/channel/UCUcg6az6etU_gRtZVAhBXaw" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer" target="_blank" data-label="Promo - Google Workspace on YouTube" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-youtube.svg" loading="lazy" alt="Videos"> </picture> <span class="devsite-footer-promo-label"> Videos </span> </a> <div class="devsite-footer-promo-description">Subscribe to our YouTube channel</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Google Workspace for Developers</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/workspace" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - Platform overview"> Platform overview </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/workspace/products" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - Developer products"> Developer products </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/workspace/support" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - Developer support"> Developer support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/workspace/terms" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Linkbox - Terms of Service"data-category="Workspace Footer"> Terms of Service </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Tools</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://admin.google.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" target="admin-console"data-label="Linkbox - Admin console"data-category="Workspace Footer"> Admin console </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://script.google.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" target="_blank"data-category="Workspace Footer"data-label="Linkbox - Apps Script Dashboard"> Apps Script Dashboard </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://console.cloud.google.com/workspace-api" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Linkbox - Google Cloud console"data-category="Workspace Footer"target="console"> Google Cloud console </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/workspace/explore" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - APIs Explorer"> APIs Explorer </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Connect</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://developers.googleblog.com/search/?query=Google+Workspace" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Linkbox - Blog"data-category="Workspace Footer"target="_blank"> Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/workspace/newsletters" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - Newsletter"> Newsletter </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://twitter.com/workspacedevs" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" target="_blank"data-label="Linkbox - X (Twitter)"data-category="Workspace Footer"> X (Twitter) </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://www.youtube.com/channel/UCUcg6az6etU_gRtZVAhBXaw" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-category="Workspace Footer"data-label="Linkbox - YouTube"target="_blank"> YouTube </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//ai.google.dev/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google AI Link" > Google AI </a> </li> <li class="devsite-footer-sites-item"> <a href="/products" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/terms/site-terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Sign up for the Google for Developers newsletter</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/newsletter/subscribe" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> <devsite-concierge data-info-panel data-ai-panel data-api-explorer-panel > </devsite-concierge> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[{&#34;dimensions&#34;: {&#34;dimension4&#34;: &#34;Google Chat&#34;, &#34;dimension5&#34;: &#34;en&#34;, &#34;dimension11&#34;: false, &#34;dimension6&#34;: &#34;en&#34;, &#34;dimension3&#34;: false, &#34;dimension1&#34;: &#34;Signed out&#34;}, &#34;gaid&#34;: &#34;UA-24532603-1&#34;, &#34;metrics&#34;: {&#34;ratings_count&#34;: &#34;metric2&#34;, &#34;ratings_value&#34;: &#34;metric1&#34;}, &#34;purpose&#34;: 1}]</script> <script type="application/json" tag-management>{&#34;at&#34;: &#34;True&#34;, &#34;ga4&#34;: [{&#34;id&#34;: &#34;G-272J68FCRF&#34;, &#34;purpose&#34;: 1}, {&#34;id&#34;: &#34;G-YYP88VSJWR&#34;, &#34;purpose&#34;: 0}], &#34;ga4p&#34;: [{&#34;id&#34;: &#34;G-272J68FCRF&#34;, &#34;purpose&#34;: 1}], &#34;gtm&#34;: [], &#34;parameters&#34;: {&#34;internalUser&#34;: &#34;False&#34;, &#34;language&#34;: {&#34;machineTranslated&#34;: &#34;False&#34;, &#34;requested&#34;: &#34;en&#34;, &#34;served&#34;: &#34;en&#34;}, &#34;pageType&#34;: &#34;article&#34;, &#34;projectName&#34;: &#34;Google Chat&#34;, &#34;signedIn&#34;: &#34;False&#34;, &#34;tenant&#34;: &#34;developers&#34;, &#34;recommendations&#34;: {&#34;sourcePage&#34;: &#34;&#34;, &#34;sourceType&#34;: 0, &#34;sourceRank&#34;: 0, &#34;sourceIdenticalDescriptions&#34;: 0, &#34;sourceTitleWords&#34;: 0, &#34;sourceDescriptionWords&#34;: 0, &#34;experiment&#34;: &#34;&#34;}, &#34;experiment&#34;: {&#34;ids&#34;: &#34;&#34;}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="9+C8fwkGb/4BL28aj+hRAA+BvoSf+z"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/js/app_loader.js', '[1,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers","https://developers-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/developers/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png","https://fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developers.google.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["Concierge__enable_pushui","Experiments__reqs_query_experiments","Concierge__enable_concierge","MiscFeatureFlags__enable_view_transitions","Profiles__require_profile_eligibility_for_signin","MiscFeatureFlags__enable_firebase_utm","Search__enable_suggestions_from_borg","Search__enable_page_map","Profiles__enable_release_notes_notifications","Cloud__enable_free_trial_server_call","BookNav__enable_tenant_cache_key","CloudShell__cloud_code_overflow_menu","Profiles__enable_profile_collections","Profiles__enable_complete_playlist_endpoint","Cloud__enable_cloud_facet_chat","Profiles__enable_recognition_badges","Profiles__enable_awarding_url","DevPro__enable_cloud_innovators_plus","Profiles__enable_dashboard_curated_recommendations","Profiles__enable_public_developer_profiles","Search__enable_ai_search_summaries","Analytics__enable_clearcut_logging","Profiles__enable_completecodelab_endpoint","MiscFeatureFlags__developers_footer_image","Search__enable_ai_eligibility_checks","DevPro__enable_developer_subscriptions","Profiles__enable_developer_profiles_callout","MiscFeatureFlags__emergency_css","Concierge__enable_concierge_restricted","EngEduTelemetry__enable_engedu_telemetry","Cloud__enable_cloud_dlp_service","Search__enable_dynamic_content_confidential_banner","TpcFeatures__enable_required_headers","Cloud__enable_cloud_shell","MiscFeatureFlags__enable_explain_this_code","Cloud__enable_llm_concierge_chat","Cloud__enable_legacy_calculator_redirect","Significatio__enable_by_tenant","TpcFeatures__enable_mirror_tenant_redirects","CloudShell__cloud_shell_button","Profiles__enable_page_saving","MiscFeatureFlags__enable_project_variables","Cloud__enable_cloudx_ping","Search__enable_ai_search_summaries_restricted","MiscFeatureFlags__enable_variable_operator","Cloud__enable_cloud_shell_fte_user_flow","Cloud__enable_cloudx_experiment_ids","MiscFeatureFlags__developers_footer_dark_image"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.clients6.google.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.clients6.google.com",1,4,null,"https://developerprofiles-pa.clients6.google.com",[1,"developers","Google for Developers","developers.google.com",null,"developers-dot-devsite-v2-prod.appspot.com",null,null,[1,1,[1],null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations/information"],null,null,null,[1,1,1],[1,1,null,1,1]],null,[null,null,null,null,null,null,"/images/lockup-new.svg","/images/touchicon-180-new.png",null,null,null,null,1,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme-new.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,29,32,36],null,[[null,null,null,[3,7,10,2,39,17,4,32,24,11,12,13,34,15,25],null,null,[1,[["docType","Choose a content type",[["Tutorial",null,null,null,null,null,null,null,null,"Tutorial"],["Guide",null,null,null,null,null,null,null,null,"Guide"],["Sample",null,null,null,null,null,null,null,null,"Sample"]]],["product","Choose a product",[["Android",null,null,null,null,null,null,null,null,"Android"],["ARCore",null,null,null,null,null,null,null,null,"ARCore"],["ChromeOS",null,null,null,null,null,null,null,null,"ChromeOS"],["Firebase",null,null,null,null,null,null,null,null,"Firebase"],["Flutter",null,null,null,null,null,null,null,null,"Flutter"],["Assistant",null,null,null,null,null,null,null,null,"Google Assistant"],["GoogleCloud",null,null,null,null,null,null,null,null,"Google Cloud"],["GoogleMapsPlatform",null,null,null,null,null,null,null,null,"Google Maps Platform"],["GooglePay",null,null,null,null,null,null,null,null,"Google Pay & Google Wallet"],["GooglePlay",null,null,null,null,null,null,null,null,"Google Play"],["Tensorflow",null,null,null,null,null,null,null,null,"TensorFlow"]]],["category","Choose a topic",[["AiAndMachineLearning",null,null,null,null,null,null,null,null,"AI and Machine Learning"],["Data",null,null,null,null,null,null,null,null,"Data"],["Enterprise",null,null,null,null,null,null,null,null,"Enterprise"],["Gaming",null,null,null,null,null,null,null,null,"Gaming"],["Mobile",null,null,null,null,null,null,null,null,"Mobile"],["Web",null,null,null,null,null,null,null,null,"Web"]]]]]],[1,1],null,1],[[["UA-24532603-1"],["UA-22084204-5"],null,null,["UA-24532603-5"],null,null,[["G-272J68FCRF"],null,null,[["G-272J68FCRF",2]]],[["UA-24532603-1",2]],null,[["UA-24532603-5",2]],null,1],[[14,11],[6,5],[1,1],[15,12],[11,8],[5,4],[4,3],[16,13],[3,2],[12,9],[13,10]],[[1,1],[2,2]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"developers.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10