2017年03月16日

Google Apps ScriptでGmail読み取り制限によるトラブルを回避する

 業務システムから、ブログの投稿やポメラSync用の仕組みなども最近ではGoogle Apps Scriptを使っています。

 Googleのサービスをコントロールしたり、連携が容易にできるのでアイデアしだいでいろんなことができます。

 このなかで、よく使っているのがメール関連の処理です。

 ポメラDM200から送ったメールをポメラSync用に変換したり、ブログに投稿するのと同時にEvernoteに保存する、ネット銀行のメールから金額をスプレッドシートに転記するなど、メールを起点とした処理を多く利用しています。

 メールの処理で問題になるのが、Gmailの読み取り制限です。
 一般ユーザーのアカウントでは、一日に20,000件までとなっています。

 2万件なんていかないと、高をくくっていましたが案外簡単に超えてしまいます。

 Google Apps ScriptでGmailを検索して、条件に合ったメールを処理するとき、対象のメール数と頻度(トリガーの間隔)・スクリプトの数で計算してみます。

トリガーの間隔が1分の場合、1440回実行されます。

20000÷1440=13.88件

 このときに、Gmailの検索で毎回ヒットするメール数は13件までになります。

・5分で、69件
・10分で、138件
・15分で、208件
・30分で、416件

 メールを対象とするスクリプトが複数あれば、合算した値となります。
 トリガーの間隔が1分のスクリプトが二つあれば、それぞれ6件までとなります。

 制限を超えると、当然エラーとなります。


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

 searchメソッドを使う場合は、最大取得数を大きくしすぎると制限を超えてしまいます。

 制限を回避するには三つの方法があります。
・トリガーの間隔を長くする
・最大取得数を少なくする
・検索条件を工夫する

 この中で、三つ目の検索条件の工夫が一番効果あると考えています。
 できるだけヒットする数が少なくなるように、条件を厳しくします。

 たとえば、未読のもののみを対象にする、特定のラベルのもののみを対象にするなどです。

 こうすると、一度処理したものを既読にする・ラベルを付け替えるなどの処理を行うことで、次の実行時には対象から外れます。


 メール処理のスクリプトは、すぐに処理してほしいものが多いのでトリガーの間隔は1分を多用しています。
 スクリプトがエラーになったときの通知を「今すぐ」にしていると、あっという間に数百通のエラー通知メールが受信トレイにたまります。

 エラーメールを消している最中にも、どんどんメールが来ます。
「え! なに、ちょっと待って〜」

 かなり慌てました。
 取り急ぎ、Google Apps Scriptのトリガーを削除して、エラーメールを削除しました。

 一日の上限を超えると、当然ながら日付が変わらないと使えるようになりません。
 日本時間ではないので、日本では午前9時になります。


 業務システムを動かしていると、こうしたエラーが致命的となります。
 Google Apps Scriptには、この他にもメール送信数の制限など、様々な条件があります。
 スクリプトのテストを行う前に、ちょっと確認しておくとトラブルを回避できると思います。

 そのほかの制限事項については、ダッシュボードをご覧ください。
Google Apps Script ダッシュボード

 では、また次のテキストでお会いしましょう♪
posted by Outliner 伊藤 崇 at 11:59| Comment(0) | 効率化・仕組み
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: