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
|
1 Answer
Reset to default 0You 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:
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.
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]
- 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
}
var form = FormApp.openById('1OVSEOSAo3UdhBs_4dambM88PaGNTYr2taPn44iBlk0')
Please share this form with anyone with the url – Tedinoz Commented Mar 20 at 8:18