Merespons insiden dengan Google Chat, Vertex AI, dan Apps Script

Tutorial ini menunjukkan cara membuat aplikasi Google Chat yang merespons insiden secara real time. Saat merespons suatu insiden, aplikasi membuat dan mengisi ruang Chat, memfasilitasi insiden resolusi dengan pesan, perintah garis miring, dan dialog, serta menggunakan AI untuk meringkas respons insiden dalam dokumen Google Dokumen.

Insiden adalah peristiwa yang memerlukan perhatian segera dari tim yang harus diselesaikan. Contoh insiden meliputi:

  • Kasus mendesak dibuat di Pengelolaan Hubungan Pelanggan (CRM) platform ini, membutuhkan tim layanan untuk berkolaborasi dalam sebuah resolusi.
  • Sistem menjadi offline, dan memperingatkan sekelompok site reliability engineer (SRE) sehingga mereka dapat bekerja sama untuk menghadirkannya kembali secara online.
  • Gempa bumi berkekuatan tinggi terjadi, dan petugas darurat membutuhkan untuk mengkoordinasikan tanggapan mereka.

Untuk tujuan tutorial ini, pemberitahuan insiden dimulai saat seseorang melaporkan insiden dengan menekan tombol klik dari laman web. Halaman web ini menyimulasikan insiden dengan meminta pengguna untuk memasukkan informasi insiden dasar: judul, deskripsi, dan alamat email responden.

Lihat cara kerja aplikasi Chat manajemen insiden:

  • Situs yang memulai insiden.
    Gambar 1. Situs tempat seseorang dapat melaporkan insiden.
  • Notifikasi bahwa ruang Chat insiden dibuat.
    Gambar 2. Notifikasi bahwa ruang Chat insiden telah dibuat.
  • Ruang Chat respons insiden.
    Gambar 3. Ruang Chat respons insiden.
  • Menyelesaikan insiden dengan perintah garis miring.
    Gambar 4. Menyelesaikan insiden dengan perintah garis miring.
  • Dialog resolusi insiden.
    Gambar 5. Dialog resolusi insiden.
  • Dokumen Google Dokumen resolusi insiden dibagikan di ruang.
    Gambar 6. Dokumen Google Dokumen resolusi insiden dibagikan di ruang.
  • Dokumen Google resolusi insiden ringkasan AI.
    Gambar 7. Dokumen Google Dokumen penyelesaian insiden ringkasan AI.

Prasyarat

Jika Anda perlu mengaktifkan salah satu prasyarat ini untuk organisasi Anda, minta administrator Google Workspace Anda untuk mengaktifkannya:

  • Sebuah Business atau Enterprise Akun Google Workspace yang memiliki akses ke Google Chat.
  • Untuk memiliki Direktori (berbagi kontak) diaktifkan untuk Google Workspace. Aplikasi insiden menggunakan direktori untuk mencari para petugas respons insiden info kontak, seperti nama dan alamat email Anda. Perespons insiden harus merupakan pengguna dengan Google Chat di organisasi Google Workspace Anda.

Tujuan

  • Membangun aplikasi Chat yang merespons insiden.
  • Bantu pengguna merespons insiden dengan melakukan hal berikut:
    • Membuat ruang respons insiden.
    • Memposting pesan yang merangkum insiden dan respons.
    • Mendukung kolaborasi dengan Fitur aplikasi Chat.
  • Meringkas percakapan dan resolusi dengan Vertex AI.

Arsitektur

Diagram berikut menunjukkan arsitektur Google Workspace dan Resource Google Cloud yang digunakan oleh respons insiden Aplikasi Google Chat.

Arsitektur aplikasi Google Chat respons insiden

Arsitektur ini menunjukkan bagaimana respons insiden Aplikasi Google Chat memproses insiden dan resolusi.

  1. Pengguna memulai insiden dari situs web eksternal yang dihosting di Apps Script.

  2. Situs mengirim permintaan HTTP asinkron ke Aplikasi Google Chat, yang juga dihosting di Apps Script.

  3. Aplikasi Google Chat respons insiden akan memproses permintaan:

    1. Layanan Apps Script Admin SDK mendapatkan anggota tim seperti ID pengguna dan alamat email.

    2. Dengan serangkaian permintaan HTTP ke Chat API menggunakan Layanan Chat Lanjutan Apps Script, respons insiden Aplikasi Google Chat membuat Chat insiden mengisinya dengan anggota tim, dan mengirim pesan ke ruang tersebut.

  4. Anggota tim mendiskusikan insiden tersebut di ruang Chat.

  5. Seorang anggota tim memanggil perintah garis miring untuk memberi sinyal resolusi ke insiden bulanan.

    1. Panggilan HTTP ke Chat API menggunakan Apps Script Layanan Chat lanjutan mencantumkan semua pesan ruang.

    2. Vertex AI menerima pesan yang tercantum dan membuat ringkasan.

    3. Layanan DocumentApp Apps Script membuat mendokumentasikan dokumen dan menambahkan ringkasan Vertex AI ke dokumen.

    4. Panggilan aplikasi Google Chat respons insiden Chat API untuk mengirim pesan yang membagikan link ke ringkasan Dokumen.

Menyiapkan lingkungan

Bagian ini menunjukkan cara membuat dan mengonfigurasi project Google Cloud untuk Aplikasi Chat.

Membuat project Google Cloud

Konsol Google Cloud

  1. Di konsol Google Cloud, buka Menu > IAM & Admin > Buat Project.

    Buka bagian Create a Project

  2. Di kolom Project Name, masukkan nama deskriptif untuk project Anda.

    Opsional: Untuk mengedit Project ID, klik Edit. Project ID tidak dapat diubah setelah proyek dibuat, jadi pilihlah ID yang sesuai dengan kebutuhan Anda sepanjang waktu proyek.

  3. Di kolom Lokasi, klik Jelajahi untuk menampilkan potensi lokasi untuk proyek. Kemudian, klik Select.
  4. Klik Buat. Konsol Google Cloud membuka halaman Dashboard dan project Anda telah dibuat dalam beberapa menit.

gcloud CLI

Di salah satu lingkungan pengembangan berikut, akses paket Google Cloud CLI (`gcloud`):

  • Cloud Shell: Untuk menggunakan terminal online dengan gcloud CLI sudah disiapkan, aktifkan Cloud Shell.
    Mengaktifkan Cloud Shell
  • Local Shell: Untuk menggunakan lingkungan pengembangan lokal, instal dan inisialisasi gcloud CLI.
    Untuk membuat project Cloud, gunakan perintah `gcloud projects create`:
    gcloud projects create PROJECT_ID
    Ganti PROJECT_ID dengan menetapkan ID untuk project yang ingin Anda buat.

Mengaktifkan penagihan untuk project Cloud

Konsol Google Cloud

  1. Di konsol Google Cloud, buka Billing. Klik Menu > Penagihan > Project Saya.

    Buka Penagihan untuk Project Saya

  2. Di bagian Pilih organisasi, pilih organisasi yang dikaitkan dengan project Google Cloud Anda.
  3. Di baris project, buka menu Tindakan (), klik Ubah penagihan, lalu pilih Akun Penagihan Cloud Anda.
  4. Klik Tetapkan akun.

gcloud CLI

  1. Untuk menampilkan daftar akun penagihan yang tersedia, jalankan:
    gcloud billing accounts list
  2. Tautkan akun penagihan dengan project Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Ganti kode berikut:

    • PROJECT_ID adalah Project ID untuk Project cloud yang penagihannya ingin Anda aktifkan.
    • BILLING_ACCOUNT_ID adalah ID akun penagihan yang akan ditautkan project Google Cloud.

Mengaktifkan API

Konsol Google Cloud

  1. Di konsol Google Cloud, aktifkan Google Chat API, yakni Google Docs API, Admin SDK API, dan Vertex AI API.

    Aktifkan API

  2. Pastikan Anda mengaktifkan API dengan lalu klik Berikutnya.

  3. Pastikan Anda mengaktifkan API yang benar, lalu klik Enable.

gcloud CLI

  1. Jika perlu, tetapkan project Cloud saat ini ke project yang Anda buat dengan perintah gcloud config set project:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan Project ID dari Project Cloud yang telah Anda buat.

  2. Mengaktifkan Google Chat API, Google Docs API, Admin SDK API, dan Vertex AI API dengan perintah gcloud services enable:

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

Menyiapkan autentikasi dan otorisasi

Otentikasi dan otorisasi memungkinkan Referensi akses aplikasi Chat di Google Workspace dan Google Cloud untuk memproses respons insiden.

Dalam tutorial ini, Anda akan memublikasikan aplikasi secara internal sehingga placeholder dapat digunakan tidak akurat atau tidak sesuai. Sebelum memublikasikan aplikasi secara eksternal, ganti placeholder dengan informasi aktual di layar izin.

  1. Di Konsol Google Cloud, buka Menu > API & Layanan > Layar izin OAuth.

    Buka layar izin OAuth

  2. Di bagian Jenis pengguna, pilih Internal, lalu klik Buat.

  3. Di App name, ketik Incident Management.

  4. Di bagian Email dukungan pengguna, pilih alamat email Anda atau alamat Grup Google.

  5. Di bagian Informasi kontak developer, masukkan alamat email Anda.

  6. Klik Simpan dan Lanjutkan.

  7. Klik Add or Remove Scopes. Panel akan muncul dengan daftar cakupan untuk setiap API yang telah Anda aktifkan di project Cloud.

  8. Di bagian Tambahkan cakupan secara manual, tempel cakupan berikut:

    • 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. Klik Tambahkan ke Tabel.

  10. Klik Perbarui.

  11. Klik Simpan dan Lanjutkan.

  12. Tinjau ringkasan pendaftaran aplikasi, lalu klik Kembali ke Dasbor.

Membuat dan men-deploy aplikasi Chat

Di bagian berikut, Anda akan menyalin dan memperbarui seluruh Project Apps Script yang berisi semua aplikasi yang diperlukan kode aplikasi Chat, jadi tidak perlu menyalin dan tempelkan setiap file.

Beberapa fungsi menyertakan garis bawah di akhir nama mereka, seperti processSlashCommand_() dari ChatApp.gs. Garis bawah menyembunyikan fungsi dari halaman web inisialisasi insiden ketika terbuka di browser. Untuk selengkapnya informasi, lihat Fungsi pribadi.

Apps Script mendukung dua jenis file, skrip .gs dan .html . Untuk mematuhi dukungan ini, JavaScript sisi klien aplikasi disertakan di dalam tag <script /> dan CSS-nya disertakan di dalam tag <style /> di dalamnya file HTML.

Atau, Anda dapat melihat seluruh project di GitHub.

Lihat di GitHub

Berikut ringkasan setiap filenya:

Consts.gs

Mendefinisikan konstanta yang direferensikan oleh file kode lainnya, termasuk ID project Cloud, ID lokasi Vertex AI, dan ID perintah garis miring untuk menutup insiden.

Lihat kode 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

Menangani peristiwa interaksi Chat, termasuk pesan, klik kartu, perintah garis miring, dan dialog. Merespons Perintah garis miring /closeIncident dengan membuka dialog untuk mengumpulkan insiden detail resolusi. Membaca pesan dalam ruang dengan memanggil Metode spaces.messages.list di Chat API. Mendapatkan ID pengguna menggunakan layanan Direktori Admin SDK dalam Apps Script.

Lihat kode 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

Menerima data formulir yang dimasukkan pengguna saat insiden melakukan inisialisasi pada halaman web, dan menggunakannya untuk menyiapkan Chat dengan membuat dan mengisinya, kemudian memposting pesan tentang insiden bulanan.

Lihat kode 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

Memanggil Google Docs API untuk membuat dokumen Google Dokumen dengan pengguna Google Drive dan menulis ringkasan informasi insiden, yang dibuat di VertexAiApi.gs, ke dokumen.

Lihat kode 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

Merangkum percakapan dalam Chat ruang angkasa menggunakan Vertex AI. Ringkasan ini diposting dalam folder dokumen di DocsAPI.gs.

Lihat kode 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

Melayani situs inisialisasi insiden.

Lihat kode 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

HTML yang terdiri dari situs web inisialisasi insiden.

Lihat kode 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

Menangani perilaku formulir termasuk pengiriman, kesalahan, dan membersihkan, untuk situs web inisialisasi insiden. Sudah disertakan menjadi Index.html dengan fungsi include kustom di WebController.gs.

Lihat kode 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

CSS untuk situs inisialisasi insiden. Penting disertakan ke dalam Index.html oleh fungsi include kustom di WebController.gs.

Lihat kode 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>

Menemukan nomor dan ID project Cloud

  1. Di konsol Google Cloud, buka project Cloud Anda.

    Buka konsol Google Cloud

  2. Klik Setelan dan Utilitas &gt; Setelan project.

  3. Catat nilai di kolom Project number dan Project ID. Anda menggunakannya di bagian berikut.

Membuat project Apps Script

Untuk membuat project Apps Script dan menghubungkannya dengan Project cloud:

  1. Klik tombol berikut untuk membuka project Apps Script Respond to insiden with Google Chat.
    Membuka project
  2. Klik Ringkasan.
  3. Di halaman ringkasan, klik Ikon untuk membuat salinan Buat salinan.
  4. Beri nama salinan project Apps Script:

    1. Klik Salinan Respons terhadap insiden dengan Google Chat.

    2. Di Project title, ketik Incident Management Chat app.

    3. Klik Ganti nama.

  5. Di salinan project Apps Script, buka Consts.gs dan ganti YOUR_PROJECT_ID dengan ID project Google Cloud.

Menetapkan project Cloud project Apps Script

  1. Di project Apps Script Anda, klik Ikon untuk setelan project Project Settings.
  2. Pada Google Cloud Platform (GCP) Project, klik Change project.
  3. Di GCP project number, tempel nomor project dari project Cloud Anda.
  4. Klik Set project. Project Cloud dan Apps Script sekarang terhubung.

Membuat deployment Apps Script

Setelah semua kode berada di tempatnya, deploy Apps Script proyek. Anda menggunakan ID deployment saat mengonfigurasi Aplikasi Chat di Google Cloud.

  1. Di Apps Script, buka project aplikasi respons insiden.

    Buka Apps Script

  2. Klik Deploy > Deployment baru.

  3. Jika Add-on dan Aplikasi web belum dipilih, di samping Pilih jenis, klik jenis deployment Ikon untuk setelan project, lalu pilih Add-on dan Web app.

  4. Di bagian Description, masukkan deskripsi untuk versi ini, seperti Complete version of incident management app.

  5. Di bagian Jalankan sebagai, pilih Pengguna yang mengakses aplikasi web

  6. Di bagian Siapa yang memiliki akses, pilih Siapa saja dalam organisasi Workspace Anda, dengan "organisasi Workspace Anda" adalah nama pengaturan Google Workspace Anda.

  7. Klik Deploy. Laporan Apps Script berhasil deployment dan menyediakan ID deployment dan URL untuk insiden halaman web inisialisasi Anda.

  8. Catat URL Aplikasi web yang akan dikunjungi nanti saat Anda memulai insiden. Salin ID Deployment. Anda menggunakan ID ini saat mengonfigurasi Aplikasi Chat di Konsol Google Cloud.

  9. Klik Selesai.

Mengonfigurasi aplikasi Chat di Konsol Google Cloud

Bagian ini menunjukkan cara mengonfigurasi Google Chat API di konsol Google Cloud dengan informasi tentang aplikasi Chat Anda, termasuk ID deployment yang baru saja dibuat dari Apps Script proyek.

  1. Di Konsol Google Cloud, klik Menu &gt; Produk lainnya &gt; Google Workspace &gt; Library Produk &gt; Google Chat API &gt; Kelola &gt; Konfigurasi.

    Buka konfigurasi Chat API

  2. Di App name, ketik Incident Management.

  3. Di Avatar URL, ketik https://developers.google.com/chat/images/quickstart-app-avatar.png.

  4. Pada Description, ketik Responds to incidents..

  5. Klik tombol Enable Interactive features ke posisi aktif.

  6. Di bagian Functionality, pilih Receive 1:1 messages, Join spaces and group conversations.

  7. Di bagian Connection settings, pilih Apps Script project.

  8. Di ID Deployment, tempel ID Deployment Apps Script yang sebelumnya Anda salin dari project Apps Script deployment.

  9. Daftarkan perintah garis miring yang aplikasi Chat yang diterapkan sepenuhnya menggunakan:

    1. Di bagian Perintah garis miring, klik Tambahkan perintah garis miring.

    2. Di Name, ketik /closeIncident.

    3. Pada Command ID, ketik 1.

    4. Di Description, ketik Closes the incident being discussed in the space.

    5. Pilih Opens a dialog.

    6. Klik Selesai. Perintah garis miring terdaftar dan terdaftar.

  10. Di bagian Visibility, pilih Sediakan aplikasi Chat ini untuk orang dan grup tertentu di Domain Workspace dan masukkan alamat email Anda.

  11. Di bagian Logs, pilih Log errors to Logging.

  12. Klik Simpan. Pesan konfigurasi tersimpan akan muncul, artinya aplikasi tersebut siap diuji.

Menguji aplikasi Chat

Untuk menguji aplikasi Chat manajemen insiden, mulai dari halaman web dan memverifikasi bahwa aplikasi Chat berfungsi seperti yang diharapkan:

  1. Buka URL aplikasi web deployment Apps Script.

  2. Jika Apps Script meminta izin untuk mengakses data Anda, Klik Tinjau izin, login dengan Akun Google yang sesuai di domain Google Workspace Anda, lalu klik Izinkan.

  3. Halaman web inisialisasi insiden akan terbuka. Masukkan informasi pengujian:

    1. Di bagian Incident title, ketik The First Incident.
    2. Secara opsional, di Perespons insiden, masukkan alamat email rekan perespons insiden Anda. Mereka harus pengguna dengan Akun Google Chat di organisasi Google Workspace Anda atau pembuatan ruang gagal. Jangan masukkan alamat email Anda karena disertakan secara otomatis.
    3. Di Pesan awal, ketik Testing the incident management Chat app.
  4. Klik Create Chat Space. Pesan creating space akan muncul.

  5. Setelah ruang dibuat, pesan Space created! akan muncul. Klik Buka ruang, yang akan membuka ruang Chat di tab baru.

  6. Anda dan tim tanggap darurat lainnya juga dapat mengirim pesan di spasi. Aplikasi ini merangkum pesan-pesan tersebut menggunakan Vertex AI dan membagikan dokumen retrospektif.

  7. Untuk mengakhiri respons insiden dan memulai proses resolusi, Ruang Chat, ketik /closeIncident. Manajemen insiden dialog akan terbuka.

  8. Di bagian Tutup insiden, masukkan deskripsi untuk resolusi insiden, seperti Test complete.

  9. Klik Tutup Insiden.

Aplikasi Manajemen Insiden mencantumkan pesan di ruang, merangkumnya dengan Vertex AI, menempelkan ringkasan ke dalam dokumen Google Dokumen, dokumen dalam ruang.

Pembersihan

Agar tidak menimbulkan biaya ke akun Google Cloud Anda untuk sumber daya yang digunakan dalam tutorial ini, sebaiknya Anda menghapus project Google Cloud.

  1. Di Konsol Google Cloud, buka halaman Manage resources. Klik Menu &gt; IAM & Admin &gt; Kelola Resource.

    Buka Resource Manager

  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Hapus .
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus menyelesaikan proyek tersebut.