GASでスライドを編集する際、SlidesAppとSlideサービスを同時に使用すると問題が起きる話

Google Apps Scriptを利用してGoogleスライドの作成や編集を行う際、SlidesAppクラスによる操作と、より高度な操作が可能な「Slideサービス」(Google Slides API Advanced Service)を併用するケースが考えられる。例えば、SlidesAppではテーブルセルのマージといった特定の操作が提供されていないため、テーブルセルのマージをしたい場合は、SlidesAppでテーブルを追加した後にSlideサービスを利用してテーブルセルのマージを行うといった手順を踏むことになる。

しかし、SlidesAppで要素を編集した直後に、同じスライドに対してSlideサービス経由で処理を加えようとすると、期待通りに動作しないことがある。

解決策:saveAndClose()メソッドの実行

この問題は、SlidesAppによる変更が即座に保存されず、後続のSlideサービスによる操作時に最新の状態が反映されていないことが原因だ。この問題を回避するためには、SlidesAppでの編集処理が完了した後、明示的にスライドを保存し閉じる処理を挟めば良い。具体的には、PresentationオブジェクトのsaveAndClose()メソッドを実行する。

// SlidesAppでスライドを取得または作成
var presentation = SlidesApp.getActivePresentation();
var presentationId = presentation.getId(); // Slidesサービス用にIDを取得しておく

// SlidesApp経由での編集処理
// (例: テキストの追加、図形の挿入など)
var slide = presentation.getSlides()[0];
// ... slideに対する編集処理 ...

// 編集内容を保存して閉じる
presentation.saveAndClose();

// この後、Slideサービス経由での操作を行う
// (例: テーブルセルのマージなど)

Slides.Presentations.batchUpdate(...) など

saveAndClose()メソッドを実行することで、SlidesAppによる変更がスライドファイルに確実に反映され、その後Slideサービスを用いて操作を行うことができるようになる。

ただし、saveAndClose()を実行すると、そのPresentationオブジェクトは操作できなくなる点に注意が必要だ。もしsaveAndClose()後に同じスクリプト内で続けてそのスライドを操作したい場合は、再度SlidesApp.openById()SlidesApp.getActivePresentation()などで開き直す必要がある。Slideサービス使用後にさらにSlideAppを利用する場合は、saveAndClose()前にgetId()でIDを取得するようにしておく。

関連する公式ドキュメント:

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です