如何设置CheckboxGridItem:每列限选一个且问题必填(非每行必填)
解决Google Apps Script中CheckboxGrid必填列而非行的问题
默认的setRequired(true)会强制CheckboxGrid的每行都必须选择答案,这和requireLimitOneResponsePerColumn()规则冲突(行数多于列数时用户根本做不到)。要实现「每列必须选一个、无需每行都选」的需求,得用自定义验证规则替代默认的必填设置,具体实现如下:
代码示例
function createColumnRequiredCheckboxGrid() { // 获取当前活动表单,也可以用FormApp.create("表单名称")新建表单 const form = FormApp.getActiveForm(); // 定义你的行和列内容(行数多于列数) const gridRows = ["选项1", "选项2", "选项3", "选项4", "选项5"]; const gridColumns = ["类别A", "类别B"]; // 创建CheckboxGrid问题 const checkboxGrid = form.addCheckboxGridItem() .setTitle("请为每个类别选择对应的选项") .setRows(gridRows) .setColumns(gridColumns); // 先添加「每列最多选一个」的规则 checkboxGrid.requireLimitOneResponsePerColumn(); // 创建自定义验证:确保每列至少有一个选项被选中 const columnValidation = FormApp.createValidation() .setHelpText("请确保每个类别都选择了对应的选项") .requireCustomFunction(function(response) { // 将响应从「行优先」转成「列优先」的结构 const columnResponses = gridColumns.map((_, colIdx) => gridRows.map((_, rowIdx) => response[rowIdx][colIdx]) ); // 检查每一列是否至少有一个选中项(即数组中包含true) return columnResponses.every(column => column.includes(true)); }); // 为CheckboxGrid应用自定义验证 checkboxGrid.setValidation(columnValidation); }
关键说明
- 保留列限选规则:
requireLimitOneResponsePerColumn()依然生效,确保同一列不会被多选。 - 自定义验证逻辑:通过转置响应数组,把原本按行存储的选中状态改成按列分组,再检查每列是否有至少一个勾选,既实现了「整个问题必填(每列都要有答案)」,又不强制用户每行都选。
- 错误提示自定义:
setHelpText()里的内容会在用户未满足要求时弹出,引导用户修正。
这样设置后,用户只有在每列都选了至少一个选项时才能提交表单,同时不会出现「每行必须选」的强制要求,完美适配行数多于列数的场景。
内容的提问来源于stack exchange,提问作者Fernanda Cabral
相关产品推荐
相关产品推荐

