Google Apps Script のエラーではまった

Google Apps Scriptは簡単な処理を実行するのに便利ですね。

でもちょっと時間のかかる処理をするとすぐに制限値を超えてしまいます。

わたしがいままで経験したエラーを今後のメモ用に残しておきます。

エラーメッセージ:起動時間の最大値を超えました

Google Apps Scriptでちょっと長い処理を実行すると発生してしまうエラーです。

1回の処理実行は6分までの制限があります。
これを超えるとエラー終了してしまいます。

これを考慮して複数回にわけて処理の実行を可能にする実装が必要になるんです。

具体的にはこんな感じです。

  1. 処理開始からの時間を計測します
  2. どの処理まで実行されたか記録します
  3. 制限時間を超える前に処理を終了します
  4. 2回目以降は2で記録した値を元に続きから処理を実行します

2回目以降の処理を手動で実行するのも面倒な場合はトリガーで自動実行できます。

エラーメッセージ:サービスで 1 日に使用しているコンピュータ時間が長すぎます

処理を分割実行してトリガーで実行可能ですがこれもやりすぎは禁物です。

トリガーも1日20回までの制限があります。
またトリガーでの実行は1日90分まで(G Suite契約の場合は6時間まで)とこちらも制限があります。

つまり
1回の実行5分(6分まで可能だが早めに終了処理を入れる)×20回=100分
となり単純に1日20回トリガーで実行してしまうと1日のトリガー実行時間を超えるので注意が必要なんです。

1日のトリガー実行制限に達したら対応できる方法は以下のとおり

  1. 別アカウントで実行する
  2. 1日待ってから実行する
  3. 手動で地道に実行する

エラーメッセージ:メモリの上限を超えました

あるAPIを連続実行し戻り値をCSV出力するためにメモリ上に保存したところ発生しました。

メモリ上限値の具体的な記載はGoogleサイトから見つけられませんでした。

上限値がわからないのでAPI実行毎に戻り値をスプレッドシートに出力することにしました。
メモリ上で処理したほうが処理は早いと思うのですがしかたないですね。

その他エラー:スプレッドシート書込不可

APIからの戻り値をスプレッドシートに追記するようにしたところ途中で書き込めなくなりました。

そうスプレッドシートは 200 万セルまでというこちらも制限値があったのです。

ひとつのシートではなく別シートへ出力しました。
同じファイルで問題ありません。シートの追加をしただけです。

その他エラー:ファイルアップロードできない

APIによるファイルのアップロードに失敗する場合がありました。
こちらも上限値によるエラーでした。
POST(URLFetchでのPOST)サイズ制限値は10MBまでです。

あきらめてPOST前にファイルサイズをチェックすることで
10MB超のファイルは処理対象からはずすことにしました。
問題解決になっていませんがもうどうしようもありません。

参考
Quotas for Google Services
https://developers.google.com/apps-script/guides/services/quota

スプレッドシート制限
https://support.google.com/drive/answer/37603?hl=ja

まとめ

Google Apps Scriptはちょっとした処理にはむいています。
でもデータ量が多かったり処理時間がかかる場合は他の手段を検討したほうがよいです。

なんでもかんでもGoogle Apps Scriptで解決しようとすると逆に時間をロスするということを学びました。
サーバたてたほうが早い場合もあるはずです。