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を取得するようにしておく。
関連する公式ドキュメント:
- SlidesApp: https://developers.google.com/apps-script/reference/slides/slides-app
- Presentation#saveAndClose(): https://developers.google.com/apps-script/reference/slides/presentation#saveAndClose()
- Google Slides API (Advanced Slides Service): https://developers.google.com/apps-script/advanced/slides