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

Язык: Python

Я пытаюсь просмотреть каждую "подстроку" - или Лист - в таблице Google и проанализировать ее данные.В конечном итоге это будет использовано для создания локального .csv файла.

Я пытался использовать оба gspread и gsheets для решения этой проблемы, но оба имели аутентификациюошибки, поэтому мне пришлось использовать API напрямую.


Все примеры в API таблиц Google получают все значения из определенного диапазона, как в "получить все из строки A1: A4 влист Sheet1 ".Это не выгодно для меня, так как мой сценарий должен пройти через любое количество листов в электронной таблице, я анализирую все данные и заранее не знаю имени листа.

СогласноДокументы, объект Sheet должен иметь поле данных, но все мои 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 Ответ

0 голосов
/ 11 апреля 2019
  • Вы знаете идентификатор электронной таблицы.
  • Вы хотите получить все значения из всех листов электронной таблицы.
  • Вы уже использовали API листов.
    • Sheets API включен на консоли API.
    • Вы можете получить токен доступа с помощью процесса OAuth2.

Если мое понимание вернокак насчет этой модификации.Пожалуйста, подумайте об этом, как об одном из нескольких ответов.

Точки модификации:

  • Если вы хотите получить данные, используя метод spreadsheets.get, в вашем случае добавьте sheets/dataв поля типа 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".

Ссылки:

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

...