python (стандартно) - вся таблица данных помещена в одну ячейку моих таблиц Google вместо отдельных ячеек - PullRequest
2 голосов
/ 24 апреля 2020

Моя цель - обновить документ Google Sheets, заменив содержимое его первого листа таблицей моих собственных данных (то есть таблицей экземпляров для атрибутов класса). Я пытался использовать модуль gspread для этого, но он не сработал так хорошо: если я запускаю строку

client.open("GoogleSheetName").sheet1.update('A1:R181',Member.display().to_json())

(где Member - мой класс, а display () - мой Метод класса, который просто преобразует мои данные в объект pandas dataFrame.), вся строка Member.display().to_json() помещается в ячейку A1, как будто она никогда не распаковывается и просто остается как одна строка. Если я использую модуль json и дам данные с помощью json.dumps(Member.display().to_dict()), я получаю ту же проблему.

Я также попытался просто изменить данные на Member.display().to_dict(), и в этом случае я получил 'Invalid JSON payload received 'ошибка.

Похоже, что данные должны быть в матричном формате, чтобы они работали, т.е. [[..,..,..][..,..,..]...], поскольку это единственный формат, который работал должным образом в моем случае. Я знаю, что это работает, потому что когда я тестирую API, запуская

client.open("GoogleSheetName").sheet1.update('A1:B2', [[1, 2], [3, 4]])

, каждое число помещается в отдельную ячейку, как требуется. Это формат, который я должен использовать?

Как мне решить эту проблему? Как будто мои данные должны быть отправлены JSON для чтения, но не могут быть строкой, иначе они интерпретируются как один аргумент!

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Если Member.display() является pandas DataFrame, вы можете выполнить следующие действия для обновления листа с помощью gspread:

df = Member.display()
ws = client.open("GoogleSheetName").sheet1
ws.update([df.columns.values.tolist()] + df.values.tolist())

Другие примеры использования gspread с pandas находятся в документах.

Sidenote:

Конечно, вы можете использовать официальный API, как указал Альберто. Все зависит от вашего варианта использования. Google Sheets API - это API более низкого уровня. Очень мощный, но требует немного больше стандартного кода. Это можно увидеть, если сравнить оба примера кода. Это компромисс.

1 голос
/ 24 апреля 2020

Как говорит официальный API Sheets на Метод: spreadsheets.values.append Тело запроса

Тело запроса содержит экземпляр ValueRange.

ValueRange - это JSON, который должен содержать ключ с именем значения , который должен быть массивом массивов. Я сделал следующий пример на основе Python Quickstart , чтобы показать вам, как передать нужные данные в вашу электронную таблицу.

  service = discovery.build('sheets', 'v4', credentials=creds)
    spreadsheet_id = 'YOUR-SHEETS-ID'
    ranges = "A1:A"
    value_render_option = "DIMENSION_UNSPECIFIED"
    value_input_option = "USER_ENTERED"

    df = pd.DataFrame({
        'age':    [ 3,  29],
        'height': [94, 170],
        'weight': [31, 115]
    })

    value_range_body = {
        "values": df.to_numpy().tolist(),
        "majorDimension": "DIMENSION_UNSPECIFIED"
    }

    request = service.spreadsheets().values()\
        .append(spreadsheetId=spreadsheet_id, range=ranges, valueInputOption=value_input_option, body=value_range_body)

    response = request.execute()
    print(response)

Как видите, я использую df.to_numpy().tolist() для преобразования кадра данных pandas в массив NumPy, а затем в обычный список Python.

...