#python #api #google-sheets-api
#python #API #google-sheets-api
Вопрос:
Язык: Python
Я пытаюсь просмотреть каждый «вложенный лист» — или лист — в электронной таблице Google и проанализировать его данные. В конечном итоге это будет использовано для создания локального .csv
файла.
Я пытался использовать как gspread, так и gsheets для решения этой проблемы, но в обоих были ошибки аутентификации, поэтому мне пришлось использовать API напрямую.
Все примеры в API электронных таблиц Google получают все значения из определенного диапазона, как в «получить все из строки A1: A4 на листе Sheet1». Для меня это не выгодно, так как моему скрипту нужно пройти через любое количество листов, которые есть в электронной таблице, я анализирую все данные и заранее не знаю название листа.
Согласно документам, объект листа должен иметь поле «данные», но все мои curr_sheet.get('data')
синтаксические анализы не возвращают None: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#Sheet
Лист Excel, который я пытаюсь проанализировать, выглядит следующим образом: https://i.gyazo.com/62606b2434435d34dd3ba9fbd9825a52.png
sheet = service.spreadsheets()
result=sheet.get(spreadsheetId=SPREADSHEET_ID).execute()
print(result2)
all_sheets = result.get('sheets')
for curr_sheet in all_sheets:
print(curr_sheet)
Мне нужно проанализировать одно значение из определенной строки, а затем сохранить файл как .csv
локальный. Я сузил проблему до итерации по конкретным листам, поэтому буду признателен за любую помощь!
Комментарии:
1. Показал ли мой ответ вам результат, который вы хотите? Не могли бы вы рассказать мне об этом? Это также полезно для меня для изучения. Если это сработает, другие люди, у которых такая же проблема с вами, также могут сформулировать ваш вопрос как вопрос, который можно решить. Если у вас еще есть вопросы к моему ответу, я приношу свои извинения. В то время могу ли я спросить вас о вашей текущей ситуации? Я хотел бы изучить, чтобы решить ваши проблемы.
Ответ №1:
- Вы знаете идентификатор электронной таблицы.
- Вы хотите получить все значения со всех листов в электронной таблице.
- Вы уже использовали API Sheets.
- Sheets API включен в консоли API.
- Вы можете получить токен доступа с помощью процесса OAuth2.
Если я правильно понимаю, как насчет этой модификации. Пожалуйста, подумайте об этом как об одном из нескольких ответов.
Точки модификации:
- Если вы хотите получить данные с помощью метода spreadsheets.get, в вашем случае, пожалуйста, добавьте
sheets/data
в поля likeresult=sheet.get(spreadsheetId=SPREADSHEET_ID, fields='sheets/data').execute()
.
Но я хотел бы предложить следующий поток, потому что значения, полученные с помощью spreadsheets.values.batchGet, более удобочитаемы, чем значения, полученные с помощью метода spreadsheets.get .
- Чтобы получить все имена листов, используйте метод spreadsheets.get .
- Чтобы извлечь все значения из листа, используйте метод spreadsheets.values.batchGet .
Комбинируя оба, можно получить все значения со всех листов в электронной таблице.
Модифицированный скрипт:
sheet = service.spreadsheets()
sheets = sheet.get(spreadsheetId=SPREADSHEET_ID, fields='sheets/properties/title').execute()
ranges = [sheet['properties']['title'] for sheet in sheets['sheets']]
values = sheet.values().batchGet(spreadsheetId=SPREADSHEET_ID, ranges=ranges).execute()
print(values)
Результат:
При запуске вышеупомянутого скрипта возвращаются следующие значения.
{
"spreadsheetId":"###",
"valueRanges":[
{
"range":"Sheet1!A1:Z1000",
"majorDimension":"ROWS",
"values":[["a1","b1","c1"],["a2","b2","c2"],["a3","b3","c3"]]
}
{
"range":"Sheet2!A1:Z1000",
"majorDimension":"ROWS",
"values":[["a1","b1","c1"],["a2","b2","c2"],["a3","b3","c3"]]
}
,
,
,
]
}
["a1","b1","c1"]
это 1-я строка.b1
это столбец «B».
Ссылки:
Если это не тот результат, который вы хотите, я прошу прощения.