из файла json в google sheets python

Нужно перебрать заранее созданный json файл и записать из него информацию в гугл таблицу. Все работает, вот только количество запросов превышает допустимое и перестает записывать. Через паузы пробовал, но все равно либо долго, либо что то не запишет. Читал что вроде как можно вставить информацию одним запросом, но не нашел подходящего примера.

Код:

import json
import gspread

def gogle_sheets():
    global cell
    gs = gspread.service_account(filename='ХХХ')
    sh = gs.open_by_url("ХХХ")
    worksheet = sh.worksheet("Card_db")
    with open('DB_card.json', 'r', encoding="utf-8") as f:
        data = json.loads(f.read())
        for card_json in data:
            worksheet.update_cell(cell, 1, card_json["Nomber"])
            worksheet.update_cell(cell, 2, card_json["Сard"])
            worksheet.update_cell(cell, 3, card_json["Schedule"])
            worksheet.update_cell(cell, 4, card_json["Labels"])
            worksheet.update_cell(cell, 5, card_json["Url"])
            worksheet.update_cell(cell, 6, card_json["Logo"])
            worksheet.update_cell(cell, 7, card_json["Description"])
            cell = cell + 1

Пример json

[
    {
        "Nomber": 1,
        "Сard": "xxx",
        "Schedule": "xxx",
        "Labels": "xxx",
        "Url": "xxx",
        "Logo": "xxx",
        "Description": "xxx"
    },
    {
        "Nomber": 2,
        "Сard": "xxx",
        "Schedule": "xxx",
        "Labels": "xxx",
        "Url": "xxx",
        "Logo": "xxx",
        "Description": "xxxx"
    },... и тд.
]

Ошибка

gspread.exceptions.APIError: {'code': 429, 'message': "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'sheets.googleapis.com' for consumer 'project_number:xxx'.", 'status': 'RESOURCE_EXHAUSTED', 'details': [{'@type': 'type.googleapis.com/google.rpc.ErrorInfo', 'reason': 'RATE_LIMIT_EXCEEDED', 'domain': 'googleapis.com', 'metadata': {'consumer': 'projects/xxx', 'quota_location': 'global', 'quota_limit': 'WriteRequestsPerMinutePerUser', 'quota_limit_value': '60', 'quota_metric': 'sheets.googleapis.com/write_requests', 'service': 'sheets.googleapis.com'}}, {'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Request a higher quota limit.', 'url': 'https://cloud.google.com/docs/quota#requesting_higher_quota'}]}]}

Ответы (2 шт):

Автор решения: AVID GAMER

Получилось сделать, правда, из-за малого опыта, выглядит это кустарно. Но может поможет кому-то в аналогичной ситуации


import numpy as np

one_d_array = []
array = []
with open('DB_card.json', 'r', encoding="utf-8") as f:
    data = json.loads(f.read())
    for card_json in data:
        array.append(card_json["Nomber"])
        array.append(card_json["Сard"])
        array.append(card_json["Schedule"])
        array.append(card_json["Labels"])
        array.append(card_json["Url"])
        array.append(card_json["Logo"])
        array.append(card_json["Description"])
        one_d_array.append(array.copy())
        array.clear()

two_d_array = np.array(one_d_array)

# update the sheet with array
worksheet.update('A2', two_d_array.tolist())

Как я понял, в этом случае делается все за 1 запрос

→ Ссылка
Автор решения: Voynov

У Гугла есть ограничение на количество запросов в минуту. И соответсвенно изменения необходимо отправлять пакетами.
В библиотеке gspread, у отрытого листа, есть метод insert_rows и insert_cols для этих целей. Он принимает массив.
При использовании insert_rows внутренний массив будет являться строкой, а при использовании insert_cols колонкой

import gspread
import json

# Указываем путь к JSON
gc = gspread.service_account(filename='serv_acc.json')

#Открываем тестовую таблицу
sh = gc.open("doc_test")

#Создаем лист 
name_worksheet = "лист1"
worksheet_list = sh.add_worksheet(title=name_worksheet, rows=100, cols=20)

#выгружаем массив
google_list = [[1,1,1],
               [2,2,2],
               [3,3,3]]
worksheet_list.insert_rows(google_list)

По итогу получится

A B C
1 1 1
2 2 2
3 3 3

Что касается файла из которого надо выгрузить данные, обычным циклом перебираешь весь файл

Условно так

google_list = []
with open('DB_card.json', 'r', encoding="utf-8") as f:
    data = json.loads(f.read())
    for card_json in data:
        tmp_mas = []
        tmp_mas.append(card_json["Nomber"])
        ...
        google_list.append(tmp_mas)

По итогу получится массив который передаешь на отправку в гугл таблицу методом insert_rows

→ Ссылка