Python基于gspread匹配商品名更新Google Sheet对应列数据问题
问题根源
你现有代码无法实现预期逻辑有两个直接原因:
- 未匹配到商品时返回的空列表长度只有2(
["", ""]),但你需要填充Qty、Price、Store、Location、Stock共5列,长度不匹配直接导致列错位、数据写入不全 - 用csv.reader按索引取值,一旦CSV列顺序变动就会写错数据,且没有处理商品名前后带空格导致的匹配失败问题
修复后代码
import csv import gspread # 初始化谷歌表客户端 client = gspread.service_account_from_dict(credentials) sheet_name = "Sheet1" csv_item_dict = {} # 读取CSV构建商品映射,key为商品名,value为按顺序排列的5个待写入字段 with open('data.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: item_name = row['Item Name'].strip() csv_item_dict[item_name] = [ row['Qty'], row['Price'], row['Store'], row['Location'], row['Stock'] ] spreadsheet = client.open("CSV-to-Google-Sheet") sheet = spreadsheet.worksheet(sheet_name) # 读取表格现有数据 all_data = sheet.get_all_values() existing_rows = all_data[1:] to_update = [] existed_items = set() # 逐行匹配CSV数据 for row in existing_rows: current_item = row[0].strip() existed_items.add(current_item) # 匹配到就取对应字段,没匹配到返回5个空值,保证每行长度和待写入列数一致 to_update.append(csv_item_dict.get(current_item, [""]*5)) # 可选功能:自动追加CSV中存在、但表格里没有的新商品,不需要就删掉下面这段 # new_rows = [] # for item, fields in csv_item_dict.items(): # if item not in existed_items: # new_rows.append([item] + fields) # if new_rows: # sheet.append_rows(new_rows, value_input_option="USER_ENTERED") # 从B2开始写入,5列数据刚好覆盖B-F列(Qty到Stock) sheet.update("B2", to_update, value_input_option="USER_ENTERED")
关键改动说明
- 改用
csv.DictReader按表头名取值,不会因为CSV列顺序调整读错数据 - 未匹配到商品时生成长度为5的空值列表,和待写入列数完全对齐,不会出现列错位
- 对商品名做首尾去空格处理,避免单元格里多打空格导致匹配失效
- 写入范围和数据长度完全匹配:从B2开始写5列,刚好对应Qty到Stock的所有目标列
- 可选的新增商品逻辑如果不需要直接注释删除即可,不影响原有匹配更新功能
内容的提问来源于stack exchange,提问作者Demotry
相关产品推荐
相关产品推荐

