如何使用 Google Sheets API 在一行中更新行?

How to update row in one line using Google Sheets API?

问题描述:我想创建一个程序,可以在一行(即一个API请求)。

这是在 文档 中看到的与我的问题相关的内容:

# Updates A2 and A3 with values 42 and 43
# Note that update range can be bigger than values array
worksheet.update('A2:B4', [[42], [43]])

这就是我试图将它实现到 我的程序:

sheet.update(f'A{rowNumber + 1}:H{rowNumber + 1}', [[str(el)] for el in list_of_auctions[rowNumber]])

这是打印 [[str(el)] for el in list_of_auctions[rowNumber]] 的样子:

[['068222bb-c251-47ad-8c2a-e7ad7bad2f60'], ['urlLink'], ['100'], ['250'], ['20'], [''], [' ,'], ['0']]

据我所知,这里的一切都是根据文档,但是我得到这个 output:

error from callback <bound method SocketHandler.handle_message of <amino.socket.SocketHandler object at 0x00000196F8C46070>>: {'code': 400, 'message': "Requested writing within range ['Sheet1'!A1:H1], but tried writing to row [2]", 'status': 'INVALID_ARGUMENT'}
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\websocket\_app.py", line 344, in _callback
    callback(*args)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 80, in handle_message
    self.client.handle_socket_message(data)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\client.py", line 345, in handle_socket_message
    return self.callbacks.resolve(data)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 204, in resolve
    return self.methods.get(data["t"], self.default)(data)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 192, in _resolve_chat_message
    return self.chat_methods.get(key, self.default)(data)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 221, in on_text_message
    def on_text_message(self, data): self.call(getframe(0).f_code.co_name, objects.Event(data["o"]).Event)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 209, in call
    handler(data)
  File "C:\Users\Desktop\python bots\auction-bot\bot.py", line 315, in on_text_message
    bid_rub(link, data.message.author.nickname, data.message.author.userId, id, linkto)
  File "C:\Users\Desktop\python bots\auction-bot\bot.py", line 162, in bid_rub
    sheet.update(f'A{ifExisting + 1}:H{ifExisting + 1}', [[str(el)] for el in list_of_auctions[ifExisting]])
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\gspread\utils.py", line 592, in wrapper
    return f(*args, **kwargs)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\gspread\models.py", line 1096, in update
    response = self.spreadsheet.values_update(
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\gspread\models.py", line 235, in values_update
    r = self.client.request('put', url, params=params, json=body)
  File "C:\Users\Desktop\ИНФА\pycharm\venv\lib\site-packages\gspread\client.py", line 73, in request
    raise APIError(response)

问题:我想不通这可能是什么问题,我花了很长时间试图解决这个问题。

您好,您可以尝试以下方法:

def gs_writer(sheet_name,dataframe,sheet_url,boolean,row,col):

    import gspread
    from gspread_dataframe import get_as_dataframe, set_with_dataframe
    import google.oauth2
    from oauth2client.service_account import ServiceAccountCredentials
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name('gsheet_credentials.json', scope)
    gc = gspread.authorize(credentials)
    sht2 = gc.open_by_url(sheet_url)
    sht = sht2.worksheet(sheet_name)
    set_with_dataframe(sht,dataframe,resize = boolean,row=row,col=col)

现在定义此函数后,您可以简单地在数据框中获取所需数据,并在要打印的位置输入行号和列号,如下所示:

gs_writer("sheet_name",df,sheet_url,False,1,1)

这应该从 A1 开始写入您的数据

该错误表明您尝试写入的数据的行数多于范围内的行数。列表中的每个列表代表电子表格中的单行数据。

在你的例子中:

[['068222bb-c251-47ad-8c2a-e7ad7bad2f60'], ['urlLink'], ['100'], ['250'], ['20'], [''], [' ,'], ['0']]

代表8行数据

row 1 = ['068222bb-c251-47ad-8c2a-e7ad7bad2f60']
row 2 = ['urlLink']
row 3 = ['100']
row 4 = ['250']
row 5 = ['20']
row 6 = ['']
row 7 = [' ,']
row 8 = ['0']

如果要写入单行,格式应该是:

[['068222bb-c251-47ad-8c2a-e7ad7bad2f60', 'urlLink', '100', '250', '20', '', ' ,', '0']]

要解决这个问题,请删除 [str(el)] 中的 [] 并在 str(el) for el in list_of_auctions[rowNumber] 中添加另一个 [] 或使用itertools.chain() 在列表中创建单个列表

您的代码应如下所示:

sheet.update(f'A{rowNumber + 1}:H{rowNumber + 1}', [[str(el) for el in list_of_auctions[rowNumber]]])

or 

import itertools
sheet.update(f'A{rowNumber + 1}:H{rowNumber + 1}', [list(itertools.chain(str(el) for el in list_of_auctions[rowNumber]))]

参考:

Writing to a single range

Python itertools