如何在Google Forms中实现游戏规则联动限制并统一表格列
解决方案
步骤1:搭建基础Google Form结构
创建新的Google Form,添加以下3个问题:
- 姓名:类型设为「短答案」,标题为「姓名」
- 所选游戏:类型设为「下拉菜单」,添加选项:
Game 1、Game 2、Game 3 - 对应规则:类型设为「复选框」,临时添加所有规则选项:
Rule 1、Rule 2、Rule 3、Rule 4、Rule 5、Rule 6(后续将用脚本动态控制)
步骤2:编写Apps Script实现规则限制与列映射
打开表单的脚本编辑器(点击右上角「扩展程序」→「Apps Script」),替换默认代码为以下内容:
// 定义游戏与对应规则的映射关系 const GAME_RULE_MAP = { "Game 1": ["Rule 1", "Rule 2", "Rule 3"], "Game 2": ["Rule 1", "Rule 3", "Rule 5"], "Game 3": ["Rule 2", "Rule 4", "Rule 6"] }; // 提交验证:检查规则是否匹配所选游戏,无效提交将被删除 function validateFormSubmission(e) { const formResponse = e.response; const itemResponses = formResponse.getItemResponses(); let selectedGame = ""; let selectedRules = []; // 提取用户的游戏和规则选择 for (const itemResponse of itemResponses) { const title = itemResponse.getItem().getTitle(); if (title === "所选游戏") selectedGame = itemResponse.getResponse(); else if (title === "对应规则") selectedRules = itemResponse.getResponse(); } const allowedRules = GAME_RULE_MAP[selectedGame]; if (!allowedRules) return; // 检查无效规则 const invalidRules = selectedRules.filter(rule => !allowedRules.includes(rule)); if (invalidRules.length > 0) { formResponse.deleteResponse(); // 给提交者发送提醒(可选,需开启表单收集邮箱权限) const responderEmail = formResponse.getRespondentEmail(); if (responderEmail) { GmailApp.sendEmail( responderEmail, "表单提交验证失败", `你选择的规则${invalidRules.join(", ")}不属于${selectedGame}的有效规则,请重新填写。` ); } } } // 处理Sheet响应:将规则映射到对应列 function formatSheetResponses() { const form = FormApp.getActiveForm(); const sheetId = form.getDestinationId(); if (!sheetId) return; const sheet = SpreadsheetApp.openById(sheetId).getSheets()[0]; const data = sheet.getDataRange().getValues(); const headerRow = data[0]; // 自动添加规则列(若表头不存在) const allRules = ["Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6"]; allRules.forEach(rule => { if (!headerRow.includes(rule)) { sheet.insertColumnAfter(headerRow.length); sheet.getRange(1, headerRow.length + 1).setValue(rule); } }); // 填充规则列内容 for (let i = 1; i < data.length; i++) { const row = data[i]; const gameCol = headerRow.indexOf("所选游戏"); const ruleCol = headerRow.indexOf("对应规则"); if (gameCol === -1 || ruleCol === -1) continue; const selectedRules = row[ruleCol].split(", "); allRules.forEach(rule => { const targetCol = headerRow.indexOf(rule) + 1; sheet.getRange(i + 1, targetCol).setValue(selectedRules.includes(rule) ? "是" : "否"); }); } }
步骤3:配置触发器
- 在脚本编辑器左侧点击「触发器」图标→「添加触发器」
- 为
validateFormSubmission配置:- 选择事件类型:「表单提交」
- 事件来源:「表单」
- 为
formatSheetResponses配置(可选,也可手动运行):- 选择事件类型:「表单提交」
- 事件来源:「表单」
步骤4:验证效果
- 提交不符合游戏规则的选项时,响应会被自动删除(若填写邮箱将收到提醒)
- 关联的Google Sheet会自动生成对应规则的列,每个规则的选择状态将在对应列标记「是」或「否」
替代方案(实时限制选项)
若希望填写表单时直接只显示对应游戏的规则,可采用页面跳转方式(无需脚本):
- 添加3个新页面,分别命名为「Game 1规则」「Game 2规则」「Game 3规则」
- 每个页面只添加对应游戏的规则复选框
- 设置「所选游戏」下拉菜单的跳转规则:选择对应游戏跳转到对应规则页面
- 在所有规则页面添加「提交」按钮
- 运行
formatSheetResponses脚本,将不同页面的规则响应合并到Sheet的对应列中
内容的提问来源于stack exchange,提问作者Jamie Newton
相关产品推荐
相关产品推荐

