Я боролся с этой ошибкой уже несколько недель и пробовал решения из ранее опубликованных вопросов, касающихся Python API для Google Sheets.
Я постоянно получаю сообщение об ошибке, когда делаю запрос на «запись» в свою электронную таблицу через API Google Sheets для python. Ошибка говорит о том, что я отправляю недопустимый JSON, но я протестировал структуру JSON в интерактивном тестовом окне (Google APIs Explorer), и запрос оттуда правильно обновляет мой лист.
Код ниже
from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import datetime
import json
# Call the Sheets API
SPREADSHEET_ID = #mySheetID
RANGE_NAME = '2018_Raw Data!A3:A367'
months = { 0:"Jan", 1:"Feb",2:"Mar",4:"Apr",5:"May",6:"Jun",7:"Jul",8:"Aug",9:"Sep",10:"Oct",11:"Nov",12:"Dec"}
now = datetime.datetime.now()
date = str(now.day) +"-"+ months[now.month] + "-"+str(now.year)
day_of_year = now.timetuple().tm_yday
myRow = day_of_year+2
print (date)
print (myRow)
BWRange= '2018_Raw Data!B' + str(myRow)
BFRange= '2018_Raw Data!C' + str(myRow)
myBodyWeight=150
myBF = "10%"
print (BWRange)
print (BFRange)
BWData = {}
BWData['values']= [[myBodyWeight]]
BWData['majorDimension'] = "ROWS"
BWData['range']= BWRange
BWJson= json.dumps(BWData)
BFData = {}
BFData['values']= [[myBF]]
BFData['majorDimension'] = "ROWS"
BFData['range']= BFRange
BFJson= json.dumps(BFData)
print (BWJson)
print (BFJson)
# Setup the Sheets API
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
creds = tools.run_flow(flow, store)
service = build('sheets', 'v4', http=creds.authorize(Http()))
#bw
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID,range=BWRange, valueInputOption = "USER_ENTERED", body=BWJson)
response = request.execute()
pprint(response)
#bf
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID, range=BFRange,valueInputOption = "USER_ENTERED", body=BFJson)
response = request.execute()
pprint(response)
Ошибка ниже:
Traceback (most recent call last):
File "C:\sheets\mySheets.py", line 65, in <module>
response = request.execute()
File "C:\Python27\lib\site-packages\googleapiclient\_helpers.py", line 130, in positional_wrapper
return wrapped(*args, **kwargs)
File "C:\Python27\lib\site-packages\googleapiclient\http.py", line 842, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://sheets.googleapis.com/v4/spreadsheets/1demD8sm5-Jvi7ImHcOu03sHaU7PF61ym1eyvjN1bGfw/values/2018_Raw%20Data%21B234?alt=json&valueInputOption=USER_ENTERED returned "Invalid JSON payload received. Unknown name "": Root element must be a message.">
Я просмотрел следующие сообщения ниже:
Python3 google spreadsheet api batchUpdate форматирование Json
Ошибка недопустимой полезной нагрузки JSON с API таблиц Google на Python
Любая помощь приветствуется - спасибо!






Я считаю, что тело вашего запроса правильное. Так как насчет этой модификации?
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID,range=BWRange, valueInputOption = "USER_ENTERED", body=BWJson)
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID, range=BFRange,valueInputOption = "USER_ENTERED", body=BFJson)
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID,range=BWRange, valueInputOption = "USER_ENTERED", body=BWData)
request = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID, range=BFRange,valueInputOption = "USER_ENTERED", body=BFData)
json.dumps().Если это не сработало, скажите, пожалуйста. Я бы хотел его изменить.
@hsingarajah Я рад, что ваша проблема была решена. И тебе спасибо.
Отличная работа!!! Вы были правы - модификация завершилась успешным обновлением! Я немного сбит с толку, потому что у меня сложилось впечатление, что API требует, чтобы тело было отправлено как строка в формате JSON ..?