Добавлять строки в Google Sheets, используя gspread или googleapiclient - PullRequest
1 голос
/ 22 января 2020

Задача: У меня есть фрейм данных, и я хотел бы добавить эти данные в Google Sheet. Лист имеет те же столбцы, что и DF, и содержит существующие данные, которые я не хочу перезаписывать, а просто добавляю строки в конец листа, используя значения из DF.

Пробовал до сих пор:

  1. Я следил за документацией по golid, используя этот код:
    import json
    df2.to_json(orient = 'columns')
    values = df2.to_json(orient = 'columns')
    wks.append_row (values, value_input_option='USER_ENTERED')

Результат : APIError: {"error": {"code": 400, "message": "Недопустимое значение в 'data.values ​​[0]' (type.googleapis.com/google.protobuf.ListValue),

Я следовал документации по справочнику API Google: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append
!pip install --upgrade google-api-python-client

from pprint import pprint
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/drive.file',
        'https://www.googleapis.com/auth/spreadsheets']

credentials = ServiceAccountCredentials.from_json_keyfile_name('NAME.json', scope)

gc = gspread.authorize(credentials)

wks = gc.open("SHEETNAME").sheet1

service = discovery.build(wks,'v1', credentials)

spreadsheet_id = 'MYID'

value_input_option = INSERT_ROWS 

values = df2.to_json(orient = 'columns')

insert_data_option = values 

request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=range_, valueInputOption=value_input_option, insertDataOption=insert_data_option, body=value_range_body)
response = request.execute()

pprint(response)

Результат: AttributeError: у объекта 'ServiceAccountCredentials' нет атрибута 'request'

Вопрос: Является ли любое из этих решений правильным подходом и как я могу исправить ошибки? Или есть совершенно другой вариант, который намного проще?

Спасибо!

1 Ответ

1 голос
/ 23 января 2020
  • Вы хотите добавить значения df2 в таблицу Google.
  • Вы хотите добиться этого, используя gspread с учетной записью Сервиса.
  • Вы уже смогли получить и поместить значения для Google Spreadsheet, используя Sheets API с учетной записью службы.

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

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

  • В вашем случае, как насчет использования df2.values.tolist() вместо df2.to_json(orient = 'columns')? Таким образом, значения преобразуются в двумерный массив.
  • Если в значениях df2 есть несколько строк, я рекомендую использовать метод values_append вместо append_row. Потому что append_row используется для одномерного массива. В этом случае, когда используются значения нескольких строк, append_row необходимо использовать в l oop. Когда values_append используется для значений нескольких строк, значения могут быть помещены одним вызовом API.

Модифицированный скрипт:

Когда ваш скрипт модифицирован, пожалуйста, измените как

spreadsheetId = '###'  # Please set the Spreadsheet ID.
sheetName = 'Sheet1'  # Please set the sheet name.

client = gspread.authorize(credentials)
sh = client.open_by_key(spreadsheetId)
df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']})  # This is a sample value.
values = df2.values.tolist()
sh.values_append(sheetName, {'valueInputOption': 'USER_ENTERED'}, {'values': values})
  • df2 = pd.DataFrame({'col1': ['a1', 'a2', 'a3'], 'col2': ['b1', 'b2', 'b3']}) - примерное значение. Когда это используется, значения добавляются к листу.

Ссылки:

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

...