Help us understand the problem. What is going on with this article?

Google Document API の文書構造でハマった話

More than 1 year has passed since last update.

今回、Googleドキュメントの文書をスクリプトから編集する処理を書いていて、ハマったポイントがあるので共有します。

やりたい事

  • Googleドキュメントの本文をテンプレートとして使用し、テンプレートファイル内に、生成した本文を出力する

今回やろうとしたのは、文書を水平線(hr)で区切る構成です。

  • 水平線以前がテンプレート
  • 水平線以降に出力結果が表示される

という構成で、水平線以前/以降を判定する処理が必要でした。

水平線を取得する

水平線を取得するのは、
BodyオブジェクトのfindObjectメソッドで行います。

var firstHr = body.findElement(searchTypeHR);

こんな感じです。
これで取得できるのはRangeElementオブジェクトなので、さらにgetElement()メソッドで、中身のHorizontalRuleオブジェクトを取り出してあげます。

var theHr = firstHr.getElement();

これを基準に、段落(Paragraphオブジェクト)の位置を判定すれば、水平線以前と以降がわかるはずです。

水平線の前後要素が取れない

しかし、ここがハマりポイントとなりました。
すなわち、HorizontalRuleオブジェクトの、文書内の位置が取れません。

ここで読むべきものはドキュメントです。

https://developers.google.com/apps-script/guides/docs#structure_of_a_document

これによると、『水平線は、ListItemやParagraphの配下である』と書いてあります。
文書構造としては、このようになっているわけです。

Body
  ├ Paragraph
  │  ├ Text
  │  └ Text
  ├ Paragraph
  │  └ HorizontalRule
    .
    .
    .

解決法

HorizontalRuleオブジェクトはParagraphオブジェクトの子なので、文書内の位置を知るには、親要素となるParagraphオブジェクトを取得する必要がありました。

というわけで、以下のようにすると、文書内の位置が取れたのでした。

body.getChildIndex( theHr.getParent())

めでたし。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away