GAS|ドキュメントを保存する前に適用した変更が多すぎます。|setText|Body|DocumentApp|Google Apps Script|開発裏話
「マンガポスト日本版」では、Google ドライブ内に保存している「コミックス発売日情報」を参照して、その日付を基に毎日自動配信(ツイート)しています。
「500KB」のテキストを、以下の方法で「Google ドキュメント」に保存しようとしたら、「ドキュメントを保存する前に適用した変更が多すぎます。」というエラーが発生しました。
var document = DocumentApp.create(name);
document.getBody().setText(text);
document.saveAndClose();
上記程度の非常にシンプルな実装で、何故このエラー内容なのか理解できませんでしたが、検証していると、どうも「500KB」のテキストを一度に保存するのは、「Google ドキュメント」的には「変更(テキスト内容)が多すぎ」て NG なようです。
このエラーを回避するには?
Google から提示されたこのエラーを回避する方法は、小さいサイズで細かく保存するを繰り返す、というものでした。以下のようにです。
var document = DocumentApp.create(name);
document.getBody().setText(text1);
document.saveAndClose();
document = DocumentApp.openById(document.getId());
document.getBody().setText(text2);
document.saveAndClose();
document = DocumentApp.openById(document.getId());
document.getBody().setText(text3);
document.saveAndClose();
...
GAS に於けるパフォーマンスは、「API コール回数」に依存します。なので、上記のように分割する実装は、かなりの時間を要します。また、何 KB 以下だったらエラーにならないのか、それを検証するのも非常に手間で、この方法は現実的ではないように思います。
なので、繰り返すのではなく、一度に書き込む方法として、以下を選択することも可能です。「File」として扱うのです。
var document = DocumentApp.create(name);
var file = DriveApp.getFileById(document.getId());
file.setContent(text);
これならエラーも発生せず、一度に「Google ドキュメント」へ保存することが可能です。
しかし、「Google ドキュメント」そのものが高機能なドキュメントなので、「500 KB」のテキストを保存するのに、約 1 分も時間を必要としました。一度のスクリプト実行時間が「6 分(無料利用の場合)」という制約の中で、この「保存だけで 1 分も必要」とするのは、大きな悩みの種です。
Feature
Script runtime
Consumer (e.g., gmail.com)
6 min / execution
「Google ドキュメント」を選択するメリットとして、Google ドライブの保存容量を消費しないというのが非常に魅力的なのですが、パフォーマンスと天秤に掛ける必要があるでしょう。
容量を使用しないアイテム
Google ドライブ:
Google ドキュメント、Google スプレッドシート、Google スライド、Google フォーム、Google サイト、[共有アイテム] 内のファイル。
パフォーマンスを優先するなら?
何よりもパフォーマンスを優先するなら、リッチな「Google ドキュメント」は選択せず、シンプルな「プレーンテキスト」に保存します。
DriveApp.createFile(name, text, MimeType.PLAIN_TEXT);
これなら「500 KB」のテキストが、約 1 秒で保存できます。
※サポートされている「MIME type(マイムタイプ)」は以下で確認できます
マンガポスト日本版
マンガポスト日本版の Twitter 公式アカウントです。
漫画(まんが)・コミックの新刊情報を毎日配信中!
コーヒーブレイク
行き場のない怒りと孤独を抱える高校生のマコトが持ってしまった驚異の「力」とは…!? 理不尽な社会を相手に、破壊という名の革命が始まる!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?