Google 文档文档的结构

为了有效地使用 Google 文档 API,您必须了解 Google 文档文档的架构、文档元素以及它们之间的关系。本页面详细介绍了以下主题:

  • 文档元素的概念模型
  • Google 文档 API 如何表示这些元素
  • 元素的样式属性

顶级元素

Google 文档中最外层的容器元素是“文档”。该单元可保存在 Google 云端硬盘中、可与其他用户共享以及可使用文本和图片进行更新。

documents 资源的顶级元素包括 BodyHeaderFooter 和多个其他属性:

document: {
    body: ... ,
    documentStyle: ... ,
    lists: ... ,
    documentId: ... ,
    namedStyles: ... ,
    revisionId: ... ,
    title: ...
}

如需操纵 Body 内容之外的全局文档功能,使用一个或多个文档模板是最好的选择,您可以基于这些模板以编程方式生成新文档。如需了解详情,请参阅将文本合并到文档中

正文内容

Body 通常包含完整的文档内容。您可以或可能希望以编程方式使用的大多数项都是 Body 内容中的元素:

正文内容的结构。
图 1. 正文内容的结构。

结构元素

StructuralElement 描述的是为文档提供结构的内容。Body 内容是一系列 StructuralElement 对象。内容元素用于对每个 StructuralElement 对象进行个性化设置,如下图所示:

结构元素。
图 2. 结构元素。

结构元素及其内容对象包含文档中的所有视觉组件。这包括文本、内嵌图片和格式。

段落结构

Paragraph 是表示段落的 StructuralElement。它包含一系列以换行符结尾的内容。它由以下对象组成:

  • ParagraphElement:描述段落中的内容。
  • ParagraphStyle:可选元素,用于明确设置段落的样式属性。
  • Bullet:如果段落是列表的一部分,则为提供项目符号规范的可选元素。

ParagraphElement 的运作方式类似于 StructuralElement。一组内容元素类型(例如 ColumnBreakEquation)会对其自己的 ParagraphElement 进行个性化设置,如下图所示:

段落元素的结构。
图 3. 段落元素的结构。

如需查看完整文档结构的示例,请参阅 JSON 格式的文档示例。在输出中,您可以看到许多关键的结构元素和内容元素,以及开始和结束索引的使用,如下一部分所述。

文本生成

TextRun 是一个 ParagraphElement,表示具有所有相同文本样式的连续文本字符串。一个段落可以包含多个文本段,但文本段永远不会跨越段落边界。系统会在换行符后拆分内容,形成单独的文本运行。例如,假设某个小型文档如下所示:

包含段落和项目符号列表的小文档。
图 4. 小型文档。

下图展示了如何直观呈现上述文档中段落序列,每个段落都有自己的 TextRun 和可选的 Bullet 设置。

文本运行的结构。
图 5. 文本运行的结构。

AutoText

AutoText 是一个 ParagraphElement,表示文本中的一个位置,该位置被动态替换为可以随时间变化的内容。在文档中,这用于页码。

起始索引和结束索引

更新文档内容时,每次更新都发生在文档中的某个位置或某个范围内。这些位置和范围使用索引指定,索引表示包含文档细分中的偏移量。段是包含结构或内容元素的正文、页眉、页脚或脚注。段中元素的索引是相对于该段开头的索引。

正文内容中的大多数元素都具有从零开始的 startIndexendIndex 属性。它们表示元素相对于其所属片段起始位置的偏移量。如需详细了解如何对 Google 文档批量调用进行排序,请参阅批量更新

索引以 UTF-16 代码单元衡量。这意味着代理对会使用两个索引。例如,“GRINNING FACE”表情符号 😄? 表示为 \uD83D\uDE00,它会使用两个索引。

对于文档正文中的元素,索引表示从正文内容开头(即“根”元素)的偏移量。

结构元素的“个性化”类型(SectionBreakTableOfContentsTableParagraph)没有这些索引,因为它们所属的 StructuralElement 包含这些字段。ParagraphElement 中包含的个性化类型(例如 TextRunAutoTextPageBreak)也是如此。

访问元素

许多元素都可以使用 documents.batchUpdate 方法进行修改。例如,使用 InsertTextRequest,您可以更改任何包含文本的元素的内容。同样,您可以使用 UpdateTextStyleRequest 将格式应用于一个或多个元素中包含的文本范围。

如需读取文档的元素,请使用 documents.get 方法获取完整文档的 JSON 转储。然后,您可以解析生成的 JSON 以查找各个元素的值。如需了解详情,请参阅以 JSON 格式输出文档内容

解析内容对各种用例都大有裨益。例如,假设有一个文档编目应用,其中列出了它找到的文档。此应用可以提取文档的标题、修订版本 ID 和起始页码,如下图所示:

文档目录的结构。
图 6. 文档目录的结构。

由于没有明确读取这些设置的方法,因此您的应用需要获取整个文档,然后解析 JSON 以提取这些值。

继承自媒体资源的权限

StructuralElement 可以从其父对象继承属性。对象的属性(包括其定义的属性和继承的属性)决定了它的最终视觉外观。

文本字符格式决定了文本在文档中的显示方式,例如粗体、斜体和下划线。您应用的格式会替换从基础段落的 TextStyle 继承的默认格式。相反,任何未设置格式的字符都会继续沿用段落的样式。

段落格式设置决定了文本块在文档中的呈现方式,例如对齐、边框和缩进。您应用的格式会替换从底层 ParagraphStyle 继承的默认格式。相反,您未设置的任何格式设置功能都会继续沿用段落样式。