Apps Script触发执行仅删除Google Form问题未重建的故障求助
问题:Google Apps Script触发执行仅删除表单问题,无法重建新问题
手动在App Script后台执行以下脚本时,旧选择题能被正常删除,新问题也能成功生成;但设置表单提交触发或每分钟定时触发后,触发执行仅删除旧问题,无法创建新的选择题。
脚本代码
function clearMultipleChoiceQuestions() { var form = FormApp.openById(destinationForms); // 获取目标表单 var items = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE); // 获取所有选择题 let sleepDurations = items.length*1000 // 遍历删除每个选择题 for (var i = 0; i < items.length; i++) { form.deleteItem(items[i]); // 移除表单项目 } console.log("Sleeping for "+sleepDurations/1000+" second(s)") Utilities.sleep(sleepDurations) } function createMultipleChoiceQuestion(countRandomQuestion=2) { clearMultipleChoiceQuestions() // 创建新问题前删除所有旧问题 let form = FormApp.openById(destinationForms); // 获取目标表单 let questionList = getQuestionsAndChoice() let selectedQuestions = pickRandomQuestionsWithOptions(questionList,countRandomQuestion) let item = "" console.log("Generating Question...") for(var title in selectedQuestions){ let question_title = selectedQuestions[title]['question'] let question_choices = selectedQuestions[title]['options'] console.log("Adding question: "+question_title) console.log("Adding choices: "+question_choices) // 添加选择题 item = form.addMultipleChoiceItem(); item.setTitle(question_title) .setChoiceValues(question_choices); // 设置选项 } }
可能原因与解决方案
1. 权限差异问题
手动执行脚本使用当前登录用户权限,触发执行则使用脚本服务账号权限。如果getQuestionsAndChoice()或pickRandomQuestionsWithOptions()依赖外部资源(如存储问题的Google表格),服务账号可能无访问权限。
- 给脚本服务账号共享依赖资源:打开资源文件,点击「共享」,添加脚本服务账号邮箱(可在App Script后台「项目设置」中找到)
- 在
createMultipleChoiceQuestion中加入console.log(questionList)和console.log(selectedQuestions),查看触发执行时这两个变量是否有值,判断数据源是否读取失败
2. 删除逻辑的索引偏移问题
正序删除表单项目时,删除第i个项目后,后续项目索引会前移,导致循环跳过部分项目,同时可能影响后续添加操作的稳定性。
- 修改
clearMultipleChoiceQuestions的循环为倒序删除:for (var i = items.length - 1; i >= 0; i--) { form.deleteItem(items[i]); }
3. 变量作用域问题
如果destinationForms是仅在手动执行时临时定义的全局变量,触发执行时可能未正确初始化,导致表单无法正常访问。
- 在脚本中明确定义
destinationForms:const destinationForms = "你的目标表单ID"; // 替换为实际的表单ID
4. 不必要的延迟问题
Utilities.sleep并非必须,表单操作是同步执行的,多余的延迟可能导致触发执行超时或状态异常。
- 删除
clearMultipleChoiceQuestions中的Utilities.sleep(sleepDurations)代码
5. 捕获错误排查
在createMultipleChoiceQuestion中添加错误捕获,记录详细错误信息:
function createMultipleChoiceQuestion(countRandomQuestion=2) { try { clearMultipleChoiceQuestions() let form = FormApp.openById(destinationForms); let questionList = getQuestionsAndChoice() console.log("获取到的问题列表:", questionList) let selectedQuestions = pickRandomQuestionsWithOptions(questionList,countRandomQuestion) console.log("选中的问题:", selectedQuestions) let item = "" console.log("Generating Question...") for(var title in selectedQuestions){ let question_title = selectedQuestions[title]['question'] let question_choices = selectedQuestions[title]['options'] console.log("Adding question: "+question_title) console.log("Adding choices: "+question_choices) item = form.addMultipleChoiceItem(); item.setTitle(question_title) .setChoiceValues(question_choices); } } catch (e) { console.error("执行出错:", e.message, e.stack) } }
6. 查看完整执行日志
进入App Script后台,点击左侧「执行」选项,找到触发执行的记录,查看详细日志,确认是否有报错信息(如权限错误、变量未定义等)
内容的提问来源于stack exchange,提问作者Cignitor
相关产品推荐
相关产品推荐

