Я пишу приложение на Python, которое читает данные из таблиц Google, но я также хочу иметь возможность программно добавлять именованные диапазоны, чтобы уменьшить очень утомительную и подверженную ошибкам печать.Лист пуст, за исключением значения foo
в ячейке B1.Часть чтения работает, как показано в этом примере, но при попытке записи я получаю 401, НЕАУТЕНТИФИЦИРОВАННЫЙ.И это несмотря на то, что я использую область действия https://www.googleapis.com/auth/spreadsheets
, как описано в https://developers.google.com/sheets/api/guides/authorizing
. Для записи диапазона я использую пример кода из https://developers.google.com/sheets/api/samples/ranges
Вся программа выглядит следующим образом:
from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import requests
# Setup the Sheets API
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
service = build('sheets', 'v4', http=creds.authorize(Http()))
# Specific spreadsheet, actual ID hidden in this example
SPREADSHEET_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
# Utility functions
def add_named_range():
url = 'https://sheets.googleapis.com/v4/spreadsheets/%s:batchUpdate'%SPREADSHEET_ID
data = '''{
"requests": [
{
"addNamedRange": {
"namedRange": {
"name": "test",
"range": {
"sheetId": "%s",
"startRowIndex": 1,
"endRowIndex": 1,
"startColumnIndex": 1,
"endColumnIndex": 1,
},
}
}
}
]
}
'''%SPREADSHEET_ID
response = requests.post(url, data=data)
return response
def get_value_from_range(range_name, spreadsheetId=SPREADSHEET_ID):
result = service.spreadsheets().values().get(spreadsheetId=SPREADSHEET_ID,
range=range_name).execute()
if not 'values' in result.keys():
return None
else:
return result['values'][0][0]
print(get_value_from_range('data'))
res = add_named_range()
print(res.text)
, а распечатка при запуске -
foo
{
"error": {
"code": 401,
"message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED"
}
}
, поэтому программа может читать данные, но не писать, а добавлятьименованный диапазонЧто я здесь не так делаю?