如何通过Google Apps Script实现Google Form每次打开随机加载5个问题且避免中途变更?
解决Google Form随机问题不干扰正在填写用户的方案
核心问题在于定时修改原表单会影响已加载页面的用户,所以得彻底换掉定时更新的思路,改为给每个访问者生成专属的临时表单,具体步骤如下:
1. 准备工作
- 整理好你的问题电子表格,确保每行是一个问题(如果是选择题,第一列放问题文本,后续列放对应选项)
- 创建一个空白Google Form作为模板(无需添加任何问题,脚本会动态生成)
2. 编写Web App脚本
打开Google Apps Script编辑器,替换成以下代码:
function doGet(e) { // 替换成你的电子表格ID和问题所在工作表名称 const ssId = "你的电子表格ID"; const questionSheetName = "问题表"; // 读取所有问题数据,跳过表头行 const ss = SpreadsheetApp.openById(ssId); const sheet = ss.getSheetByName(questionSheetName); const allQuestions = sheet.getDataRange().getValues().slice(1); // 随机打乱问题列表并选取5个 const shuffledQuestions = allQuestions.sort(() => Math.random() - 0.5); const selected5 = shuffledQuestions.slice(0, 5); // 替换成你的模板表单ID const templateFormId = "你的模板表单ID"; // 复制模板生成临时表单,用时间戳命名避免重复 const tempForm = FormApp.openById(templateFormId).copy(`临时问卷_${Date.now()}`); // 清空模板里的默认内容(如果有) tempForm.getItems().forEach(item => tempForm.deleteItem(item)); // 把选中的问题添加到临时表单(这里以选择题为例,其他类型自行调整) selected5.forEach(q => { const mcItem = tempForm.addMultipleChoiceItem(); mcItem.setTitle(q[0]); // 生成选项:过滤空值后转换为表单选项格式 const choices = q.slice(1).filter(opt => opt).map(opt => FormApp.createChoice(opt)); mcItem.setChoices(choices); }); // 设置临时表单的响应提交到原电子表格(可选,也可指定新表格) tempForm.setDestination(FormApp.DestinationType.SPREADSHEET, ssId); // 自动跳转到生成的临时表单 return HtmlService.createHtmlOutput(`<script>window.location.href="${tempForm.getPublishedUrl()}";</script>`); } // 定时清理旧的临时表单,避免占用Drive存储空间 function cleanExpiredForms() { const templateFormId = "你的模板表单ID"; const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - 1); // 清理1天前的临时表单 const formFiles = DriveApp.getFilesByType(MimeType.GOOGLE_FORMS); while (formFiles.hasNext()) { const file = formFiles.next(); // 判断是否是我们生成的临时表单且已过期 if (file.getName().startsWith("临时问卷_") && file.getDateCreated() < cutoffDate) { file.setTrashed(true); } } }
3. 部署Web App
- 点击编辑器右上角「部署」→「新部署」
- 类型选择「Web应用」
- 执行权限选「我」,访问权限选「任何人,甚至匿名用户」
- 点击部署,复制生成的Web App链接,这就是给受访者的访问入口
4. 设置定时清理触发器
- 点击编辑器左侧「触发器」图标
- 添加触发器:选择
cleanExpiredForms函数,事件源选「时间驱动」,类型选「每天」,设置合适的执行时间(比如凌晨)
关键说明
- 每个访问者打开Web App链接时,都会生成独立的临时表单,彼此完全隔离,不会出现正在填写时问题被修改的情况
- 临时表单会被定时清理,不会占用过多Drive空间
- 如果你的问题是短答案、判断题等类型,只需修改脚本中添加问题的部分(比如用
addTextItem()代替addMultipleChoiceItem())
内容的提问来源于stack exchange,提问作者JordanB
相关产品推荐
相关产品推荐

