如何使用gspread对Google Sheets工作簿内的工作表自定义排序
解决方法
你遇到的排序异常是默认字符串字典序导致的:字符1的ASCII码小于2,因此week 10会排在week 2前面,需要改用自然排序逻辑提取表名中的数字做整数比较。gspread没有封装直接重排工作表的方法,但可以调用其封装的Google Sheets API原生batchUpdate接口实现顺序调整。
完整实现代码
import gspread from oauth2client.service_account import ServiceAccountCredentials GSHEETS_SCOPES = ["https://www.googleapis.com/auth/spreadsheets"] CLIENT_SECRET_GOOGLE_SHEETS = r"client_secret_google_sheets.json" creds = ServiceAccountCredentials.from_json_keyfile_name(CLIENT_SECRET_GOOGLE_SHEETS, GSHEETS_SCOPES) client = gspread.authorize(creds) sheet = client.open("my_worksheet") worksheet_list = sheet.worksheets() # 自定义排序规则 def sort_key(worksheet): title = worksheet.title # Documentation表固定排在最前 if title == "Documentation": return (0, 0) # 匹配week X格式的表,提取周数转整数排序 if title.startswith("week "): try: week_num = int(title.split(" ")[1]) return (1, week_num) except (IndexError, ValueError): pass # 其他不符合规则的表排在最后,按名称字典序排序 return (2, title) # 对工作表列表做自然排序 sorted_worksheets = sorted(worksheet_list, key=sort_key) # 生成重排请求 requests = [] for index, ws in enumerate(sorted_worksheets): requests.append({ "updateSheetProperties": { "properties": { "sheetId": ws.id, "index": index }, "fields": "index" } }) # 提交请求,完成工作表重排 sheet.batch_update({"requests": requests})
补充说明
如果有其他需要固定排序优先级的工作表,可直接在sort_key函数中补充对应规则即可,执行batch_update后工作簿的工作表顺序会实时同步。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

