使用gspread调用Google Sheets API添加行时返回400 INVALID_ARGUMENT错误
使用gspread插入行时触发400错误:值无效的排查与解决
问题场景
尝试用gspread向Google表格插入行时,持续收到400响应,提示所有待添加值无效。即使简化代码只插入单个日期字符串(甚至"hello"),错误依旧。已确认表格ID正确(设置inherit_from_before=True时能看到带格式的新行插入),但无法理解简单字符串为何被判定为无效。
出错代码
client = gspread.oauth(credentials_filename="credentials.json") sheet = client.open(constants_manager.SPREADSHEET_FILE_NAME) worksheet = sheet.worksheet(constants_manager.SPREADSHEET_SHEET_NAME) today_date = date.today().strftime("%d/%m/%Y") old_num_rows = len(worksheet.get_all_values()) print(old_num_rows) new_values = [today_date] # for item in macros.values(): # new_values.append(round(item,2)) # print(type(item)) print(new_values) worksheet.insert_rows(new_values, old_num_rows+1)
错误输出
['02/01/2024'] Traceback (most recent call last): File "/home/moorby/Documents/coding_projects/loseit_calorie_weight_data_tracker/main.py", line 63, in <module> main() File "/home/moorby/Documents/coding_projects/loseit_calorie_weight_data_tracker/main.py", line 59, in main worksheet.insert_rows(new_values) File "/home/moorby/.pyenv/versions/loseit_calorie_weight_data_tracker/lib/python3.11/site-packages/gspread/worksheet.py", line 2049, in insert_rows res = self.spreadsheet.values_append(range_label, params, body) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/moorby/.pyenv/versions/loseit_calorie_weight_data_tracker/lib/python3.11/site-packages/gspread/spreadsheet.py", line 141, in values_append r = self.client.request("post", url, params=params, json=body) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/moorby/.pyenv/versions/loseit_calorie_weight_data_tracker/lib/python3.11/site-packages/gspread/client.py", line 93, in request raise APIError(response) gspread.exceptions.APIError: {'code': 400, 'message': 'Invalid value at \'data.values[0]\' (type.googleapis.com/google.protobuf.ListValue), "02/01/2024"', 'status': 'INVALID_ARGUMENT', 'details': [{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'data.values[0]', 'description': 'Invalid value at \'data.values[0]\' (type.googleapis.com/google.protobuf.ListValue), "02/01/2024"'}]}]}
解决思路
问题出在insert_rows的参数格式上:
insert_rows要求传入二维列表:外层列表代表多行数据,每个子列表代表一行的所有单元格值。- 你传入的
[today_date]是一维列表,gspread会把它解析为“一行中的多个单元格”,但单个字符串不是Google Sheets API要求的ListValue类型,因此触发错误。
修正代码
只需将new_values改为二维列表格式:
new_values = [[today_date]] # 外层列表包裹子列表,子列表对应一行的单元格 worksheet.insert_rows(new_values, old_num_rows+1)
如果需要插入多列的行,格式如下:
# 示例:插入包含日期、卡路里、体重的一行 new_values = [[today_date, 1800.5, 75.2]]
如果需要插入多行:
# 示例:插入两行数据 new_values = [ ["02/01/2024", 1800.5, 75.2], ["03/01/2024", 1750.0, 74.9] ]
内容的提问来源于stack exchange,提问作者Mo0rBy
相关产品推荐
相关产品推荐

