最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Google Forms Script - Stack Overflow

programmeradmin1浏览0评论

I need help with a javascript code for randomizing sections (not just questions) in Google Forms. I have a code on what I want to do but it keeps telling me there is not enough sections found despite there being 18. I am lost. I need to randomize all sections BUT 1,2, and 18.

The code is below. I am new to this but appreciate the help in advance! I tried multiple variations, shorter forms, etc but I am not figuring this out.

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

I need help with a javascript code for randomizing sections (not just questions) in Google Forms. I have a code on what I want to do but it keeps telling me there is not enough sections found despite there being 18. I am lost. I need to randomize all sections BUT 1,2, and 18.

The code is below. I am new to this but appreciate the help in advance! I tried multiple variations, shorter forms, etc but I am not figuring this out.

    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());
    }
Share Improve this question edited Mar 18 at 19:28 Erica asked Mar 18 at 19:16 EricaErica 11 bronze badge 2
  • 4 This question is similar to: Randomize google forms sections with Gsuit?. If you believe it’s different, please edit the question, make it clear how it’s different and/or how the answers on that question are not helpful for your problem. – Tedinoz Commented Mar 19 at 0:21
  • 1 var form = FormApp.openById('1OVSEOSAo3UdhBs_4dambM88PaGNTYr2taPn44iBlk0') Please share this form with anyone with the url – Tedinoz Commented Mar 20 at 8:18
Add a comment  | 

1 Answer 1

Reset to default 0

You are trying to "shuffle" sections of a form but your code keeps telling me there is not enough sections found.

The reason for this problem begins with:

  1. sectionItems.push({ item: items[i], index: sectionIndex }); Line #12
    • this creates an object comprising keys="item" and "index", and values = a Form Item and the section index.
  2. randomizeSections.push(sectionItems[i].item); Line#26
    • this pushes the Form Item onto the array instead of the section index.
    • the result is that the array randomizeSections looks like this:
      • [Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item, Item]
    • instead of this:
      • [3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 19.0]
  3. There were also a number of typos, but these may have been in the sample code and not the live code.

The following answer builds the allSections array which is used at line #65 to build a new Form (which is not in the scope of this question).

  • Note the simplified merging of the fixed and randomized sections at line #54.

function randomizeSectionsExcept() {
  var formId = "1vDqJ4TXww8B287FpEm32dAPhZfX6xuwoCGAXpzNIpsk"
  var form = FormApp.openById(formId) // 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++) {
    //Logger.log("DEBUG: i:"+i+", Item Type = "+items[i].getType())
    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(sectionItems) // DEBUG
  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].index);
      Logger.log("DEBUG: Section to randomize: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle());
    } else {
      fixedSectionItems.push(sectionItems[i].index);
      Logger.log("DEBUG: Fixed section: " + sectionItems[i].index + ": " + sectionItems[i].item.getTitle());
    }
  }

  // Logger.log(fixedSectionItems)// DEBUG
  // Logger.log("DEBUG: Number of fixed sections = "+fixedSectionItems.length)
  // Logger.log(randomizeSections) // DEBUG
  // Logger.log("DEBUG: 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;
  }
  // Logger.log("DEBUG: Randomized sections")
  // Logger.log(randomizeSections) // DEBUG
  // Logger.log("DEBUGNumber of randomized sections = "+randomizeSections.length)

  // build new sections
  var allSections = []
  var randomizeIndex = 0;

  //insert fixed sections into the randomnise array
  for (var i=0;i<fixedSections.length;i++){
    randomizeSections.splice(fixedSections[i]-1, 0,fixedSections[i])
  }
  // Logger.log("DEBUG: revised randomized and Fixed Sections")
  Logger.log(randomizeSections) // DEBUG
  allSections = randomizeSections

}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论