из файла 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 шт):
Получилось сделать, правда, из-за малого опыта, выглядит это кустарно. Но может поможет кому-то в аналогичной ситуации
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 запрос
У Гугла есть ограничение на количество запросов в минуту. И соответсвенно изменения необходимо отправлять пакетами.
В библиотеке 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