You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:配置触发器

  1. 在脚本编辑器左侧点击「触发器」图标→「添加触发器」
  2. 为validateFormSubmission配置:
    • 选择事件类型:「表单提交」
    • 事件来源:「表单」
  3. 为formatSheetResponses配置(可选,也可手动运行):
    • 选择事件类型:「表单提交」
    • 事件来源:「表单」

步骤4:验证效果

  • 提交不符合游戏规则的选项时,响应会被自动删除(若填写邮箱将收到提醒)
  • 关联的Google Sheet会自动生成对应规则的列,每个规则的选择状态将在对应列标记「是」或「否」

替代方案(实时限制选项)

若希望填写表单时直接只显示对应游戏的规则,可采用页面跳转方式(无需脚本):

  1. 添加3个新页面,分别命名为「Game 1规则」「Game 2规则」「Game 3规则」
  2. 每个页面只添加对应游戏的规则复选框
  3. 设置「所选游戏」下拉菜单的跳转规则:选择对应游戏跳转到对应规则页面
  4. 在所有规则页面添加「提交」按钮
  5. 运行formatSheetResponses脚本,将不同页面的规则响应合并到Sheet的对应列中

内容的提问来源于stack exchange,提问作者Jamie Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:28:12