TypeError: индексы срезов должны быть целыми или None или иметь метод __index__ - Google Sheets API - PullRequest
0 голосов
/ 25 сентября 2018

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

TypeError: индексы слайсов должны быть целыми числами или None или иметь __index__ метод

Это то, что пытается пройти из списка в Google Sheet:

['2018-09-24', '6.16% to 35.89%', '6.99% to 24.99%', '6.99% to 24.99%']

Этот код ниже выполняет следующие действия:

  1. Удаляет несколько сайтов
  2. Сохраняет информацию в фрейме данных pandas
  3. Преобразование этого фрейма данных в список
  4. Передайте этот список через API Google Sheets и добавьте его в лист.( Ошибка чаще всего возникает здесь, потому что именно здесь список читается и пытается быть переданным в Google Sheet )

Код:

df = pd.DataFrame({'Date':[], 'Link':[], 'APR Rate':[]})
#cycle through links in array until it finds APR rates/fixed or variable using regex
for link in plcompetitors:
    cdate = datetime.date.today()
    sdate = str(cdate)
    l = r.get(link)
    l.encoding = 'utf-8'
    data = l.text
    soup = bs(data, 'html.parser')
    paragraph = soup.find_all(text=re.compile('[0-9]%'))
    for n in paragraph:
        matches = re.findall('(?i)\d+(?:\.\d+)?%\s*(?:to|-)\s*\d+(?:\.\d+)?%', n.string)
        try:
            irate = str(matches[0])
            df2 = pd.DataFrame({'Date':[cdate], 'Link':[link], 'APR Rate':[irate]})
            df = pd.concat([df, df2], join="inner")
            df.drop_duplicates(subset='Link', keep='first', inplace=True)
            s1 = df['APR Rate'].values.tolist()
            s1.insert(0, sdate)
        except IndexError:
            pass
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
def main():
    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('sheets', 'v4', http=creds.authorize(Http()))

    spreadsheet_id = '1vk5uZQ-nJgTURH6P9Gq0QyyixsMN8e8hionS_ucko2g'
    range_ = "'Personal Loan'!B1:D"
    value_input_option = 'RAW'
    value_range_body = {
        "majorDimensions": "ROWS"
        ["values":
            s1
        ]
    }
    request = service.spreadsheets().values().update(spreadsheetId=spreadsheet_id, range=range_,
                                                 valueInputOption=value_input_option, body=value_range_body)
    response = request.execute()
    pprint(response)

if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 29 сентября 2018

Это была комбинация нескольких вещей, которые были неправильными.Определенно ценный опыт обучения.

Эти 3 строки обновили полезную нагрузку JSON, чтобы API Google Sheets мог ее прочитать:

u1 = ",".join(item for item in s1)
value = u1.strip().split(",")
value.insert(0,sdate)

Я в основном взял s1 сверху и превратил его в список, разделенный запятыми, и вставилдату, которую я хотел отправить в электронную таблицу.

Затем мне пришлось удалить и заново аутентифицировать файл token.json, запустив образец quickstart.py из документации API Google Sheets.Затем мне пришлось обновить переменные для тела запроса, приведенного ниже, и заставить его работать:

range_ = "A1:D1"
value_input_option = 'RAW'
insert_data_option = 'INSERT_ROWS'
value_range_body = {
     "majorDimension": "ROWS",
     "values": [value],
}
request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id,
                                                 range=range_,
                                                 valueInputOption=value_input_option,
                                                 insertDataOption=insert_data_option,
                                                 body=value_range_body)

Моим главным препятствием было понимание форматирования JSON, а API Sheets немного сбивал с толку.Надеюсь, этот пост поможет прояснить ситуацию с кем-то еще.

...