Reagowanie na incydenty przy użyciu Google Chat, Vertex AI i Apps Script

W tym samouczku pokazujemy, jak utworzyć aplikację Google Chat, która reagowania na incydenty w czasie rzeczywistym. Podczas reagowania na incydenty aplikacja tworzy i wypełnia pokój czatu, ułatwiając incydent za pomocą wiadomości, poleceń po ukośniku i oknach, a także podsumowywać przy użyciu AI odpowiedź na incydent w Dokumentach Google.

Incydent to zdarzenie, które wymaga natychmiastowej interwencji zespołu do rozwiązania problemu. Przykłady takich zdarzeń:

  • W systemie zarządzania relacjami z klientami (CRM) tworzone są wielkość liter w przypadku zmiany czasu. wymaga współpracy z zespołem usług nad rozwiązaniem tego problemu.
  • System przechodzi w tryb offline, co informuje o tym grupę inżynierów odpowiedzialnych za niezawodność witryny (SRE). Dzięki temu będą mogli razem przenieść treści do internetu.
  • Dochodzi do trzęsienia ziemi o dużej sile, a służby ratunkowe muszą aby koordynować ich odpowiedzi.

Na potrzeby tego samouczka alert dotyczący incydentu jest uruchamiany, gdy ktoś zgłasza incydent kliknięciem przycisku na stronie internetowej. Strona internetowa symuluje incydentu przez proszenie użytkowników o podanie podstawowych informacji o incydencie: tytułu, opisu i adresów e-mail użytkowników.

Zobacz, jak działa aplikacja Google Chat do zarządzania incydentami:

  • Strona, na której rozpoczyna się incydent.
    Rysunek 1. Strona internetowa, na której można zgłosić incydent.
  • Powiadomienie o utworzeniu pokoju czatu dla incydentu.
    Rysunek 2. Powiadomienie o utworzeniu pokoju czatu dla incydentu.
  • Pokój czatu reagowania na incydenty.
    Rysunek 3. Pokój czatu reagowania na incydenty.
  • Rozwiązywanie incydentu za pomocą polecenia po ukośniku.
    Rysunek 4. Rozwiązanie incydentu za pomocą polecenia po ukośniku.
  • Okno rozwiązywania incydentów.
    Rysunek 5. Okno rozwiązywania incydentów.
  • Rozwiązanie incydentu – dokument z Dokumentów Google udostępniony w przestrzeni.
    Rysunek 6. Rozwiązanie incydentu – dokument z Dokumentów Google udostępniony w przestrzeni.
  • Dokument Google dotyczący rozwiązania problemu związanego z podsumowaniem AI.
    Rysunek 7. Dokument dotyczący rozwiązania problemu związanego z podsumowaniem przez AI w Dokumentach Google.

Wymagania wstępne

Jeśli chcesz włączyć któreś z tych wymagań wstępnych w organizacji, zapytaj administrator Google Workspace, aby je włączyć:

  • Firmy lub przedsiębiorstwa Konto Google Workspace z dostępem do Google Chat.
  • Aby mieć Katalog (udostępnianie kontaktów) włączone w Google Workspace. Aplikacja do incydentu używa w katalogu, w którym można wyszukać informacje kontaktowe (np. imię i nazwisko), i adres e-mail. Osoby reagujące na incydenty muszą być użytkownikami z Google Chat konta Twojej organizacji Google Workspace.

Cele

  • stworzyć aplikację do obsługi czatu, która reaguje na incydenty;
  • Pomóż użytkownikom reagować na incydenty, wykonując te czynności:
    • Tworzę przestrzenie odpowiedzi na incydenty.
    • Publikowanie wiadomości z podsumowaniem incydentów i odpowiedzi.
    • Wspieranie współpracy za pomocą narzędzi interaktywnych Funkcje aplikacji Google Chat.
  • Podsumowuj rozmowy i rozwiązania w Vertex AI.

Architektura

Poniższy diagram przedstawia architekturę Google Workspace Zasoby Google Cloud używane przez odpowiedź na incydent aplikacji Google Chat.

Architektura aplikacji Google Chat odpowiedzi na incydent

Architektura pokazuje, jak reagowanie na incydenty Aplikacja Google Chat przetwarza incydent i rozwiązuje problem.

  1. Użytkownik rozpoczął incydent z witryny zewnętrznej hostowanej w Apps Script.

  2. Witryna wysyła asynchroniczne żądanie HTTP do aplikacja Google Chat, hostowana też w Apps Script.

  3. Odpowiedź na incydent w aplikacji Google Chat przetwarza żądanie:

    1. Usługa Apps Script Admin SDK otrzymuje członka zespołu takie jak identyfikator użytkownika i adres e-mail.

    2. Z zestawem żądań HTTP do interfejsu Chat API za pomocą usługa czatu Apps Script Advanced, reagowanie na incydenty Aplikacja Google Chat utworzy incydent Google Chat , wypełni go członkami zespołu i wyśle do niego wiadomość.

  4. Członkowie zespołu omawiają incydent w pokoju czatu.

  5. Członek zespołu wywołuje polecenie po ukośniku, aby zasygnalizować incydentem.

    1. wywołanie HTTP do interfejsu Chat API przy użyciu Apps Script, Zaawansowana usługa czatu wyświetla listę wszystkich wiadomości z pokoju.

    2. Vertex AI odbiera wymienione komunikaty i generuje podsumowanie.

    3. Usługa Apps Script DocumentApp tworzy Dokumenty i dodanie podsumowania Vertex AI dokument.

    4. Odpowiedź na incydent przez aplikację Google Chat Interfejs Chat API do wysłania wiadomości z linkiem do podsumowania Dokumenty.

Przygotowywanie środowiska

W tej sekcji dowiesz się, jak utworzyć i skonfigurować projekt Google Cloud dla platformy aplikacja Google Chat.

Utwórz projekt Google Cloud

Google Cloud Console

  1. W konsoli Google Cloud otwórz menu . > Administracja Administracja > Utwórz projekt.

    Otwórz stronę Tworzenie projektu

  2. W polu Project Name (Nazwa projektu) wpisz opisową nazwę projektu.

    Opcjonalnie: aby edytować identyfikator projektu, kliknij Edytuj. Identyfikatora projektu nie można zmienić po jego utworzeniu, wybierz więc identyfikator, który odpowiada potrzebom od początku w projektach AI.

  3. W polu Lokalizacja kliknij Przeglądaj, aby wyświetlić potencjalne lokalizacje dla w projektach AI. Następnie kliknij Wybierz.
  4. Kliknij Utwórz. Konsola Google Cloud otworzy stronę Panel, a projekt zostanie utworzony. w ciągu kilku minut.

interfejs wiersza poleceń gcloud

W jednym z tych środowisk programistycznych uzyskaj dostęp do Google Cloud Interfejs wiersza poleceń (`gcloud`):

  • Cloud Shell: korzystanie z terminala online za pomocą interfejsu wiersza poleceń gcloud. już skonfigurowane, aktywuj Cloud Shell.
    Aktywuj Cloud Shell
  • Local Shell (Powłoka lokalna): aby użyć lokalnego środowiska programistycznego, instalacja oraz zainicjuj w gcloud CLI.
    Aby utworzyć projekt Google Cloud, użyj polecenia `gcloud projects create`:
    gcloud projects create PROJECT_ID
    Zastąp PROJECT_ID, ustawiając identyfikator projektu, który chcesz utworzyć.

Włącz płatności za projekt Cloud

Google Cloud Console

  1. W konsoli Google Cloud otwórz Rozliczenia. Kliknij Menu > Płatności > Moje projekty.

    Otwórz Płatności za moje projekty

  2. W sekcji Wybierz organizację wybierz organizację powiązaną z: Twojemu projektowi Google Cloud.
  3. W wierszu projektu otwórz menu Działania. (), kliknij Zmień ustawienia płatności i wybierz konto rozliczeniowe Cloud.
  4. Kliknij Ustaw konto.

interfejs wiersza poleceń gcloud

  1. Aby wyświetlić listę dostępnych kont rozliczeniowych, uruchom polecenie:
    gcloud billing accounts list
  2. Połącz konto rozliczeniowe z projektem Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Zastąp następujące elementy:

    • PROJECT_ID to identyfikator projektu dla Projekt Cloud, dla którego chcesz włączyć płatności.
    • BILLING_ACCOUNT_ID to identyfikator konta rozliczeniowego, z którym chcesz połączyć konto projekt Google Cloud.

Włączanie interfejsów API

Google Cloud Console

  1. W konsoli Google Cloud włącz Google Chat API, Google Dokumentów API interfejsy API Admin SDK i Vertex AI API.

    Włączanie interfejsów API

  2. Sprawdź, czy interfejsy API są włączone we właściwym Projekt Cloud, a następnie kliknij Dalej.

  3. Sprawdź, czy włączasz odpowiednie interfejsy API, a następnie kliknij Włącz.

interfejs wiersza poleceń gcloud

  1. W razie potrzeby ustaw bieżący projekt Cloud na ten utworzony za pomocą polecenia gcloud config set project:

    gcloud config set project PROJECT_ID
    

    Zastąp PROJECT_ID identyfikatorem projektu utworzony przez Ciebie projekt Cloud.

  2. Włączanie interfejsów Google Chat API, Google Dokumenty API, Admin SDK API i Vertex AI API za pomocą polecenia gcloud services enable:

    gcloud services enable chat.googleapis.com docs.googleapis.com admin.googleapis.com aiplatform.googleapis.com
    

Konfigurowanie uwierzytelniania i autoryzacji

Uwierzytelnianie i autoryzacja umożliwia Dostęp do zasobów aplikacji do obsługi czatu w Google Workspace oraz Google Cloud do przetworzenia odpowiedzi na incydent.

W tym samouczku publikujesz aplikację wewnętrznie, więc można użyć obiektu zastępczego i informacjami o nich. Zanim opublikujesz aplikację na zewnątrz, zastąp symbol zastępczy z rzeczywistymi danymi do wyświetlenia na ekranie zgody.

  1. W konsoli Google Cloud wybierz Menu > Interfejsy API i Usługi > Ekran zgody OAuth.

    Otwórz ekran zgody OAuth

  2. W sekcji Typ użytkownika wybierz Wewnętrzny i kliknij Utwórz.

  3. W polu Nazwa aplikacji wpisz Incident Management.

  4. W sekcji Adres e-mail pomocy technicznej dla użytkowników wybierz swój adres e-mail lub odpowiedni Grupa dyskusyjna Google.

  5. W sekcji Dane kontaktowe dewelopera wpisz swój adres e-mail.

  6. Kliknij Zapisz i kontynuuj.

  7. Kliknij Dodaj lub usuń zakresy. Pojawi się panel z listą zakresów dla każdego interfejsu API włączonego w projekcie Cloud.

  8. W sekcji Dodaj zakresy ręcznie wklej te zakresy:

    • https://www.googleapis.com/auth/chat.spaces.create
    • https://www.googleapis.com/auth/chat.memberships
    • https://www.googleapis.com/auth/chat.memberships.app
    • https://www.googleapis.com/auth/chat.messages
    • https://www.googleapis.com/auth/documents
    • https://www.googleapis.com/auth/admin.directory.user.readonly
    • https://www.googleapis.com/auth/script.external_request
    • https://www.googleapis.com/auth/userinfo.email
    • https://www.googleapis.com/auth/cloud-platform
  9. Kliknij Dodaj do tabeli.

  10. Kliknij Aktualizuj.

  11. Kliknij Zapisz i kontynuuj.

  12. Przejrzyj podsumowanie rejestracji aplikacji i kliknij Powrót do panelu.

Tworzenie i wdrażanie aplikacji Google Chat

W następnej sekcji skopiujesz i zaktualizujesz cały Projekt Apps Script zawierający całą wymaganą aplikację do aplikacji Google Chat, więc nie musisz kopiować wklej każdy plik.

Niektóre funkcje zawierają podkreślenia na końcu nazw, na przykład processSlashCommand_() od: ChatApp.gs. Podkreślenie ukrywa funkcję ze strony internetowej inicjowania incydentu, gdy jest ona otwarta w przeglądarce. Więcej Więcej informacji zawiera Funkcje prywatne

Apps Script obsługuje 2 typy plików: skrypty .gs oraz .html . Aby zapewnić zgodność z tymi zasadami, umieszczamy kod JavaScript po stronie klienta w aplikacji. wewnątrz tagów <script />, a jego CSS jest zawarty w tagach <style />. lub plik HTML.

Opcjonalnie możesz wyświetlić cały projekt na GitHubie.

Wyświetl w GitHubie

Oto omówienie poszczególnych plików:

Consts.gs

Definiuje stałe, do których odwołują się inne pliki kodu, w tym identyfikator projektu Cloud, identyfikator lokalizacji Vertex AI identyfikator polecenia po ukośniku, który kończy incydent.

Wyświetl kod aplikacji Consts.gs

apps-script/incident-response/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const CLOSE_INCIDENT_COMMAND_ID = 1;
ChatApp.gs

Obsługuje zdarzenia interakcji z Google Chat, w tym: wiadomości, kliknięcia kart, polecenia po ukośniku i okna dialogowe. Odpowiada na Polecenie /closeIncident po ukośniku przez otwarcie okna do zbierania informacji o incydencie szczegóły rozwiązania problemu. czytanie wiadomości w pokoju przez wywołanie funkcji Metoda spaces.messages.list w interfejsie Chat API. Pobiera identyfikatory użytkowników za pomocą usługi katalogowej pakietu Admin SDK w Apps Script.

Wyświetl kod aplikacji ChatApp.gs

apps-script/incident-response/ChatApp.gs
/**
 * Responds to a MESSAGE event in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident").
 * It will respond to any other message with a simple "Hello" text message.
 *
 * @param {Object} event the event object from Google Chat
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    return processSlashCommand_(event);
  }
  return { "text": "Hello from Incident Response app!" };
}

/**
 * Responds to a CARD_CLICKED event in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 *
 * @param {Object} event the event object from Google Chat
 */
function onCardClick(event) {
  if (event.isDialogEvent) {
    if (event.dialogEventType == 'SUBMIT_DIALOG') {
      return processSubmitDialog_(event);
    }
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: {
          actionStatus: "OK"
        }
      }
    };
  }
}

/**
 * Responds to a MESSAGE event with a Slash command in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident")
 * by returning a Dialog.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSlashCommand_(event) {
  if (event.message.slashCommand.commandId != CLOSE_INCIDENT_COMMAND_ID) {
    return {
      "text": "Command not recognized. Use the command `/closeIncident` to close the incident managed by this space."
    };
  }
  const sections = [
    {
      header: "Close Incident",
      widgets: [
        {
          textInput: {
            label: "Please describe the incident resolution",
            type: "MULTIPLE_LINE",
            name: "description"
          }
        },
        {
          buttonList: {
            buttons: [
              {
                text: "Close Incident",
                onClick: {
                  action: {
                    function: "closeIncident"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  ];
  return {
    actionResponse: {
      type: "DIALOG",
      dialogAction: {
        dialog: {
          body: {
            sections,
          }
        }
      }
    }
  };
}

/**
 * Responds to a CARD_CLICKED event with a Dialog submission in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 * It creates a Doc with a summary of the incident information and posts a message
 * to the space with a link to the Doc.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSubmitDialog_(event) {
  const resolution = event.common.formInputs.description[""].stringInputs.value[0];
  const chatHistory = concatenateAllSpaceMessages_(event.space.name);
  const chatSummary = summarizeChatHistory_(chatHistory);
  const docUrl = createDoc_(event.space.displayName, resolution, chatHistory, chatSummary);
  return {
    actionResponse: {
      type: "NEW_MESSAGE",
    },
    text: `Incident closed with the following resolution: ${resolution}\n\nHere is the automatically generated post-mortem:\n${docUrl}`
  };
}

/**
 * Lists all the messages in the Chat space, then concatenate all of them into
 * a single text containing the full Chat history.
 *
 * For simplicity for this demo, it only fetches the first 100 messages.
 *
 * Messages with slash commands are filtered out, so the returned history will
 * contain only the conversations between users and not app command invocations.
 *
 * @return {string} a text containing all the messages in the space in the format:
 *          Sender's name: Message
 */
function concatenateAllSpaceMessages_(spaceName) {
  // Call Chat API method spaces.messages.list
  const response = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 });
  const messages = response.messages;
  // Fetch the display names of the message senders and returns a text
  // concatenating all the messages.
  let userMap = new Map();
  return messages
    .filter(message => message.slashCommand === undefined)
    .map(message => `${getUserDisplayName_(userMap, message.sender.name)}: ${message.text}`)
    .join('\n');
}

/**
 * Obtains the display name of a user by using the Admin Directory API.
 *
 * The fetched display name is cached in the provided map, so we only call the API
 * once per user.
 *
 * If the user does not have a display name, then the full name is used.
 *
 * @param {Map} userMap a map containing the display names previously fetched
 * @param {string} userName the resource name of the user
 * @return {string} the user's display name
 */
function getUserDisplayName_(userMap, userName) {
  if (userMap.has(userName)) {
    return userMap.get(userName);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userName.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignore error if the API call fails (for example, because it's an
    // out-of-domain user or Chat app)) and just use 'Unknown User'.
  }
  userMap.set(userName, displayName);
  return displayName;
}
ChatSpaceCreator.gs

Otrzymuje dane z formularza, które użytkownicy wpisują w incydencie i używa jej do skonfigurowania Google Chat, przez utworzenie i wypełnienie miejsca, a następnie publikowanie wiadomości na temat incydentem.

Wyświetl kod aplikacji ChatSpaceCreator.gs

apps-script/incident-response/ChatSpaceCreator.gs
/**
 * Creates a space in Google Chat with the provided title and members, and posts an
 * initial message to it.
 *
 * @param {Object} formData the data submitted by the user. It should contain the fields
 *                          title, description, and users.
 * @return {string} the resource name of the new space.
 */
function createChatSpace(formData) {
  const users = formData.users.trim().length > 0 ? formData.users.split(',') : [];
  const spaceName = setUpSpace_(formData.title, users);
  addAppToSpace_(spaceName);
  createMessage_(spaceName, formData.description);
  return spaceName;
}

/**
 * Creates a space in Google Chat with the provided display name and members.
 *
 * @return {string} the resource name of the new space.
 */
function setUpSpace_(displayName, users) {
  const memberships = users.map(email => ({
    member: {
      name: `users/${email}`,
      type: "HUMAN"
    }
  }));
  const request = {
    space: {
      displayName: displayName,
      spaceType: "SPACE",
      externalUserAllowed: true
    },
    memberships: memberships
  };
  // Call Chat API method spaces.setup
  const space = Chat.Spaces.setup(request);
  return space.name;
}

/**
 * Adds this Chat app to the space.
 *
 * @return {string} the resource name of the new membership.
 */
function addAppToSpace_(spaceName) {
  const request = {
    member: {
      name: "users/app",
      type: "BOT"
    }
  };
  // Call Chat API method spaces.members.create
  const membership = Chat.Spaces.Members.create(request, spaceName);
  return membership.name;
}

/**
 * Posts a text message to the space on behalf of the user.
 *
 * @return {string} the resource name of the new message.
 */
function createMessage_(spaceName, text) {
  const request = {
    text: text
  };
  // Call Chat API method spaces.messages.create
  const message = Chat.Spaces.Messages.create(request, spaceName);
  return message.name;
}
DocsApi.gs

Wywołuje interfejs API Dokumentów Google, aby utworzyć dokument w formacie Dysku Google użytkownika i zapisze podsumowanie informacji o incydencie, utworzona w VertexAiApi.gs, do dokumentu.

Wyświetl kod aplikacji DocsApi.gs

apps-script/incident-response/DocsApi.gs
/**
 * Creates a Doc in the user's Google Drive and writes a summary of the incident information to it.
 *
 * @param {string} title The title of the incident
 * @param {string} resolution Incident resolution described by the user
 * @param {string} chatHistory The whole Chat history be included in the document
 * @param {string} chatSummary A summary of the Chat conversation to be included in the document
 * @return {string} the URL of the created Doc
 */
function createDoc_(title, resolution, chatHistory, chatSummary) {
  let doc = DocumentApp.create(title);
  let body = doc.getBody();
  body.appendParagraph(`Post-Mortem: ${title}`).setHeading(DocumentApp.ParagraphHeading.TITLE);
  body.appendParagraph("Resolution").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(resolution);
  body.appendParagraph("Summary of the conversation").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatSummary);
  body.appendParagraph("Full Chat history").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatHistory);
  return doc.getUrl();
}
VertexAiApi.gs

Podsumowuje rozmowę w Google Chat. za pomocą Vertex AI. Podsumowanie jest publikowane w specjalnie utworzonym dokument w kolekcji DocsAPI.gs.

Wyświetl kod aplikacji VertexAiApi.gs

apps-script/incident-response/VertexAiApi.gs
/**
 * Summarizes a Chat conversation using the Vertex AI text prediction API.
 *
 * @param {string} chatHistory The Chat history that will be summarized.
 * @return {string} The content from the text prediction response.
 */
function summarizeChatHistory_(chatHistory) {
  const prompt =
    "Summarize the following conversation between Engineers resolving an incident"
      + " in a few sentences. Use only the information from the conversation.\n\n"
      + chatHistory;
  const request = {
    instances: [
      { prompt: prompt }
    ],
    parameters: {
      temperature: 0.2,
      maxOutputTokens: 256,
      topK: 40,
      topP: 0.95
    }
  }
  const fetchOptions = {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    contentType: 'application/json',
    payload: JSON.stringify(request)
  }
  const response = UrlFetchApp.fetch(
    `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
      + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
      + "/publishers/google/models/text-bison:predict",
    fetchOptions);
  const payload = JSON.parse(response.getContentText());
  return payload.predictions[0].content;
}
WebController.gs

Obsługuje witrynę inicjującą incydent.

Wyświetl kod aplikacji WebController.gs

apps-script/incident-response/WebController.gs
/**
 * Serves the web page from Index.html.
 */
function doGet() {
  return HtmlService
    .createTemplateFromFile('Index')
    .evaluate();
}

/**
 * Serves the web content from the specified filename.
 */
function include(filename) {
  return HtmlService
    .createHtmlOutputFromFile(filename)
    .getContent();
}

/**
 * Returns the email address of the user running the script.
 */
function getUserEmail() {
  return Session.getActiveUser().getEmail();
}
Index.html

Kod HTML zawierający witrynę inicjującą incydent.

Wyświetl kod aplikacji Index.html

apps-script/incident-response/Index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'>
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
    <div class="container">
      <div class="content">
        <h1>Incident Manager</h1>
        <form id="incident-form" onsubmit="handleFormSubmit(this)">
          <div id="form">
            <p>
              <label for="title">Incident title</label><br/>
              <input type="text" name="title" id="title" />
            </p>
            <p>
              <label for="users">Incident responders</label><br/>
              <small>
                Please enter a comma-separated list of email addresses of the users
                that should be added to the space.
                Do not include <?= getUserEmail() ?> as it will be added automatically.
              </small><br/>
              <input type="text" name="users" id="users" />
            </p>
            <p>
              <label for="description">Initial message</label></br>
              <small>This message will be posted after the space is created.</small><br/>
              <textarea name="description" id="description"></textarea>
            </p>
            <p class="text-center">
              <input type="submit" value="CREATE CHAT SPACE" />
            </p>
          </div>
          <div id="output" class="hidden"></div>
          <div id="clear" class="hidden">
            <input type="reset" value="CREATE ANOTHER INCIDENT" onclick="onReset()" />
          </div>
        </form>
      </div>
    </div>
    <?!= include('JavaScript'); ?>
  </body>
</html>
JavaScript.html

Obsługuje działania formularza, w tym przesyłanie, błędów i usunięć w przypadku witryny inicjującej incydent. Oferta jest dostępna do funkcji Index.html przez niestandardową funkcję include w WebController.gs.

Wyświetl kod aplikacji JavaScript.html

apps-script/incident-response/JavaScript.html
<script>
  var formDiv = document.getElementById('form');
  var outputDiv = document.getElementById('output');
  var clearDiv = document.getElementById('clear');

  function handleFormSubmit(formObject) {
    event.preventDefault();
    outputDiv.innerHTML = 'Please wait while we create the space...';
    hide(formDiv);
    show(outputDiv);
    google.script.run
      .withSuccessHandler(updateOutput)
      .withFailureHandler(onFailure)
      .createChatSpace(formObject);
  }

  function updateOutput(response) {
    var spaceId = response.replace('spaces/', '');
    outputDiv.innerHTML =
      '<p>Space created!</p><p><a href="https://mail.google.com/chat/#chat/space/'
        + spaceId
        + '" target="_blank">Open space</a></p>';
    show(outputDiv);
    show(clearDiv);
  }

  function onFailure(error) {
    outputDiv.innerHTML = 'ERROR: ' + error.message;
    outputDiv.classList.add('error');
    show(outputDiv);
    show(clearDiv);
  }

  function onReset() {
    outputDiv.innerHTML = '';
    outputDiv.classList.remove('error');
    show(formDiv);
    hide(outputDiv);
    hide(clearDiv);
  }

  function hide(element) {
    element.classList.add('hidden');
  }

  function show(element) {
    element.classList.remove('hidden');
  }
</script>
Stylesheet.html

Kod CSS witryny inicjującej incydent. Jest uwzględnione w Index.html przez niestandardową funkcję include w WebController.gs

Wyświetl kod aplikacji Stylesheet.html

apps-script/incident-response/Stylesheet.html
<style>
  * {
    box-sizing: border-box;
  }
  body {
    font-family: Roboto, Arial, Helvetica, sans-serif;
  }
  div.container {
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
  }
  div.content {
    width: 80%;
    max-width: 1000px;
    padding: 1rem;
    border: 1px solid #999;
    border-radius: 0.25rem;
    box-shadow: 0 2px 2px 0 rgba(66, 66, 66, 0.08), 0 2px 4px 2px rgba(66, 66, 66, 0.16);
  }
  h1 {
    text-align: center;
    padding-bottom: 1rem;
    margin: 0 -1rem 1rem -1rem;
    border-bottom: 1px solid #999;
  }
 #output {
    text-align: center;
    min-height: 250px;
  }
  div#clear {
    text-align: center;
    padding-top: 1rem;
    margin: 1rem -1rem 0 -1rem;
    border-top: 1px solid #999;
  }
  input[type=text], textarea {
    width: 100%;
    padding: 1rem 0.5rem;
    margin: 0.5rem 0;
    border: 0;
    border-bottom: 1px solid #999;
    background-color: #f0f0f0;
  }
  textarea {
    height: 5rem;
  }
  small {
    color: #999;
  }
  input[type=submit], input[type=reset] {
    padding: 1rem;
    border: none;
    background-color: #6200ee;
    color: #fff;
    border-radius: 0.25rem;
    width: 25%;
  }
  .hidden {
    display: none;
  }
  .text-center {
    text-align: center;
  }
  .error {
    color: red;
  }
</style>

Znajdowanie numeru i identyfikatora projektu Cloud

  1. W konsoli Google Cloud otwórz swój projekt Cloud.

    Otwórz konsolę Google Cloud

  2. Kliknij Ustawienia i narzędzia. &gt; Ustawienia projektu.

  3. Zwróć uwagę na wartości w polach Numer projektu i Identyfikator projektu. Ty jak je wykorzystać w kolejnych sekcjach.

Tworzenie projektu Apps Script

Aby utworzyć projekt Apps Script i połączyć go ze swoim Projekt w chmurze:

  1. Kliknij poniższy przycisk, aby otworzyć projekt Apps Script Odpowiadanie na incydenty przy użyciu Google Chat.
    Otwórz projekt
  2. Kliknij Przegląd.
  3. Na stronie Przegląd kliknij Ikona tworzenia kopii Utwórz kopię.
  4. Nazwij kopię projektu Apps Script:

    1. Kliknij Kopia odpowiedzi na incydenty w Google Chat.

    2. W polu Tytuł projektu wpisz Incident Management Chat app.

    3. Kliknij Zmień nazwę.

  5. W kopii projektu Apps Script otwórz Consts.gs. i zastąp YOUR_PROJECT_ID identyfikatorem swojego Projekt w chmurze.

Ustawianie projektu Cloud w projekcie Apps Script

  1. W projekcie Apps Script kliknij Ikona ustawień projektu Ustawienia projektu.
  2. W sekcji Projekt Google Cloud Platform (GCP) kliknij Zmień projekt.
  3. W polu Numer projektu GCP wklej numer projektu Cloud.
  4. Kliknij Set project (Ustaw projekt). Projekt Cloud i Apps Script projekty są teraz połączone.

Tworzenie wdrożenia Apps Script

Po umieszczeniu całego kodu w odpowiednim miejscu wdróż skrypt Apps Script w projektach AI. Identyfikator wdrożenia służy do konfigurowania Aplikacja Google Chat w Google Cloud.

  1. W Apps Script otwórz projekt aplikacji do reagowania na incydenty.

    Otwórz Apps Script

  2. Kliknij Wdróż > Nowe wdrożenie.

  3. Jeśli opcje Dodatek i Aplikacja internetowa nie są jeszcze wybrane, obok Wybierz typ, kliknij typy wdrożenia Ikona ustawień projektu, a następnie zaznacz Dodatek i Aplikacja internetowa.

  4. W polu Opis wpisz opis wersji, na przykład Complete version of incident management app

  5. W sekcji Wykonaj jako wybierz Użytkownik uzyskuje dostęp do aplikacji internetowej.

  6. W sekcji Kto ma dostęp wybierz Każdy w Twojej organizacji Workspace. gdzie „Twoja organizacja Workspace”; to nazwa Twojego organizacji Google Workspace.

  7. Kliknij Wdróż. Raporty Apps Script zostały przesłane wdrożenie oraz identyfikator wdrożenia i adres URL incydentu; strony internetowej inicjowania.

  8. Zanotuj adres URL aplikacji internetowej, aby móc otworzyć ją później po rozpoczęciu incydentu. Skopiuj Identyfikator wdrożenia. Użyjesz go podczas konfigurowania aplikacja Google Chat w konsoli Google Cloud;

  9. Kliknij Gotowe.

Konfigurowanie aplikacji Google Chat w konsoli Google Cloud

Z tej sekcji dowiesz się, jak skonfigurować interfejs Google Chat API w konsoli Google Cloud. z informacjami o aplikacji Google Chat, w tym Identyfikator wdrożenia utworzonego przed chwilą z poziomu Apps Script w projektach AI.

  1. W konsoli Google Cloud kliknij Menu. &gt; Więcej produktów &gt; Google Workspace &gt; Biblioteka usług &gt; Interfejs Google Chat API &gt; Zarządzaj &gt; Konfiguracja.

    Otwórz konfigurację interfejsu Chat API

  2. W polu Nazwa aplikacji wpisz Incident Management.

  3. W polu URL awatara wpisz https://developers.google.com/chat/images/quickstart-app-avatar.png.

  4. W polu Opis wpisz Responds to incidents..

  5. Kliknij przełącznik Włącz funkcje interaktywne, aby ustawić go w pozycji włączenia.

  6. W sekcji Funkcjonalność wybierz Odbieranie wiadomości 1:1, Dołączanie do pokoi i rozmów grupowych.

  7. W sekcji Ustawienia połączenia wybierz Projekt Apps Script.

  8. W polu Deployment ID (Identyfikator wdrożenia) wklej identyfikator wdrożenia Apps Script. skopiowaną wcześniej z projektu Apps Script. lub wdrożenia.

  9. Zarejestruj polecenie po ukośniku, w pełni zaimplementowana aplikacja Google Chat używa:

    1. W sekcji Polecenia po ukośniku kliknij Dodaj polecenie po ukośniku.

    2. W polu Nazwa wpisz /closeIncident.

    3. W polu Identyfikator polecenia wpisz 1.

    4. W polu Opis wpisz Closes the incident being discussed in the space.

    5. Wybierz Otwiera okno.

    6. Kliknij Gotowe. Polecenie po ukośniku zostanie zarejestrowane i wyświetlone.

  10. W sekcji Widoczność wybierz Udostępnij tę aplikację do obsługi czatu określonym osobom i grupom w Domena Workspace i wpisz swój adres e-mail.

  11. W sekcji Logi wybierz Rejestruj błędy w usłudze Logging.

  12. Kliknij Zapisz. Pojawi się komunikat o zapisanej konfiguracji, który oznacza, że aplikacja gotowe do testowania.

Testowanie aplikacji Google Chat

Aby przetestować aplikację Google Chat do zarządzania incydentami, zainicjuj incydent ze strony internetowej i sprawdź, czy aplikacja Google Chat działa zgodnie z oczekiwaniami:

  1. Otwórz adres URL wdrożenia aplikacji internetowej Apps Script.

  2. Gdy Apps Script prosi o pozwolenie na dostęp do Twoich danych, kliknij Sprawdź uprawnienia, zaloguj się na odpowiednie konto Google. w domenie Google Workspace i kliknij Zezwól.

  3. Otworzy się strona internetowa inicjowania incydentu. Wpisz informacje o teście:

    1. W polu Nazwa incydentu wpisz The First Incident.
    2. Opcjonalnie w polu Służby ratunkowe wpisz adresy e-mail użytkowników innych służb ratowniczych. Muszą to być użytkownicy z konta Google Chat w Twojej organizacji Google Workspace, nie można utworzyć pokoju. Nie wpisuj własnego adresu e-mail, ponieważ dołączane automatycznie.
    3. W polu Wiadomość początkowa wpisz Testing the incident management Chat app.
  4. Kliknij Utwórz pokój czatu. Pojawi się wiadomość z kategorii creating space.

  5. Po utworzeniu pokoju pojawi się wiadomość Space created!. Kliknij Otwórz pokój, który otwiera pokój w Google Chat w nowej karcie.

  6. Opcjonalnie Ty i inni ratownicy możecie wysyłać wiadomości w kosmosu. Aplikacja podsumowuje te komunikaty za pomocą Vertex AI i udostępnia dokumentu retrospektywacyjnego.

  7. Aby zakończyć reagowanie na incydenty i rozpocząć proces rozwiązywania problemów, w Pokój czatu, typ /closeIncident. Zarządzanie incydentami zostanie otwarte okno dialogowe.

  8. W polu Zamknij incydent wpisz opis rozwiązania incydentu. na przykład Test complete.

  9. Kliknij Zamknij incydent.

Aplikacja do zarządzania incydentami wyświetla listę wiadomości w pokoju i podsumowuje je. za pomocą Vertex AI, wkleja podsumowanie do dokumentu w Dokumentach Google i udostępnia dokumentu w pokoju.

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za używanych w tym samouczku, zalecamy usunięcie Projekt w chmurze.

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami. Kliknij Menu &gt; Uprawnienia Administracja &gt; Zarządzaj zasobami.

    Otwórz menedżera zasobów .

  2. Na liście projektów wybierz projekt do usunięcia, a następnie kliknij Usuń .
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby go usunąć. nad projektem.