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

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());
}

使用说明

  1. 替换脚本中的表单ID为你的Google Forms ID;
  2. 在Google Apps Script编辑器中运行该函数;
  3. 查看日志获取新生成的随机化表单链接。

内容的

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:16