Как стать автором
Обновить

Комментарии 19

"Вы не можете смотреть видео или открывать фотографии, пока вы офлайн, но вы можете просматривать, редактировать и создавать файлы в оригинальных форматах Гугл-Диск, когда у вас нет соединения с сетью."


Есть какая то возможность получить возможности аналогичные доступным в Google Sheets API будучи оффлайн?

Эта возможность работает за счёт расширения «Google Диск» в Google Chrome (на ПК и Mac). Либо засчёт специальных приложений (на Android и iOS). API для взаимодействия с этими вещами я не нашёл (хотя не исключаю возможности, что оно может существовать).
Но!
Я не очень представляю use case. На мой взгляд, Google Sheets API v4 вполне предоставляет нужную Вам возможность: вы можете накопить пачку запросов к API, а потом при наличии интернета исполнить их с помощью функций spreadsheets.batchUpdate и spreadsheets.values.batchUpdate.

Или Вы хотите работать, используя API, с теми документами, с которыми Вы в offline-режиме работаете в расширении/приложении?

use case стандартный — генерация отчетов для печати по заданному шаблону, только не в pdf или xls, а в документы Google Sheets

Буквально пару дней назад занимался похожей задачей (генерил SQL код на добавление записей из SpreadSheet), но вместо OAuth и сервисного аккаунта использовал API key, так проще получить доступ ко всем документам пользователя.
Справедливое замечание.
Но моя статья — это туториал, поэтому я счёл достаточным упомянуть только один из способов. Упомянул тот, который использовал сам для генерации отчётов telegram-ботом для тайм-менеджмента. А ему не требуется доступ к документам пользователя, он лишь новые клепает :)
Да это не особо замечание, просто дополнение.
В сети не так много хороших примеров с Google sheet/drive API, поэтому большинство кода я писал методом проб и ошибок по дефолтному мануалу с описаниями запросов Google API.

Кстати я не пробовал и не особенно уверен, что без каких-то дополнительных действий смогу создать документ с помощью API Key доступный моему аккаунту.

Генерация отчетов с записью их в GDrive — хорошая идея. Интересно можно ли там еще и добавленных пользователей оповестит о обновлении, надо будет попробовать.

И еще. С помощью GSpread я так и не смог ничего сделать, не удалось заставить его видеть хоть какие-то документы.
Мне удалось заполнять данные в таблицу при помощи gspread. Для этого я вручную выдавал доступ к таблице сервис-аккаунту. Но из-за того, что gspread не умеет настраивать оформление, результат меня не устроил.
В итоге пришлось разбираться в Sheets API v4, тоже методом проб и ошибок. Совершенно согласен, что в сети очень не хватает примеров. Именно поэтому я решил написать статью, чтобы другие не так долго мучались)

Насчёт оповещений: если проверите, отпишитесь что да как.
А как Вы получили доступ к gdrive API через ключ? Я всегда думал, что доступ к нему доступен только через oauth?
> доступ ко *всем документам* пользователя
gdrive API и gsheets API — разные вещи. Если есть ключ для gsheets API, то нельзя получить список всех документов пользователя. Можно только оперировать с конкретным документом по его id.
Но я особо не ковырял, могу ошибаться.
Я как раз обращался к документу по 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 я нигде не использовал.

А почему не делать всё то же самое только через google apps script?
Поясните, пожалуйста, почему Вы считаете, что так будет лучше и удобнее. И какой-нибудь пример тоже не помешал бы.
Спасибо за пост. Очень полезный. Правда у меня код выдает следующую ошибку:

«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, чем полноценной обёрткой. Так что на первом этапе, я думаю, людям должно хватить и такой функции. А кто захочет, допишет.

Про python3 — не заметил, потому что файл в последнюю очередь копировал. Тогда, вероятно, какие-то из библиотек уже deprecated.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации