【问题标题】:Python Google Sheets API Limit 429 Error with LoopPython Google Sheets API 限制 429 错误与循环
【发布时间】:2018-12-13 15:33:38
【问题描述】:

我正在运行一个 python 脚本,该脚本通过 Google Sheets API 和 Gspread 包将特定列从一个 Google Sheet 获取到另一个 Google Sheet,但是当我将列表推送到新电子表格时遇到429 Error .此错误与太多请求有关,但我不确定是什么让我的推送运行多次而不是一次。我的worksheet.update_cells(updated_values) 是否可能包含在循环中?

错误:

APIError: {
  "error": {
    "code": 429,
    "message": "Quota exceeded for quota group 'WriteGroup' and limit 'USER-100s' of service 'sheets.googleapis.com' for consumer 'project_number:*id*'.",
    "status": "RESOURCE_EXHAUSTED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.Help",
        "links": [
          {
            "description": "Google developer console API key",
            "url": "https://console.developers.google.com/project/*id*/apiui/credential"
          }
        ]
      }
    ]
  }
}

代码:

# column names
print(columns) # ['date', 'b_clicks', 'b_cpc']

# store count of column names
gs_columns = []

# count columns
for i in range(0,len(columns)):
    gs_columns.append(i+1)

print(gs_columns) # [1,2,3]

updated_values = []

for col_val, col_name in zip(gs_columns, columns):
    worksheet_range = worksheet.range(1, col_val, 500, col_val); # [row_start, col_start, row_end, col_end]
    print(type(worksheet_range))
    column_data = df_full[col_name].values.tolist();
    for cell, data in zip(worksheet_range, column_data):
        cell.value = data
        updated_values.append(cell)

worksheet.update_cells(updated_values)
print(updated_values)
print(type(updated_values))
print(len(updated_values))

打印:

['date', 'b_clicks', 'b_cpc']
[1, 2, 3]
<class 'list'>
<class 'list'>
<class 'list'>
[<Cell R1C1 1514764800000000000>, <Cell R2C1 1514851200000000000>, <Cell R3C1 1514937600000000000>....<Cell R345C3 3.21>, <Cell R346C3 3.92>]
<class 'list'>
1038

【问题讨论】:

  • update_cells() 应该只产生一个 HTTP 调用。我会在您的示例代码中怀疑worksheet.range。您可以尝试进一步调试并将计数器放入“客户端”。 request()` 方法。
  • 介意详细说明您对worksheet.range 的怀疑吗?我不确定我是否跟随。此外,Client.request() 方法的调试效果如何?这绝对是我想调查的事情。想到的另一个想法是列表的长度,如果在update_cells() 上同时更新 1038 对 API 调用来说太多而无法处理,但我认为该方法的大小不应该是问题,因为这是相对于许多 Google 表格/Excel 任务而言,数量并不多。
  • 只是我看到range 调用在循环中,而update_cells 只被调用一次。我调试Client.request 的意思是定位此方法的源代码并插入断点或打印语句以查看您发送了多少实际API 请求。您是否还可以减少第一个 for 循环中的项目数,看看问题是否消失?
  • @Burnash 我发现了这个问题。问题是我循环并映射到 worksheet_range 值的列表具有不同的长度。看来这不能很好地工作并且正在抛出 API 调用

标签: python google-sheets-api gspread


【解决方案1】:

遇到同样的问题,有没有一种方法可以根据以下条件限制程序,例如在 for 循环中,我们可以限制请求到 api 的数量并匹配以下条件

time.sleep(10)

关于developers.google.com

Google Sheets API 限制每个项目每 100 秒 500 个请求,每个用户每 100 秒 100 个请求。单独跟踪读取和写入的限制。没有每日使用限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2016-12-17
    • 2014-11-12
    • 1970-01-01
    • 2017-12-26
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多