使用智能条状标签预览 Google 图书中的链接

编码级别:中级
时长:30 分钟
项目类型:Google Workspace 插件

目标

  • 了解该插件的用途。
  • 了解如何使用 Apps 脚本构建插件,以及 Apps 脚本服务的用途。
  • 设置环境。
  • 设置脚本。
  • 运行脚本。

关于此 Google Workspace 插件

在此示例中,您将创建一个 Google Workspace 插件,用于预览 Google 文档文档中来自 Google 图书的链接。当您将 Google 图书网址输入或粘贴到文档中时,插件会识别该链接并触发链接预览。如需预览链接,您可以将链接转换为智能条状标签,然后将指针悬停在链接上,以查看显示图书详情的卡片。

此插件使用 Apps 脚本的 UrlFetch 服务连接到 Google Books API 并获取 Google 图书的相关信息,以显示在 Google 文档中。

运作方式

在 Google Workspace 插件的清单文件中,脚本将插件配置为扩展 Google 文档,并为与 Google 图书网站 (https://books.google.com) 中的特定格式匹配的网址触发链接预览。

在代码文件中,脚本会连接到 Google Books API 并使用该网址获取图书的相关信息(Volume 资源的一个实例)。该脚本使用这些信息生成显示图书书名的智能条状标签和显示摘要、页数、图书封面图片和评分数量的预览卡片。

Apps 脚本服务

此插件使用以下服务:

前提条件

如需使用此示例,您需要满足以下前提条件:

设置您的环境

以下部分将设置用于构建插件的环境。

在 Google Cloud 控制台中打开您的 Cloud 项目

如果尚未打开,请打开要用于此示例的 Cloud 项目:

  1. 在 Google Cloud 控制台中,前往选择项目页面。

    选择 Cloud 项目

  2. 选择您要使用的 Google Cloud 项目。或者,点击创建项目,然后按照屏幕上的说明操作。如果您创建的是 Google Cloud 项目,则可能需要为项目启用结算功能

启用 Google Books API

此插件会连接到 Google Books API。 在使用 Google API 之前,您需要先在 Google Cloud 项目中启用这些 API。您可以在单个 Google Cloud 项目中启用一个或多个 API。

  • 在您的 Cloud 项目中,启用 Books API。

    启用 API

此插件需要使用已配置同意屏幕的 Cloud 项目。配置 OAuth 权限请求页面可定义 Google 向用户显示的内容以及注册您的应用,以便您日后发布该应用。

  1. 在 Google Cloud 控制台中,依次点击“菜单”图标 > API 和服务 > OAuth 同意屏幕

    转到 OAuth 同意屏幕

  2. 对于用户类型,选择内部,然后点击创建
  3. 填写应用注册表单,然后点击保存并继续
  4. 现在,您可以跳过添加范围的步骤,然后点击保存并继续。 将来,当您创建要在 Google Workspace 组织外部使用的应用时,必须将用户类型更改为外部,然后添加应用所需的授权范围。

  5. 查看您的应用注册摘要。如要进行更改,请点击修改。如果应用注册看起来没有问题,请点击返回信息中心

获取 Google Books API 的 API 密钥

  1. 前往 Google Cloud 控制台。 确保您的启用了结算功能的项目已打开。
  2. 在 Google Cloud 控制台中,依次点击“菜单”图标 > API 和服务 > 凭据

    进入“凭据”页面

  3. 依次点击创建凭据 > API 密钥

  4. 记下您的 API 密钥,以便在后续步骤中使用。

设置脚本

以下部分将设置用于构建该插件的脚本。

创建 Apps 脚本项目

  1. 点击以下按钮,打开 Preview links from Google Books Apps Script 项目。
    打开项目
  2. 点击 概览
  3. 在概览页面上,点击 用于制作副本的图标 复制
  4. 在 Apps 脚本项目的副本中,找到 Code.gs 文件,并将 YOUR_API_KEY 替换为您在上一部分生成的 API 密钥。

复制 Cloud 项目编号

  1. 在 Google Cloud 控制台中,依次点击“菜单”图标 > IAM 和管理 > 设置

    转到“IAM 和管理”设置

  2. 复制项目编号字段中的值。

设置 Apps 脚本项目的 Cloud 项目

  1. 在 Apps 脚本项目中,点击 项目设置的图标 项目设置
  2. Google Cloud Platform (GCP) 项目下,点击更改项目
  3. GCP 项目编号中,粘贴 Google Cloud 项目编号。
  4. 点击设置项目

测试插件

以下几个部分将测试您创建的插件。

安装测试部署

  1. 在您的 Apps 脚本项目中,点击 Editor
  2. YOUR_API_KEY 替换为在上一部分中创建的 Google Books API 的 API 密钥。
  3. 点击部署 > 测试部署
  4. 依次点击安装 > 完成
  1. 前往 docs.new 创建一个 Google 文档。
  2. 将以下网址粘贴到文档中,然后按 Tab 键将网址转换为智能条状标签: https://www.google.com/books/edition/Software_Engineering_at_Google/V3TTDwAAQBAJ
  3. 将指针悬停在智能条状标签上,并在出现提示时授予访问权限以执行插件。预览卡片会显示图书的相关信息。

以下图片显示了链接预览:

图书《软件工程》一书的链接预览。

查看代码

如需查看此插件的 Apps 脚本代码,请点击查看源代码,以展开相应部分:

查看源代码

appsscript.json

solutions/add-on/book-smartchip/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/workspace.linkpreview",
    "https://www.googleapis.com/auth/script.external_request"
  ],
  "urlFetchWhitelist": [
    "https://www.googleapis.com/books/v1/volumes/"
  ],
  "addOns": {
    "common": {
      "name": "Preview Books Add-on",
      "logoUrl": "https://developers.google.com/workspace/add-ons/images/library-icon.png",
      "layoutProperties": {
        "primaryColor": "#dd4b39"
      }
    },
    "docs": {
      "linkPreviewTriggers": [
        {
          "runFunction": "bookLinkPreview",
          "patterns": [
            {
              "hostPattern": "*.google.*",
              "pathPrefix": "books"
            },
            {
              "hostPattern": "*.google.*",
              "pathPrefix": "books/edition"
            }
          ],
          "labelText": "Book",
          "logoUrl": "https://developers.google.com/workspace/add-ons/images/book-icon.png",
          "localizedLabelText": {
            "es": "Libros"
          }
        }
      ]
    }
  }
}

Code.gs

solutions/add-on/book-smartchip/Code.js
function getBook(id) {
  const apiKey = 'YOUR_API_KEY'; // Replace with your API key
  const apiEndpoint = `https://www.googleapis.com/books/v1/volumes/${id}?key=${apiKey}&country=US`;
  const response = UrlFetchApp.fetch(apiEndpoint);
  return JSON.parse(response);
}

function bookLinkPreview(event) {
 if (event.docs.matchedUrl.url) {
    const segments = event.docs.matchedUrl.url.split('/');
    const volumeID = segments[segments.length - 1];

    const bookData = getBook(volumeID);
    const bookTitle = bookData.volumeInfo.title;
    const bookDescription = bookData.volumeInfo.description;
    const bookImage = bookData.volumeInfo.imageLinks.small;
    const bookAuthors = bookData.volumeInfo.authors;
    const bookPageCount = bookData.volumeInfo.pageCount;

    const previewHeader = CardService.newCardHeader()
      .setSubtitle('By ' + bookAuthors)
      .setTitle(bookTitle);

    const previewPages = CardService.newDecoratedText()
      .setTopLabel('Page count')
      .setText(bookPageCount);

    const previewDescription = CardService.newDecoratedText()
      .setTopLabel('About this book')
      .setText(bookDescription).setWrapText(true);

    const previewImage = CardService.newImage()
      .setAltText('Image of book cover')
      .setImageUrl(bookImage);

    const buttonBook = CardService.newTextButton()
      .setText('View book')
      .setOpenLink(CardService.newOpenLink()
        .setUrl(event.docs.matchedUrl.url));

    const cardSectionBook = CardService.newCardSection()
      .addWidget(previewImage)
      .addWidget(previewPages)
      .addWidget(CardService.newDivider())
      .addWidget(previewDescription)
      .addWidget(buttonBook);

    return CardService.newCardBuilder()
    .setHeader(previewHeader)
    .addSection(cardSectionBook)
    .build();
  }
}