Google ドキュメント ドキュメントの構造

Google Docs API を効果的に使用するには、Google ドキュメント アーキテクチャ、ドキュメントを構成する要素、それらの関係を理解する必要があります。このページでは、次のトピックについて詳しく説明します。

  • ドキュメント要素の概念モデル
  • Docs API によるこれらの要素の表現方法
  • 要素のスタイル設定プロパティ

トップレベル要素

Google ドキュメントで一番外側のコンテナ要素はドキュメントです。これは、Google ドライブに保存したり、他のユーザーと共有したり、テキストや画像で更新したりできる単位です。

documents リソースの最上位要素には、BodyHeaderFooter をはじめとする複数の属性があります。

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

Body コンテンツの外部でグローバル ドキュメント機能を操作する場合は、ほとんどの場合、1 つ以上のドキュメント テンプレートを使用することをおすすめします。テンプレートは、新しいドキュメントをプログラムで生成する際のベースとして使用できます。詳しくは、テキストをドキュメントにマージするをご覧ください。

本文のコンテンツ

通常、Body にはドキュメントの全コンテンツが含まれます。プログラムで使用可能または使用する可能性が高いアイテムのほとんどは、Body コンテンツ内の要素です。

本文コンテンツの構造。
図 1. 本文コンテンツの構造。

構造要素

StructuralElement は、ドキュメントに構造を提供するコンテンツを記述します。Body コンテンツは、StructuralElement オブジェクトのシーケンスです。次の図に示すように、コンテンツ要素は各 StructuralElement オブジェクトをパーソナライズします。

構造要素。
図 2. 構造要素。

構造要素とそのコンテンツ オブジェクトには、ドキュメント内のすべての視覚コンポーネントが含まれます。これには、テキスト、インライン画像、書式設定が含まれます。

段落の構造

Paragraph は、段落を表す StructuralElement です。改行文字で終わる一連のコンテンツが含まれます次のオブジェクトで構成されます。

  • ParagraphElement: 段落内のコンテンツを記述します。
  • ParagraphStyle: 段落のスタイル プロパティを明示的に設定する省略可能な要素です。
  • Bullet: 段落がリストに含まれている場合、箇条書きの仕様を指定するオプションの要素。

ParagraphElementStructuralElement のように機能します。次の図に示すように、一連のコンテンツ要素タイプ(ColumnBreakEquation など)は、それぞれの ParagraphElement をパーソナライズします。

段落要素の構造。
図 3. 段落要素の構造。

完全なドキュメント構造の例については、JSON 形式のドキュメントの例をご覧ください。出力では、多くの主要な構造要素とコンテンツ要素を確認できます。次のセクションで説明するように、開始インデックスと終了インデックスの使用状況も確認できます。

テキストの実行

TextRun は、すべて同じテキスト スタイルを持つ連続した文字列を表す ParagraphElement です。段落には複数のテキスト実行を含めることができますが、テキスト実行が段落の境界を越えることはありません。コンテンツは改行文字の後で分割され、別々のテキスト実行となります。たとえば、次のような小さなドキュメントについて考えてみましょう。

段落と箇条書きを含む小さなドキュメント。
図 4. 小さなドキュメント。

次の図は、前述のドキュメントの一連の段落を可視化する方法を示しています。それぞれに独自の TextRun とオプションの Bullet 設定があります。

テキスト実行の構造。
図 5. テキスト実行の構造。

AutoText

AutoText は、時間の経過とともに変化する可能性のあるコンテンツに動的に置き換えられるテキスト内のスポットを表す ParagraphElement です。ドキュメントでは ページ番号に使用されます

開始インデックスと終了インデックス

ドキュメントのコンテンツを更新すると、特定の場所またはドキュメント内の特定の範囲で更新が行われます。これらの場所と範囲は、含まれるドキュメント セグメント内のオフセットを表すインデックスを使用して指定します。セグメントとは、構造要素やコンテンツ要素を含む本文、ヘッダー、フッター、脚注のことです。セグメント内の要素のインデックスは、そのセグメントの先頭を基準とします。

本文のコンテンツ内のほとんどの要素には、ゼロベースの startIndex プロパティと endIndex プロパティがあります。要素を含むセグメントの開始点を基準とした、要素の開始位置と終了位置のオフセットを示します。Docs API のバッチ呼び出しを並べ替える方法については、バッチ アップデートをご覧ください。

インデックスは UTF-16 コード単位で測定されます。つまり、サロゲートペアは 2 つのインデックスを使用します。たとえば、「笑顔」の絵文字 🙂? は \uD83D\uDE00 として表され、2 つのインデックスを消費します。

ドキュメント本文内の要素の場合、インデックスは本文コンテンツの先頭(「ルート」要素)からのオフセットを表します。

構造要素の「パーソナライズ」タイプ(SectionBreakTableOfContentsTableParagraph)には、包含する StructuralElement にこれらのフィールドがあるため、このようなインデックスがありません。これは、ParagraphElement に含まれるパーソナライズ タイプ(TextRunAutoTextPageBreak など)にも当てはまります。

要素にアクセスする

多くの要素は documents.batchUpdate メソッドで変更できます。たとえば、InsertTextRequest を使用すると、テキストを含むすべての要素のコンテンツを変更できます。同様に、UpdateTextStyleRequest を使用して、1 つ以上の要素に含まれるテキスト範囲に書式を適用できます。

ドキュメントの要素を読み取るには、documents.get メソッドを使用してドキュメント全体の JSON ダンプを取得します。その後、生成された JSON を解析して、個々の要素の値を見つけることができます。詳細については、ドキュメントの内容を JSON として出力するをご覧ください。

コンテンツの解析は、さまざまなユースケースに役立ちます。たとえば、ドキュメントをカタログ化して、検出したドキュメントをリストするとします。このアプリは、次の図に示すように、ドキュメントのタイトル、リビジョン ID、開始ページ番号を抽出できます。

ドキュメント カタログの構造。
図 6. ドキュメント カタログの構造。

これらの設定を明示的に読み取るメソッドはないため、アプリでドキュメント全体を取得してから、JSON を解析して値を抽出する必要があります。

プロパティから継承

StructuralElement は親オブジェクトからプロパティを継承できます。オブジェクトの最終的な外観は、定義されているプロパティや継承するプロパティなど、オブジェクトのプロパティによって決まります。

テキスト文字の書式設定は、太字、斜体、下線など、ドキュメント内でのテキストのレンダリング方法を決定します。適用した書式は、基になる段落の TextStyle から継承されたデフォルトの書式をオーバーライドします。逆に、書式を設定しない文字は、その段落のスタイルを継承します。

段落の書式設定によって、ドキュメント内でのテキスト ブロックのレンダリング方法(配置、枠線、インデントなど)が決まります。適用する書式は、基になる ParagraphStyle から継承されたデフォルトの書式をオーバーライドします。逆に、設定していない書式設定機能は引き続き段落スタイルを継承します。