こんにちは、うおなです。
今回は、Pythonでgspreadという、Google Spread Sheet を操作するAPIを使っているときに、
発生したエラーの直し方についてまとめました。
エラーメッセージが、「Quota exceeded ~」から始まるエラーについて、
エラーの原因と直し方について掘り下げていきます。
それでは、原因から順を追ってみていきましょう。
直し方だけ知りたい人は、目次からサクッと飛んでください。
エラーの原因
今回取り上げるエラーが発生した時のスクリーンショットを取っておきました。
赤背景で、デカデカと何やら英語が書かれています。
エラーが発生した時には、突然赤い画面、文字と英文が叩きつけられ、焦ってしまいますが、
落ち着いてエラーメッセージから確認していきましょう。
エラーメッセージの確認
大きく、APIError と表示されています。
そして、
‘code’ : 429, ‘message’ : “Quota exceeded for quota metric ~~
という記述が見えます。
エラーコードは、429のようです。
エラーメッセージは、次の通りです。
Quota exceeded for quota metric ‘Write Request’ and limit ‘Write requests per minute per user’ of service ‘sheets.googleapis.com’ for consumer ‘project number:869392820091’.
なんとなく、書き込みのリクエスト(Write Request)で怒られてることは想像できます。
Write rerquests per minute という部分があるので、どうやら1分あたりの書き込みリクエスト回数を超過したことがエラーの原因のようです。
APIリクエストの上限回数
APIのリクエストの上限回数については、APIの公式ホームページに記載がありました。
画像は、公式のホームページから引用したものです。
読み取りのリクエストと、書き込みのリクエストで、それぞれ1分あたりのリクエスト回数の上限が決められています。
どちらの場合も、プロジェクトごとに1分あたり、60回が上限として決められています。
今回は、Write Request で、リクエストの超過エラーが出たので、書き込みのリクエスト回数が、1分に60回を超えたということのようです。
エラーの直し方
ここから、エラーの直し方を見ていきましょう。
今回は、リクエストの送る回数が、上限を超えたというエラーです。
よって、
- リクエストの上限値を上げる
- リクエストの上限回数を超えないようにする
これらの方法で、今回のエラーを回避することができます。
リクエストの上限回数を上げる
一定時間内に送るリクエストの回数の上限を超えたことで、エラーになっているため、
そのリクエストの上限回数をあげてしまおうという解決方法です。
リクエストの回数は、Google Cloud のページから上げることができます。
今回は、プログラム側でエラーを回避することを主題にするため、この方法は、流したいと思います。
上限回数に引っかからないように、リクエストを送る
一定時間内に送るリクエストの回数の上限を超えたことで、エラーになっているため、
一定時間内に送るリクエストの回数が、上限回数を超えないようにしようという解決方法です。
グローバル変数で、リクエストを送った回数を管理します。
そして、リクエストを送るたびに、次のような関数を呼び出すようにします。
def CheckAPICount():
//グローバル変数の使用を宣言する
global writeCount
//リクエストを送った回数を1増やす
writeCount += 1
//リクエストを60回送ったら、61秒間処理を止める
//そのあと、リクエストの回数をリセットする
if writeCount >= 60:
time.sleep(61)
writeCount = 0
関数が呼ばれるたびに、リクエストの回数を管理する変数に1を足していきます。
そして変数の値が、1分間の上限回数である、60回になったら、61秒間処理を止めて、エラーが発生するのを、防ぎます。
「update_cell」で、スプレッドシートのセルに書き込みを行うたびに、CheckAPICount()を呼びます。
for fData in fundDatas:
sheet.update_cell(rowCount, 1, fData.isinCode)
CheckAPICount()
sheet.update_cell(rowCount, 2, fData.name)
CheckAPICount()
sheet.update_cell(rowCount, 3, fData.price)
CheckAPICount()
sheet.update_cell(rowCount, 4, fData.total)
CheckAPICount()
sheet.update_cell(rowCount, 5, fData.marketValue)
CheckAPICount()
こうすることで、リクエストの回数が60になった時に、自動で処理を止めて、エラーの発生を防いでくれます。
この方法の問題点としては、1分間当たりのリクエストの送信上限回数に達するたびに、プログラムがとまるので、プログラム全体の処理の時間が長くなります。
私は、定期実行してスプレッドシートに書き込みを行うプログラムで、処理速度を気にしなかったので、この解決方法を組み込みました。
もし、処理速度の速さが求められる場合は、リクエストの上限回数を上げてしまいましょう。
コメント