Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法

★気に入ったらシェアをお願いします!

limit

photo credit: Seattle Department of Transportation Speed Trailer via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptの用途としてGmailの特定のメールを取得するというのはけっこう多いですよね。

  • スプレッドシートに書き出したり
  • チャットに転送したり

などなど、けっこう便利ですし。

しかし、GASでメールを取得する際に気を付けなければいけない点があります。

それは、Gmailの読み取りについての1日20000件の壁です。

これをオーバーしてGmailから読み取ろうとすると、ひたすらエラーを吐き出して動作しないという切ない状況が起きてしまうんですね。

ということで、今回はこの件について注意しなきゃね、という内容です。

Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法についてお伝えします。

GASによるGmailの読み書きの制限について

まずコチラの「Google Apps Script ダッシュボード」のページをご覧ください。

Google Apps Scriptで実行する際の各種動作の制限が一覧されています。

その中で、Gmailに関しては「Gmailの読み取りと書き込み(送信以外)」という項目で

  • 一般ユーザー(gmail.com):20000 個/日
  • G Suite Basic / Business:50000 個/日

とありますね。

有料版のG Suiteと無料のGoogleアカウントでは異なりますが、いずれもGmailの読み取り件数には制限があるということをまず抑えておきましょう。

以降本記事では、無料のGoogleアカウントを前提に、20000件が許容量ということで話を進めていきます。

GASでGmailの取得件数がオーバーしてしまう例

例えば、以前書いたこちらの記事。

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

意外に参考にして頂いているケースが多いようで大変うれしいのですが、実はちょっと問題がありました。

スクリプトはこちらです。

スクリプトを仕込んでいるGoogleアカウントのGmailから

‘(“このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました” OR “このメールは いつも隣にITのお仕事 https://tonari-it.com のお問い合わせフォームから送信されました”)’

という条件で検索するという内容です。

GmailApp.searchメソッドの最大取得数に注意

「1日20000件なんて、そんないかないだろ~」って思いますでしょ?

実はそうじゃないんです。

まず、例えば15分に一回のトリガーを仕込んだとすると、このスクリプトは1日で96回呼び出されることになりますよね。

そして、ポイントはこの7行目の一文。

Gmailから指定の条件でスレッドを検索するsearchメソッドですが、書き方はこうです。

GmailApp.search(検索条件, 開始スレッドのインデックス, 最大取得数)

そして、3つめの引数である最大取得数ですが、上記スクリプトの例では500件です。

条件にマッチするスレッドがMAXの500件あったとすると、1日で96回呼び出されるわけですから

500件×96回/日=48000件/日

となり、余裕でオーバーとなります。これはいかんですね。設計ミスです。

GmailApp.searchメソッドを使う場合は、その最大取得数に気をつけなければいけないのです。

Gmailの制限はすぐにオーバーする

実際はどうでしょうか。

試しに、現時点でGmailを同条件で検索してみたら

Gmail検索の結果件数

このように、146件でした。

15分に1回の場合、1回あたりの受信件数の許容量は

146件/回×96回/日≒14016件/日

ですから、今のところ20000件/日の許容範囲内ですが、検索条件にマッチする問い合わせメールが208件ほどたまった段階で、オーバーするようになっていってしまうということです。

以下、分タイマーでトリガーを仕込んでいる場合の最大取得数の参考値です。

トリガーの間隔 最大取得数の許容数
1分 13件
5分 69件
10分 138件
15分 208件
30分 416件

さらに、同一アカウントで複数のスクリプトを仕込んでいる場合は、全ての合算値になりますから

  • 個々の最大取得数はできる限り小さい
  • イベントトリガーの間隔はできる限り長い

に越したことはありません。

最大取得数と検索条件をfunctionから外出しする

このように、GmailApp.searchメソッドの最大取得数はちょいちょいチューニングをするような数値になりますので、以下スクリプトのようにfunction外で指定するようにするほうが、わかりやすいかも知れませんね。

ついでに、検索条件も外出ししてみました。

まとめ

以上、Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法についてお伝えしました。

Gmailの読み取り件数に関しては、GmailApp.searchメソッドの最大取得数とイベントトリガーの発火間隔についてはよく注意して設計をして下さいね。

GASはクラウド環境でたいへん便利な一方で、様々な制限が課せられていますね。

ただ、制限内で開発するというのは、けっこうスキル的には向上の機会だったりもするので、ポジティブに捉えています。

また、気を付けて欲しい点があれば、記事にしますね。

どうぞお楽しみに!

連載目次:GASでGmailに届いた問い合わせメールを分析する

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。
  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す
  3. フリーランスの仕事はどこから来たか、独立して1年間の受注件数を全て晒す
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをチャットワークに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法