使用 gspread / Google Spread API 将下拉菜单(嵌套列表)添加到 Google Spreadsheat 到整个列

问题描述 投票:0回答:2

我正在努力使用 python 中的 gspread 模块将下拉菜单插入到 Google 电子表格中。

这个问题解释了如何在电子表格中获取下拉菜单:

如何使用gspread添加嵌套列表?

但是,即使我更改 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 是下拉菜单。因此,如果第三列不为空,我想在第四列中插入一个下拉菜单,否则我不想插入任何内容。 但到目前为止,只有当请求是常规字符串而不是我想要的下拉格式单元格时,这才有效。

This picture shows what I want. You can see that row 1, 3, and 4 have a dropdown list in the fourth column (as the third column is not empy) while row 2 doesn't have anything.

似乎将batch_update模块与请求结合使用而不是循环进行批量处理,但我似乎无法让它同时适用于多个单元格(最好是整列)。

谢谢您的帮助!

python google-sheets google-sheets-api gspread
2个回答
2
投票

我相信您的目标如下。

  • 当“C”列不为空时,您想在“D”列插入下拉列表。
  • 您想使用 python 的 gspread 来实现这一点。

在这种情况下,下面的示例脚本怎么样?

示例脚本:

# 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})
  • 运行此脚本时,将在“C”列中检索和搜索所有值。当“C”列为空时,下拉列表将插入“D”列。

注:

  • 从您显示的图像来看,它假设您的电子表格具有第一个标题行。请注意这一点。

参考资料:


0
投票

如果您有超过 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')
© www.soinside.com 2019 - 2024. All rights reserved.