Комментарии 19
"Вы не можете смотреть видео или открывать фотографии, пока вы офлайн, но вы можете просматривать, редактировать и создавать файлы в оригинальных форматах Гугл-Диск, когда у вас нет соединения с сетью."
Есть какая то возможность получить возможности аналогичные доступным в Google Sheets API будучи оффлайн?
Но!
Я не очень представляю use case. На мой взгляд, Google Sheets API v4 вполне предоставляет нужную Вам возможность: вы можете накопить пачку запросов к API, а потом при наличии интернета исполнить их с помощью функций
spreadsheets.batchUpdate
и spreadsheets.values.batchUpdate
.Или Вы хотите работать, используя API, с теми документами, с которыми Вы в offline-режиме работаете в расширении/приложении?
Но моя статья — это туториал, поэтому я счёл достаточным упомянуть только один из способов. Упомянул тот, который использовал сам для генерации отчётов telegram-ботом для тайм-менеджмента. А ему не требуется доступ к документам пользователя, он лишь новые клепает :)
В сети не так много хороших примеров с Google sheet/drive API, поэтому большинство кода я писал методом проб и ошибок по дефолтному мануалу с описаниями запросов Google API.
Кстати я не пробовал и не особенно уверен, что без каких-то дополнительных действий смогу создать документ с помощью API Key доступный моему аккаунту.
Генерация отчетов с записью их в GDrive — хорошая идея. Интересно можно ли там еще и добавленных пользователей оповестит о обновлении, надо будет попробовать.
И еще. С помощью GSpread я так и не смог ничего сделать, не удалось заставить его видеть хоть какие-то документы.
В итоге пришлось разбираться в Sheets API v4, тоже методом проб и ошибок. Совершенно согласен, что в сети очень не хватает примеров. Именно поэтому я решил написать статью, чтобы другие не так долго мучались)
Насчёт оповещений: если проверите, отпишитесь что да как.
gdrive API и gsheets API — разные вещи. Если есть ключ для gsheets API, то нельзя получить список всех документов пользователя. Можно только оперировать с конкретным документом по его id.
Но я особо не ковырял, могу ошибаться.
api_key = "<my ley>"
spreadsheetId = '<my sheet id>'
service = build('sheets', 'v4', developerKey=api_key)
И кстати получить доступ к этому же документу с помощью OAuth я так и не смог.
Ну, у меня создано гугл-приложение, в котором включены API для gdrive и gsheets, и подключены два скопа:
SCOPES = (
r'https://www.googleapis.com/auth/drive.metadata.readonly',
r'https://www.googleapis.com/auth/spreadsheets.readonly'
)
после чего я получаю кредсы для этих скопов на основе полученного идентификатора(гугл выдаёт его с именем client_id.json
), в процессе чего открывается страничка oauth с просьбой подтверждения доступа к диску и таблицам.
Ключ для gsheets я нигде не использовал.
«values»: [[«This is D5», «This is D6»], [«This is E5», "=5+5"]]
TypeError: method() takes 1 positional argument but 2 were given
results = service.spreadsheets().values().batchUpdate(spreadsheetId, body = {
"valueInputOption": "USER_ENTERED",
"data":
[
{"range": "Лист1!B2:C3",
"majorDimension": "ROWS", # сначала заполнять ряды, затем столбцы (т.е. самые внутренние списки в values - это ряды)
"values": [["This is B2", "This is C2"], ["This is B3", "This is C3"]]
},
{"range": "Лист1!D5:E6",
"majorDimension": "COLUMNS", # сначала заполнять столбцы, затем ряды (т.е. самые внутренние списки в values - это столбцы)
"values": [["This is D5", "This is D6"], ["This is E5", "=5+5"]]
}
]
}).execute()
Буду рад, если поможете разобраться.
Вместо:
results = service.spreadsheets().values().batchUpdate(spreadsheetId, body = {
нужно:results = service.spreadsheets().values().batchUpdate(spreadsheetId = spreadsheetId, body = {
Обращаю Ваше внимание, что в коде в статье ошибки нет (и не было). Вы немного ошиблись, когда вносили правки после копирования.
Спасибо за туториал, скопировал себе файл и адаптировал под python3 (насколько я понял, мануал для python2.7? Потому что после установки библиотеки pip'ом проект у меня не заработал). В итоге сборку сервисов (sheets и drive) делал так:
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
credentials = Credentials.from_service_account_file(json_key_filename, scopes=SCOPES)
service = build('sheets', 'v4', credentials=credentials)
Еще хотел добавить, что при добавлении spreadsheet или нового листа значения для количества строк и колонок по умолчанию лучше выставить в 0. В таком случае создастся табличка 1000хZ (то есть, то же самое, что у вас, просто это будут "родные" для апи значения по умолчанию).
И — toGridRange будет работать только для диапазона A-Z? Конечно, это редкая ситуация, но колонок может быть и больше (я проверял). Для себя я пока оставил код в этом методе как есть, но, думаю, для универсальности, лучше его обновить.
насколько я понял, мануал для python2.7?
Да нет, всё для python3, странно, что у вас не заработало как есть. Даже в начале файла строка про python3.
Еще хотел добавить, что при добавлении spreadsheet или нового листа значения для количества строк и колонок по умолчанию лучше выставить в 0. В таком случае создастся табличка 1000хZ (то есть, то же самое, что у вас, просто это будут «родные» для апи значения по умолчанию).
Спасибо! Думаю, кому-нибудь будет полезно!
И — toGridRange будет работать только для диапазона A-Z? Конечно, это редкая ситуация, но колонок может быть и больше (я проверял). Для себя я пока оставил код в этом методе как есть, но, думаю, для универсальности, лучше его обновить.
Да, Вы правы. Но я писал, что обёртка является скорее примером использования Google Sheets API v4, чем полноценной обёрткой. Так что на первом этапе, я думаю, людям должно хватить и такой функции. А кто захочет, допишет.
Генерируем красивую Google-таблицу из своей программы (используя Google Sheets API v4)