【gspread】Quota exceeded ~エラーの直し方

※本サイトはアフィリエイト広告を利用しています。
IT技術
この記事は約5分で読めます。
スポンサーリンク

こんにちは、うおなです。

今回は、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の公式ホームページに記載がありました。

公式から引用した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秒間処理を止めて、エラーが発生するのを、防ぎます。

time.sleep() の値は、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分間当たりのリクエストの送信上限回数に達するたびに、プログラムがとまるので、プログラム全体の処理の時間が長くなります

うおな
うおな

私は、定期実行してスプレッドシートに書き込みを行うプログラムで、処理速度を気にしなかったので、この解決方法を組み込みました。

もし、処理速度の速さが求められる場合は、リクエストの上限回数を上げてしまいましょう。

コメント

タイトルとURLをコピーしました