You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:21:30