TypeError: slice indices must be integers or None or have an __index__ method - Google Sheets API

TypeError: slice indices must be integers or None or have an __index__ method - Google Sheets API

我正在编写一个脚本,将列表传递到 Google Sheet 中,以附加到已创建的 sheet 中。我已经 运行 来自 Google Sheets API 文档 here 的示例代码。我的大部分代码对我来说都有意义(见下文),但我没有使用过 JSON 文件格式,我认为我格式化要附加的行的方式是触发错误的原因:

TypeError: slice indices must be integers or None or have an __index__ method

这是试图从列表传递到 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. 通过 Google Sheet 传递该列表 API 并将其附加到 sheet。 (错误大部分是在这里引起的,因为这是读取列表并试图将其传递到 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()

这是几个错误的组合。绝对是宝贵的学习经验。

这 3 行更新了 JSON 有效负载,以便 Google 工作表 API 可以读取它:

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

我基本上是从上面获取 s1 并将其变成一个逗号分隔的列表,然后插入我想要发送到电子表格的日期。

然后我不得不通过 运行 Google 表格 API 文档中的 quickstart.py 示例删除并重新验证 token.json 文件。然后我必须更新下面请求主体的变量并让它工作:

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 有点混乱。希望这个 post 也能帮助其他人消除一些困惑。