Google Forms指定版块随机化脚本报错求助:版块识别异常
Google Forms 指定版块排除随机化脚本问题修复
问题背景
我需要编写JavaScript脚本实现Google Forms中排除第1、2、18版块的其余版块随机化,但当前脚本在表单明确包含18个版块的情况下,仍输出“没有足够的版块”日志,无法完成随机化操作,多次调整未解决问题,附上原脚本寻求解决办法。
原脚本
function randomizeSectionsExcept() { var form = FormApp.openById('1OVSEOSAo3UdhBs_4dambM88PaGNTYr2taPn44iBlk0'); // Replace with your form ID var items = form.getItems(); var sectionItems =; var fixedSections = [1, 2, 18]; // Sections to exclude (1-based index) // Collect section items and their indexes var sectionIndex = 0; for (var i = 0; i < items.length; i++) { if (items[i].getType() == FormApp.ItemType.SECTION_HEADER) { sectionIndex++; sectionItems.push({ item: items[i], index: sectionIndex }); Logger.log("Found section: " + sectionIndex + ": " + items[i].getTitle()); } } Logger.log("Total sections found: " + sectionItems.length); Logger.log("Fixed sections to exclude: " + fixedSections); // Separate sections to randomize and fixed sections var randomizeSections =; var fixedSectionItems =; for (var i = 0; i < sectionItems.length; i++) { if (fixedSections.indexOf(sectionItems[i].index) === -1) { randomizeSections.push(sectionItems[i].item); Logger.log("Section to randomize: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle()); } else { fixedSectionItems.push(sectionItems[i]); Logger.log("Fixed section: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle()); } } Logger.log("Number of sections to randomize: " + randomizeSections.length); if (randomizeSections.length < 2) { Logger.log("Not enough sections to randomize."); return; } // Shuffle the sections to randomize for (var i = randomizeSections.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = randomizeSections[i]; randomizeSections[i] = randomizeSections[j]; randomizeSections[j] = temp; } // Create a new form var allSections =; var randomizeIndex = 0; for (var i = 1; i <= sectionItems.length; i++) { if (fixedSections.indexOf(i) !== -1) { var fixedSection = fixedSectionItems.find(function(item) { return item.index === i; }); allSections.push(fixedSection.item); } else { allSections.push(randomizeSections[randomizeIndex]); randomizeIndex++; } } // Add the sections and their questions to the new form Logger.log("Attempting to create new form"); var newForm = FormApp.create(form.getTitle() + " (Partial Randomized)"); Logger.log("New form created. URL: " + newForm.getEditUrl()); for (var i = 0; i < allSections.length; i++) { newForm.addSectionHeaderItem().setTitle(allSections[i].getTitle()).setHelpText(allSections[i].getHelpText()); var currentSectionTitle = allSections[i].getTitle(); var addQuestions = false; for (var k = 0; k < items.length; k++) { if (items[k].getType() == FormApp.ItemType.SECTION_HEADER && items[k].getTitle() == currentSectionTitle) { addQuestions = true; continue; } if (items[k].getType() == FormApp.ItemType.SECTION_HEADER && items[k].getTitle() != currentSectionTitle && addQuestions == true) { addQuestions = false; } if (addQuestions && items[k].getType() != FormApp.ItemType.SECTION_HEADER) { var item = items[k]; switch (item.getType()) { case FormApp.ItemType.CHECKBOX: newForm.addCheckboxItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setChoices(item.asCheckboxItem().getChoices()).setRequired(item.asCheckboxItem().isRequired()); break; case FormApp.ItemType.DATE: newForm.addDateItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setIncludeYear(item.asDateItem().includeYear()).setIncludeTime(item.asDateItem().includeTime()).setRequired(item.asDateItem().isRequired()); break; case FormApp.ItemType.DATETIME: newForm.addDateTimeItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setIncludeYear(item.asDateTimeItem().includeYear()).setRequired(item.asDateTimeItem().isRequired()); break; case FormApp.ItemType.DURATION: newForm.addDurationItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setRequired(item.asDurationItem().isRequired()); break; case FormApp.ItemType.GRID: newForm.addGridItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setRows(item.asGridItem().getRows()).setColumns(item.asGridItem().getColumns()).setRequired(item.asGridItem().isRequired()); break; case FormApp.ItemType.IMAGE: newForm.addImageItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setImage(item.asImageItem().getImage()).setAlignment(item.asImageItem().getAlignment()); break; case FormApp.ItemType.LIST: newForm.addListItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setChoices(item.asListItem().getChoices()).setRequired(item.asListItem().isRequired()); break; case FormApp.ItemType.MULTIPLE_CHOICE: newForm.addMultipleChoiceItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setChoices(item.asMultipleChoiceItem().getChoices()).setRequired(item.asMultipleChoiceItem().isRequired()); break; case FormApp.ItemType.PAGE_BREAK: newForm.addPageBreakItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()); break; case FormApp.ItemType.PARAGRAPH_TEXT: newForm.addParagraphTextItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setRequired(item.asParagraphTextItem().isRequired()); break; case FormApp.ItemType.SCALE: newForm.addScaleItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setBounds(item.asScaleItem().getLowerBound(), item.asScaleItem().getUpperBound()).setLabels(item.asScaleItem().getLeftLabel(), item.asScaleItem().getRightLabel()).setRequired(item.asScaleItem().isRequired()); break; case FormApp.ItemType.TEXT: newForm.addTextItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setRequired(item.asTextItem().isRequired()); break; case FormApp.ItemType.TIME: newForm.addTimeItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setRequired(item.asTimeItem().isRequired()); break; case FormApp.ItemType.VIDEO: newForm.addVideoItem().setTitle(item.getTitle()).setHelpText(item.getHelpText()).setVideoUrl(item.asVideoItem().getVideoUrl()).setAlignment(item.asVideoItem().getAlignment()); break; } } } } Logger.log("Partial randomized form created: " + newForm.getEditUrl()); }
问题排查与修复
核心错误点
脚本中存在未初始化数组的语法错误,导致无法正常收集版块数据:
var sectionItems =;→ 需改为var sectionItems = [];var randomizeSections =;→ 需改为var randomizeSections = [];var fixedSectionItems =;→ 需改为var fixedSectionItems = [];var allSections =;→ 需改为var allSections = [];
这些错误会直接导致数组操作失败,randomizeSections 始终为空数组,触发 randomizeSections.length < 2 的判断,输出“没有足够的版块”提示。
额外优化建议
原脚本通过标题匹配版块内容,若表单存在重复标题的版块,会导致内容错乱。建议改用版块的索引范围关联内容,避免标题冲突问题。
修复后完整脚本
function randomizeSectionsExcept() { var form = FormApp.openById('1OVSEOSAo3UdhBs_4dambM88PaGNTYr2taPn44iBlk0'); // 替换为你的表单ID var items = form.getItems(); var sectionItems = []; var fixedSections = [1, 2, 18]; // 要排除的版块(1-based索引) // 收集所有版块及其索引、起始位置 var sectionIndex = 0; for (var i = 0; i < items.length; i++) { if (items[i].getType() == FormApp.ItemType.SECTION_HEADER) { sectionIndex++; // 记录版块的起始和结束位置,避免标题匹配冲突 var endIndex = items.length - 1; for (var j = i + 1; j < items.length; j++) { if (items[j].getType() == FormApp.ItemType.SECTION_HEADER) { endIndex = j - 1; break; } } sectionItems.push({ item: items[i], index: sectionIndex, start: i, end: endIndex }); Logger.log("找到版块: " + sectionIndex + ": " + items[i].getTitle()); } } Logger.log("总共找到版块数: " + sectionItems.length); Logger.log("固定排除的版块: " + fixedSections); // 分离需要随机化的版块和固定版块 var randomizeSections = []; var fixedSectionItems = []; for (var i = 0; i < sectionItems.length; i++) { if (fixedSections.indexOf(sectionItems[i].index) === -1) { randomizeSections.push(sectionItems[i]); Logger.log("待随机化版块: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle()); } else { fixedSectionItems.push(sectionItems[i]); Logger.log("固定版块: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle()); } } Logger.log("待随机化版块数量: " + randomizeSections.length); if (randomizeSections.length < 2) { Logger.log("没有足够的版块进行随机化。"); return; } // 打乱待随机化的版块顺序 for (var i = randomizeSections.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = randomizeSections[i]; randomizeSections[i] = randomizeSections[j]; randomizeSections[j] = temp; } // 构建最终的版块顺序:固定版块保留原位置,其余插入随机化后的版块 var allSections = []; var randomizeIndex = 0; for (var i = 1; i <= sectionItems.length; i++) { var fixedSection = fixedSectionItems.find(function(item) { return item.index === i; }); if (fixedSection) { allSections.push(fixedSection); } else { allSections.push(randomizeSections[randomizeIndex]); randomizeIndex++; } } // 创建新表单并添加内容 Logger.log("开始创建新表单"); var newForm = FormApp.create(form.getTitle() + " (部分随机化版)"); Logger.log("新表单创建完成,编辑链接: " + newForm.getEditUrl()); // 遍历所有版块,添加标题和对应问题 for (var i = 0; i < allSections.length; i++) { var currentSection = allSections[i]; // 添加版块标题 newForm.addSectionHeaderItem() .setTitle(currentSection.item.getTitle()) .setHelpText(currentSection.item.getHelpText()); // 添加版块内的所有问题 for (var k = currentSection.start + 1; k <= currentSection.end; k++) { var item = items[k]; switch (item.getType()) { case FormApp.ItemType.CHECKBOX: newForm.addCheckboxItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setChoices(item.asCheckboxItem().getChoices()) .setRequired(item.asCheckboxItem().isRequired()); break; case FormApp.ItemType.DATE: newForm.addDateItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setIncludeYear(item.asDateItem().includeYear()) .setIncludeTime(item.asDateItem().includeTime()) .setRequired(item.asDateItem().isRequired()); break; case FormApp.ItemType.DATETIME: newForm.addDateTimeItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setIncludeYear(item.asDateTimeItem().includeYear()) .setRequired(item.asDateTimeItem().isRequired()); break; case FormApp.ItemType.DURATION: newForm.addDurationItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setRequired(item.asDurationItem().isRequired()); break; case FormApp.ItemType.GRID: newForm.addGridItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setRows(item.asGridItem().getRows()) .setColumns(item.asGridItem().getColumns()) .setRequired(item.asGridItem().isRequired()); break; case FormApp.ItemType.IMAGE: newForm.addImageItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setImage(item.asImageItem().getImage()) .setAlignment(item.asImageItem().getAlignment()); break; case FormApp.ItemType.LIST: newForm.addListItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setChoices(item.asListItem().getChoices()) .setRequired(item.asListItem().isRequired()); break; case FormApp.ItemType.MULTIPLE_CHOICE: newForm.addMultipleChoiceItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setChoices(item.asMultipleChoiceItem().getChoices()) .setRequired(item.asMultipleChoiceItem().isRequired()); break; case FormApp.ItemType.PAGE_BREAK: newForm.addPageBreakItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()); break; case FormApp.ItemType.PARAGRAPH_TEXT: newForm.addParagraphTextItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setRequired(item.asParagraphTextItem().isRequired()); break; case FormApp.ItemType.SCALE: newForm.addScaleItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setBounds(item.asScaleItem().getLowerBound(), item.asScaleItem().getUpperBound()) .setLabels(item.asScaleItem().getLeftLabel(), item.asScaleItem().getRightLabel()) .setRequired(item.asScaleItem().isRequired()); break; case FormApp.ItemType.TEXT: newForm.addTextItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setRequired(item.asTextItem().isRequired()); break; case FormApp.ItemType.TIME: newForm.addTimeItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setRequired(item.asTimeItem().isRequired()); break; case FormApp.ItemType.VIDEO: newForm.addVideoItem() .setTitle(item.getTitle()) .setHelpText(item.getHelpText()) .setVideoUrl(item.asVideoItem().getVideoUrl()) .setAlignment(item.asVideoItem().getAlignment()); break; } } } Logger.log("部分随机化表单创建完成: " + newForm.getEditUrl()); }
使用说明
- 替换脚本中的表单ID为你的Google Forms ID;
- 在Google Apps Script编辑器中运行该函数;
- 查看日志获取新生成的随机化表单链接。
内容的
相关产品推荐
相关产品推荐

