Xử lý sự cố bằng Google Chat, Vertex AI và Apps Script

Hướng dẫn này trình bày cách tạo một ứng dụng Google Chat ứng phó sự cố theo thời gian thực. Khi phản hồi một sự cố, ứng dụng tạo và điền sẵn phòng Chat, hỗ trợ sự cố độ phân giải bằng thông báo, lệnh dấu gạch chéo và hộp thoại, cũng như sử dụng AI để tóm tắt phản hồi sự cố bằng tài liệu trên Google Tài liệu.

Sự cố là sự kiện cần có sự chú ý của một nhóm ngay lập tức người cần giải quyết. Sau đây là một số ví dụ về các sự cố:

  • Trường hợp có giới hạn thời gian được tạo trong Quản lý quan hệ khách hàng (CRM) nền tảng này yêu cầu nhóm dịch vụ cộng tác để tìm ra giải pháp.
  • Một hệ thống chuyển sang chế độ ngoại tuyến, cảnh báo cho một nhóm kỹ sư quản lý độ tin cậy của trang web (SRE) để họ có thể cùng nhau đưa sản phẩm trở lại trực tuyến.
  • Trận động đất cường độ cao xảy ra và nhân viên khẩn cấp cần được cấp cứu để điều phối ứng phó.

Theo mục đích của hướng dẫn này, cảnh báo sự cố bắt đầu khi ai đó báo cáo sự cố bằng cách nhấp vào nút trên một trang web. Trang web này mô phỏng sự cố bằng cách yêu cầu người dùng nhập thông tin cơ bản về sự cố: tiêu đề, nội dung mô tả và địa chỉ email của người trả lời.

Xem cách hoạt động của ứng dụng Chat quản lý sự cố trong thực tế:

  • Trang web bắt đầu sự cố.
    Hình 1. Trang web nơi người dùng có thể báo cáo sự cố.
  • Thông báo cho biết phòng Chat sự cố đã được tạo.
    Hình 2. Thông báo cho biết phòng Chat sự cố đã được tạo.
  • Phòng Chat ứng phó sự cố.
    Hình 3. Phòng Chat ứng phó sự cố.
  • Giải quyết sự cố bằng lệnh dấu gạch chéo.
    Hình 4. Giải quyết sự cố bằng lệnh dấu gạch chéo.
  • Hộp thoại giải quyết sự cố.
    Hình 5. Hộp thoại giải quyết sự cố.
  • Tài liệu trên Google Tài liệu về giải quyết sự cố được chia sẻ trong không gian.
    Hình 6. Tài liệu trên Google Tài liệu về giải quyết sự cố được chia sẻ trong không gian.
  • Giải pháp tóm tắt sự cố bằng AI trên Google Tài liệu.
    Hình 7. Tài liệu trên Google Tài liệu về phương thức giải quyết tóm tắt sự cố dựa trên AI.

Điều kiện tiên quyết

Nếu bạn cần bật bất kỳ điều kiện tiên quyết nào sau đây cho tổ chức của mình, hãy hỏi quản trị viên Google Workspace của bạn để bật các tính năng này:

  • Doanh nghiệp Tài khoản Google Workspace có quyền truy cập vào Google Chat.
  • Để có Thư mục (chia sẻ thông tin liên hệ) đã được bật cho Google Workspace. Ứng dụng sự cố sử dụng danh bạ để tra cứu thông tin về nhân viên ứng cứu sự cố thông tin liên hệ, chẳng hạn như tên và địa chỉ email. Nhân viên ứng cứu sự cố phải là người dùng có Google Chat trong tổ chức Google Workspace.

Mục tiêu

  • Xây dựng một ứng dụng trong Chat có khả năng phản hồi các sự cố.
  • Giúp người dùng ứng phó với sự cố bằng cách làm những việc sau:
    • Tạo không gian ứng phó sự cố.
    • Đăng thông báo tóm tắt sự cố và phản hồi.
    • Hỗ trợ hoạt động cộng tác bằng công nghệ tương tác Các tính năng của ứng dụng Chat.
  • Dùng Vertex AI để tóm tắt các cuộc trò chuyện và giải pháp.

Kiến trúc

Sơ đồ dưới đây thể hiện cấu trúc của Google Workspace và Tài nguyên của Google Cloud mà quy trình ứng phó sự cố sử dụng Ứng dụng Google Chat.

Cấu trúc của ứng dụng Google Chat phản hồi sự cố

Cấu trúc cho thấy cách ứng phó sự cố Ứng dụng Google Chat xử lý sự cố và giải quyết sự cố.

  1. Người dùng bắt đầu sự cố từ trang web bên ngoài được lưu trữ trên Apps Script.

  2. Trang web này sẽ gửi yêu cầu HTTP không đồng bộ đến Ứng dụng Google Chat, cũng được lưu trữ trên Apps Script.

  3. Ứng dụng Google Chat phản hồi sự cố sẽ xử lý yêu cầu:

    1. Dịch vụ SDK dành cho quản trị viên Apps Script nhận thành viên nhóm như mã nhận dạng người dùng và địa chỉ email.

    2. Với một nhóm các yêu cầu HTTP gửi tới API Chat sử dụng Dịch vụ Trò chuyện nâng cao của Apps Script, ứng phó sự cố Ứng dụng Google Chat tạo ra một sự cố trong Chat không gian, điền sẵn thành viên trong nhóm rồi gửi tin nhắn đến không gian.

  4. Các thành viên trong nhóm thảo luận về sự việc trong phòng Chat.

  5. Một thành viên trong nhóm gọi lệnh dấu gạch chéo để báo hiệu giải pháp cho sự cố.

    1. Lệnh gọi HTTP đến Chat API bằng Apps Script Dịch vụ Trò chuyện nâng cao liệt kê tất cả các Trò chuyện tin nhắn của không gian.

    2. Vertex AI nhận các tin nhắn có trong danh sách và tạo bản tóm tắt.

    3. Dịch vụ Apps Script DocumentApp tạo một trong Google Tài liệu và thêm bản tóm tắt của Vertex AI vào tài liệu.

    4. Cuộc gọi của ứng dụng Google Chat để ứng phó sự cố API Chat để gửi tin nhắn bằng cách chia sẻ đường liên kết đến bản tóm tắt Tài liệu.

Chuẩn bị môi trường

Phần này trình bày cách tạo và định cấu hình dự án Google Cloud cho Ứng dụng Chat.

Tạo một dự án trên Google Cloud

bảng điều khiển Google Cloud

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến Trình đơn > IAM và Quản trị > Tạo dự án.

    Chuyển đến trang Create a Project (Tạo dự án)

  2. Trong trường Tên dự án, hãy nhập tên mô tả cho dự án của bạn.

    Không bắt buộc: Để chỉnh sửa Mã dự án, hãy nhấp vào Chỉnh sửa. Không thể thay đổi mã dự án sau khi tạo dự án, vì vậy, hãy chọn một mã đáp ứng nhu cầu của bạn trong suốt thời gian dự án.

  3. Trong trường Vị trí, hãy nhấp vào Duyệt qua để hiển thị các vị trí tiềm năng cho dự án. Sau đó nhấp vào Chọn.
  4. Nhấp vào Tạo. Bảng điều khiển Google Cloud sẽ chuyển đến trang Trang tổng quan và dự án của bạn sẽ được tạo trong vòng vài phút.

Giao diện dòng lệnh (CLI) của gcloud

Truy cập vào Google Cloud ở một trong các môi trường phát triển sau đây CLI (`gcloud`):

  • Cloud Shell: Để sử dụng thiết bị đầu cuối trực tuyến với gcloud CLI đã thiết lập, hãy kích hoạt Cloud Shell.
    Kích hoạt Cloud Shell
  • Local Shell: Để sử dụng môi trường phát triển cục bộ, cài đặtkhởi động giao diện dòng lệnh (CLI) của gcloud.
    Để tạo một dự án trên đám mây, hãy dùng lệnh "gcloud Projects create":
    gcloud projects create PROJECT_ID
    Thay thế PROJECT_ID bằng cách đặt mã nhận dạng cho dự án mà bạn muốn tạo.

Bật tính năng thanh toán cho dự án trên Google Cloud

bảng điều khiển Google Cloud

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến phần Thanh toán. Nhấp chuột Thực đơn > Thanh toán > Dự án của tôi.

    Chuyển đến phần Thanh toán cho dự án của tôi

  2. Trong phần Chọn tổ chức, hãy chọn tổ chức được liên kết với dự án Google Cloud của bạn.
  3. Trong hàng dự án, hãy mở trình đơn Hành động (), hãy nhấp vào Thay đổi thông tin thanh toán rồi chọn Tài khoản thanh toán Cloud.
  4. Nhấp vào Đặt tài khoản.

Giao diện dòng lệnh (CLI) của gcloud

  1. Để liệt kê các tài khoản thanh toán hiện có, hãy chạy:
    gcloud billing accounts list
  2. Liên kết tài khoản thanh toán với một dự án trên Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Thay thế đoạn mã sau:

    • PROJECT_IDMã dự án của Dự án trên đám mây mà bạn muốn bật tính năng thanh toán.
    • BILLING_ACCOUNT_IDmã tài khoản thanh toán để liên kết dự án Google Cloud.

Bật các API

bảng điều khiển Google Cloud

  1. Trong bảng điều khiển Google Cloud, hãy bật API Google Chat, API Google Tài liệu API SDK dành cho quản trị viên và Vertex AI API.

    Bật API

  2. Xác nhận rằng bạn đang bật các API theo đúng cách Dự án trên đám mây, rồi nhấp vào Tiếp theo.

  3. Xác nhận rằng bạn đang bật đúng API, sau đó nhấp vào Bật.

Giao diện dòng lệnh (CLI) của gcloud

  1. Nếu cần, hãy đặt dự án hiện tại trên Google Cloud thành dự án mà bạn đã tạo bằng lệnh gcloud config set project:

    gcloud config set project PROJECT_ID
    

    Thay thế PROJECT_ID bằng Mã dự án của Dự án trên đám mây mà bạn đã tạo.

  2. Bật API Google Chat, API Google Tài liệu, API SDK dành cho quản trị viên và Vertex AI API bằng lệnh gcloud services enable:

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

Thiết lập tính năng xác thực và uỷ quyền

Xác thực và uỷ quyền cho phép Các tài nguyên truy cập vào ứng dụng Chat trong Google Workspace và Google Cloud để xử lý phản hồi khi có sự cố.

Trong hướng dẫn này, bạn xuất bản ứng dụng trong nội bộ nên có thể sử dụng phần giữ chỗ của bạn. Trước khi phát hành ứng dụng ra bên ngoài, hãy thay thế phần giữ chỗ có thông tin thực cho màn hình xin phép.

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến Thực đơn > API và Dịch vụ > Màn hình xin phép bằng OAuth.

    Chuyển đến màn hình xin phép bằng OAuth

  2. Trong mục Loại người dùng, hãy chọn Nội bộ, rồi nhấp vào Tạo.

  3. Trong Tên ứng dụng, hãy nhập Incident Management.

  4. Trong Email hỗ trợ người dùng, hãy chọn địa chỉ email của bạn hoặc một nhóm trên Google Groups.

  5. Trong phần Thông tin liên hệ của nhà phát triển, hãy nhập địa chỉ email của bạn.

  6. Nhấp vào Lưu và tiếp tục.

  7. Nhấp vào Add or Remove Scopes (Thêm hoặc xoá phạm vi). Một bảng điều khiển sẽ xuất hiện với danh sách phạm vi cho từng API mà bạn đã bật trong dự án Cloud của mình.

  8. Trong phần Thêm phạm vi theo cách thủ công, hãy dán các phạm vi sau:

    • 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. Nhấp vào Thêm vào bảng.

  10. Nhấp vào Cập nhật.

  11. Nhấp vào Lưu và tiếp tục.

  12. Xem lại thông tin tóm tắt về quá trình đăng ký ứng dụng, sau đó nhấp vào Quay lại trang tổng quan.

Tạo và triển khai ứng dụng Chat

Trong phần sau, bạn sao chép và cập nhật toàn bộ Dự án Apps Script chứa tất cả ứng dụng cần thiết mã cho ứng dụng Chat, nên bạn không cần sao chép và hãy dán từng tệp.

Một số hàm có chứa dấu gạch dưới ở cuối tên, chẳng hạn như processSlashCommand_() từ ChatApp.gs. Dấu gạch dưới ẩn hàm từ trang web khởi tạo sự cố khi trang web mở trong trình duyệt. Để biết thêm thông tin, xem Hàm riêng tư.

Apps Script hỗ trợ hai loại tệp là .gs tập lệnh và .html tệp. Để tuân thủ sự hỗ trợ này, JavaScript phía máy khách của ứng dụng sẽ được đưa vào bên trong thẻ <script /> và CSS của thẻ đó được bao gồm bên trong các thẻ <style /> bên trong tệp HTML.

Bạn có thể xem toàn bộ dự án trên GitHub (không bắt buộc).

Xem trên GitHub

Dưới đây là tổng quan về từng tệp:

Consts.gs

Xác định các hằng số được tham chiếu bởi các tệp mã khác, bao gồm mã dự án trên Cloud, mã vị trí Vertex AI và dấu gạch chéo mã nhận dạng lệnh để đóng sự cố.

Xem mã 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

Xử lý các sự kiện tương tác trong Chat, bao gồm thông báo, lượt nhấp vào thẻ, lệnh dấu gạch chéo và hộp thoại. Phản hồi Lệnh gạch chéo /closeIncident bằng cách mở một hộp thoại để thu thập sự cố chi tiết về giải pháp. Đọc tin nhắn trong không gian bằng cách gọi Phương thức spaces.messages.list trong API Chat. Lấy mã nhận dạng người dùng bằng cách sử dụng dịch vụ Thư mục SDK quản trị trong Apps Script.

Xem mã 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

Nhận dữ liệu từ biểu mẫu mà người dùng nhập về sự cố trang web khởi chạy và sử dụng trang web này để thiết lập một Chat bằng cách tạo và điền sẵn không gian, sau đó đăng thông báo về sự cố.

Xem mã 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

Gọi API Google Tài liệu để tạo tài liệu trên Google Tài liệu trong một Google Drive của người dùng và viết bản tóm tắt thông tin sự cố, được tạo trong VertexAiApi.gs vào tài liệu.

Xem mã 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

Tóm tắt cuộc trò chuyện trong ứng dụng Chat bằng Vertex AI. Bản tóm tắt này được đăng trong một phiên bản đặc biệt tài liệu trong DocsAPI.gs.

Xem mã 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

Cung cấp trang web xử lý sự cố.

Xem mã 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 tạo nên trang web về khởi tạo sự cố.

Xem mã 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

Xử lý hành vi biểu mẫu bao gồm gửi, lỗi và xoá cho trang web về khởi tạo sự cố. Bao gồm vào Index.html bằng hàm include tuỳ chỉnh trong WebController.gs.

Xem mã 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

Dịch vụ so sánh giá (CSS) cho trang web hỗ trợ khắc phục sự cố. Bây giờ được đưa vào Index.html bởi hàm include tuỳ chỉnh trong WebController.gs.

Xem mã 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>

Tìm mã và số dự án Cloud của bạn

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến dự án của bạn trên Cloud.

    Truy cập vào bảng điều khiển Google Cloud

  2. Nhấp vào Cài đặt và tiện ích &gt; Cài đặt dự án.

  3. Lưu ý các giá trị trong các trường Project number (Số dự án) và Project ID (Mã dự án). Bạn sử dụng chúng trong các phần sau.

Tạo dự án Apps Script

Để tạo một dự án Apps Script và kết nối dự án đó với Dự án trên đám mây:

  1. Nhấp vào nút sau để mở dự án Apps Script Ứng phó với sự cố với Google Chat.
    Mở dự án
  2. Nhấp vào Tổng quan.
  3. Trên trang tổng quan, hãy nhấp vào Biểu tượng để tạo bản sao Tạo bản sao.
  4. Đặt tên cho bản sao dự án Apps Script:

    1. Nhấp vào Bản sao nội dung Phản hồi sự cố với Google Chat.

    2. Trong Tên dự án, hãy nhập Incident Management Chat app.

    3. Nhấp vào Đổi tên.

  5. Trong bản sao dự án Apps Script, hãy chuyển đến Consts.gs và thay thế YOUR_PROJECT_ID bằng mã nhận dạng của Dự án trên đám mây.

Đặt dự án trên đám mây của dự án Apps Script

  1. Trong dự án Apps Script, nhấp vào Biểu tượng cho phần cài đặt dự án Cài đặt dự án.
  2. Trong mục Dự án Google Cloud Platform (GCP), hãy nhấp vào Thay đổi dự án.
  3. Trong mục Số dự án GCP, hãy dán số dự án của dự án trên Google Cloud.
  4. Nhấp vào Đặt dự án. Dự án Cloud và Apps Script dự án hiện đã được kết nối.

Tạo quy trình triển khai Apps Script

Giờ đây, toàn bộ mã đã sẵn sàng, hãy triển khai Apps Script dự án. Bạn sử dụng mã triển khai khi định cấu hình Ứng dụng Chat trong Google Cloud.

  1. Trong Apps Script, hãy mở dự án của ứng dụng phản hồi sự cố.

    Truy cập Apps Script

  2. Nhấp vào Triển khai > Quá trình triển khai mới.

  3. Nếu bạn chưa chọn Tiện ích bổ sungỨng dụng web, bên cạnh Chọn loại, nhấp vào loại triển khai Biểu tượng cho phần cài đặt dự án rồi chọn Tiện ích bổ sungỨng dụng web.

  4. Trong phần Mô tả, hãy nhập nội dung mô tả cho phiên bản này, chẳng hạn như Complete version of incident management app.

  5. Trong mục Thực thi dưới dạng, hãy chọn Người dùng truy cập vào ứng dụng web

  6. Trong phần Người có quyền truy cập, hãy chọn Mọi người trong tổ chức Workspace của bạn, trong đó "tổ chức Workspace của bạn" là tên của Tổ chức Google Workspace.

  7. Nhấp vào Triển khai. Đã báo cáo thành công Apps Script triển khai và cung cấp mã triển khai cũng như URL của sự cố trang web khởi chạy.

  8. Ghi lại URL Ứng dụng web để truy cập sau khi bạn bắt đầu sự cố. Sao chép Mã triển khai. Bạn sử dụng mã nhận dạng này khi định cấu hình Ứng dụng Chat trong bảng điều khiển Google Cloud.

  9. Nhấp vào Xong.

Định cấu hình ứng dụng Chat trong bảng điều khiển Google Cloud

Phần này trình bày cách định cấu hình API Google Chat trong bảng điều khiển Google Cloud kèm theo thông tin về ứng dụng Chat của bạn, bao gồm Mã của phiên bản triển khai mà bạn vừa tạo từ Apps Script dự án.

  1. Trong bảng điều khiển Google Cloud, hãy nhấp vào Trình đơn &gt; Sản phẩm khác &gt; Google Workspace &gt; Thư viện sản phẩm &gt; API Google Chat &gt; Quản lý &gt; Cấu hình.

    Chuyển đến phần cấu hình API Chat

  2. Trong Tên ứng dụng, hãy nhập Incident Management.

  3. Trong URL hình đại diện, hãy nhập https://developers.google.com/chat/images/quickstart-app-avatar.png.

  4. Trong Description (Nội dung mô tả), hãy nhập Responds to incidents..

  5. Nhấp vào nút bật/tắt Bật tính năng tương tác để chuyển sang vị trí bật.

  6. Trong phần Chức năng, hãy chọn Nhận tin nhắn 1:1, Tham gia không gian và cuộc trò chuyện nhóm.

  7. Trong phần Connection settings (Cài đặt kết nối), hãy chọn Apps Script project.

  8. Trong mục Deployment ID (Mã triển khai), hãy dán ID triển khai Apps Script mà bạn đã sao chép trước đó từ dự án Apps Script triển khai.

  9. Đăng ký một lệnh dấu gạch chéo mà Ứng dụng Chat được triển khai đầy đủ sẽ sử dụng:

    1. Trong phần Lệnhlash, hãy nhấp vào Thêm lệnh dấu gạch chéo.

    2. Trong Name (Tên), hãy nhập /closeIncident.

    3. Trong Command ID, nhập 1.

    4. Trong phần Mô tả, hãy nhập Closes the incident being discussed in the space.

    5. Chọn Mở hộp thoại.

    6. Nhấp vào Xong. Lệnh dấu gạch chéo đã được đăng ký và liệt kê.

  10. Trong phần Chế độ hiển thị, hãy chọn Cung cấp ứng dụng Chat này cho những người và nhóm cụ thể trong Workspace rồi nhập địa chỉ email của bạn.

  11. Trong Logs (Nhật ký), hãy chọn Log lỗi to Logging (Ghi nhật ký vào nhật ký).

  12. Nhấp vào Lưu. Thông báo cấu hình đã lưu sẽ xuất hiện, tức là ứng dụng đã sẵn sàng để thử nghiệm.

Kiểm thử ứng dụng Chat

Để kiểm thử ứng dụng Chat quản lý sự cố, hãy bắt đầu một sự cố từ trang web và xác minh rằng ứng dụng Chat hoạt động như mong đợi:

  1. Truy cập vào URL ứng dụng web triển khai Apps Script.

  2. Khi Apps Script yêu cầu quyền truy cập vào dữ liệu của bạn, nhấp vào Xem xét quyền, đăng nhập bằng một Tài khoản Google thích hợp trong miền Google Workspace của bạn, rồi nhấp vào Cho phép.

  3. Trang web về khởi tạo sự cố sẽ mở ra. Nhập thông tin thử nghiệm:

    1. Trong Tiêu đề sự cố, hãy nhập The First Incident.
    2. Trong phần Phản hồi sự cố, (không bắt buộc) có thể nhập địa chỉ email của những người khác cùng ứng phó sự cố. Họ phải là người dùng có Tài khoản Google Chat trong tổ chức Google Workspace của bạn hoặc không tạo được không gian. Đừng nhập địa chỉ email của chính bạn vì được thêm tự động.
    3. Trong Tin nhắn ban đầu, nhập Testing the incident management Chat app.
  4. Nhấp vào Tạo phòng Chat. Một thông báo creating space sẽ xuất hiện.

  5. Sau khi tạo không gian, thông báo Space created! sẽ xuất hiện. Nhấp chuột Mở không gian: Thao tác này sẽ mở không gian trong Chat trong một thẻ mới.

  6. Nếu muốn, bạn và những người ứng cứu sự cố khác có thể gửi tin nhắn trong . Ứng dụng tóm tắt các thông điệp này bằng Vertex AI và chia sẻ tài liệu hồi tố.

  7. Để kết thúc quá trình ứng phó sự cố và bắt đầu quá trình giải quyết, trong Phòng Chat, nhập /closeIncident. Quản lý sự cố sẽ mở ra.

  8. Trong mục Đóng sự cố, hãy nhập nội dung mô tả giải pháp cho sự cố, như Test complete.

  9. Nhấp vào Đóng sự cố.

Ứng dụng Quản lý sự cố liệt kê các tin nhắn trong không gian, tóm tắt các tin nhắn đó với Vertex AI, dán bản tóm tắt vào một tài liệu trên Google Tài liệu và chia sẻ tài liệu trong không gian.

Dọn dẹp

Để tránh phát sinh phí đối với tài khoản Google Cloud của bạn cho tài nguyên được sử dụng trong hướng dẫn này, chúng tôi khuyên bạn nên xóa Dự án trên đám mây.

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Quản lý tài nguyên. Nhấp chuột Thực đơn &gt; IAM và Quản trị viên &gt; Quản lý tài nguyên.

    Chuyển đến Trình quản lý tài nguyên

  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá rồi nhấp vào Xoá .
  3. Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.