使用智能条状标签预览 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 项目中启用它们。您可以在单个 Google Cloud 项目中启用一个或多个 API。

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

    启用 API

此插件需要具有已配置同意屏幕的 Cloud 项目。配置 OAuth 同意屏幕可定义 Google 向用户显示的内容并注册您的应用,以便您稍后发布应用。

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

    转到 OAuth 同意屏幕

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

  5. 查看您的应用注册摘要。如要进行更改,请点击修改。如果应用注册看起来正常,请点击 Back to Dashboard

获取 Google Books API 的 API 密钥

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

    进入“凭据”页面

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

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

设置脚本

创建 Apps 脚本项目

  1. 点击以下按钮,打开预览 Google 图书中的链接 Apps 脚本项目。
    打开项目
  2. 点击 Overview
  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 脚本项目中,点击 编辑器
  2. 打开 Code.gs 文件,然后点击 Run。出现提示时,授权脚本。
  3. 点击部署 > 测试部署
  4. 依次点击安装 > 完成
  1. docs.new 上创建一个 Google 文档文档。
  2. 将以下网址粘贴到该文档中,然后按 Tab 键以将该网址转换为智能条状标签:https://www.google.com/books/edition/Software_Engineering_at_Google/V3TTDwAAQBAJ
  3. 将指针悬停在智能条状标签上,并在出现提示时授予执行插件的访问权限。预览卡片会显示图书的相关信息。

下图显示了链接预览:

《Google 软件工程》这本书的链接预览。

查看代码

如需查看此插件的 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();
  }
}

后续步骤