我正在努力使用 python 中的 gspread 模块将下拉菜单插入到 Google 电子表格中。
这个问题解释了如何在电子表格中获取下拉菜单:
但是,即使我更改 startColumnIndex 和 endColumnIndex,下拉菜单也仅显示在一个单元格中。
我尝试过这样的事情:
data = sheet.get_all_values()
values = [request if e[3] != "" else "" for e in data]
cells = sheet.range("C1:C%d" % len(values))
for i, e in enumerate(cells):
e.value = values[i]
sheet.update_cells(cells)
其中 request 是下拉菜单。因此,如果第三列不为空,我想在第四列中插入一个下拉菜单,否则我不想插入任何内容。 但到目前为止,只有当请求是常规字符串而不是我想要的下拉格式单元格时,这才有效。
似乎将batch_update模块与请求结合使用而不是循环进行批量处理,但我似乎无法让它同时适用于多个单元格(最好是整列)。
谢谢您的帮助!
我相信您的目标如下。
在这种情况下,下面的示例脚本怎么样?
# Please use your gspread client.
spreadsheetId = "###" # Please set your Spreadsheet ID.
sheetName = "Sheet1" # Please set sheet name.
dropdownOptions = [1, 2, 3, 4, 5] # This is from your showing image.
spreadsheet = client.open_by_key(spreadsheetId)
sheet = spreadsheet.worksheet(sheetName)
sheetId = sheet.id
v = [{"userEnteredValue": str(e)} for e in dropdownOptions]
values = sheet.get_all_values()[1:]
requests = [
{
"setDataValidation": {
"range": {
"sheetId": sheetId,
"startRowIndex": i + 1,
"endRowIndex": i + 2,
"startColumnIndex": 3,
"endColumnIndex": 4,
},
"rule": {
"showCustomUi": True,
"strict": True,
"condition": {"values": v, "type": "ONE_OF_LIST"},
},
}
}
for i, r in enumerate(values)
if r[2] != ""
]
spreadsheet.batch_update({"requests": requests})
如果您有超过 500 个项目,您将需要定义一个范围而不是值列表。您可以使用以下实用函数来完成此任务。了解实用函数
a1_range_to_grid_range
的使用,让创建 API 所需的范围字典时变得轻松:
import gspread
gc = gspread.service_account(filename='key.json')
workbook = gc.open_by_key(current_global_sheet_id)
def create_dropdown(workbook, placement_sheet_name, range_sheet_name, sheet_range, placement_cell):
'''
workbook: gspread workbook object
placement_sheet_name: sheet name where dropdown will be placed
range_sheet_name: sheet name where dropdown values are located
sheet_range: range of dropdown values
placement_cell: cell where dropdown will be placed
'''
grid_range = gspread.utils.a1_range_to_grid_range(placement_cell)
## create dropdown with SKUS
worksheet = workbook.worksheet(placement_sheet_name)
sheetId = worksheet.id
grid_range['sheetId'] = sheetId
reqs = [
{
"setDataValidation": {
"range": grid_range,
"rule": {
"showCustomUi": True,
"strict": True,
"condition": {"values": [{"userEnteredValue": f"='{range_sheet_name}'!{sheet_range}"}], "type": "ONE_OF_RANGE"},
},
}
}
]
workbook.batch_update({"requests": reqs})
create_dropdown(workbook, 'Charts', 'Data', 'B1:B', 'B3')