如何提取Google Sheets指定列含特定字符的对应行数据
解决方案
原有代码问题
之前的代码逻辑是定位第17列(Q列)首个空值所在行,仅读取单行列B的内容,只能拿到单行数据,无法实现多条件行筛选。
原有实现代码:
gc = gspread.authorize(credentials) def grab_available_row(wks): str_list = list(filter(None, wks.col_values(17))) return str(len(str_list)+1) wks = gc.open("test").worksheet("Logs") grab_row = grab_available_row(wks) try: GrabRequestTest = wks.acell("B{}".format(grab_row)).value except: pass try: print(GrabRequestTest) ctypes.windll.user32.MessageBoxW(0, "DONE!!!", "DONE!!!", 1) sys.exit() except: pass
目标需求
- 筛选
Logs工作表中第17列包含特定字符(示例为X)的所有行 - 提取符合条件行的全部单元格值,过滤不符合条件的行
- 输出的结构化数据可直接用于后续邮件合并批量生成docx的流程
可直接运行的实现代码
import gspread # 如果需要保留弹窗逻辑就导入对应的库,不需要可以删掉 # import ctypes # import sys # 保持原有的授权逻辑即可 gc = gspread.authorize(credentials) wks = gc.open("test").worksheet("Logs") # 筛选配置,可根据实际需求修改 FILTER_COLUMN = 17 # 要筛选的列号,第17列对应Q列 MATCH_KEYWORD = "X" # 要匹配的特定字符 def filter_rows_by_col(worksheet, filter_col, keyword): # 一次性拉取全表所有数据,比逐单元格调用API效率高很多,避免触发频率限制 all_table_data = worksheet.get_all_values() matched_rows = [] for row in all_table_data: # 跳过列数不足的异常行,防止索引报错 if len(row) < filter_col: continue # 匹配规则:单元格内容包含关键词即命中 # 如果需要完全相等才命中,把判断条件改成 row[filter_col-1] == keyword 即可 if keyword in row[filter_col - 1]: matched_rows.append(row) return matched_rows if __name__ == "__main__": result = filter_rows_by_col(wks, FILTER_COLUMN, MATCH_KEYWORD) # 逐行打印匹配到的结果 for index, row_data in enumerate(result, 1): print(f"匹配行{index}数据:{row_data}") # result就是所有符合条件的行数据,二维列表格式,每个子元素对应一行的所有列值 # 后续直接把result传入邮件合并逻辑即可 # 原有完成弹窗可按需保留 # ctypes.windll.user32.MessageBoxW(0, f"筛选完成,共找到{len(result)}条符合条件的记录", "处理完成", 1)
注意事项
- gspread返回的行数据是Python列表,下标从0开始计数,和表格从1开始的列号差1位,因此取第17列值时需要用
row[16],代码里已经做了对应偏移处理 - 全量拉取数据的方式比逐行逐单元格调用API快10~100倍,针对行数较多的表格也能快速处理
- 如果需要支持不区分大小写匹配,可以把判断条件改成
keyword.lower() in row[filter_col-1].lower()
内容的提问来源于stack exchange,提问作者nty51
相关产品推荐
相关产品推荐

