Как мне итеративно анализировать данные из каждого «вложенного листа» в электронной таблице Google, используя их API?

#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 в поля like result=sheet.get(spreadsheetId=SPREADSHEET_ID, fields='sheets/data').execute() .

Но я хотел бы предложить следующий поток, потому что значения, полученные с помощью spreadsheets.values.batchGet, более удобочитаемы, чем значения, полученные с помощью метода spreadsheets.get .

  1. Чтобы получить все имена листов, используйте метод spreadsheets.get .
  2. Чтобы извлечь все значения из листа, используйте метод 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».

Ссылки:

Если это не тот результат, который вы хотите, я прошу прощения.