通过Apps Script实现Google表单动态页面跳转遇TypeError问题求助
问题:Google表单下拉选项无法关联对应页面,报错「TypeError: item.createChoice is not a function」
- 需求:基于指定Google Sheet生成动态Google表单,问题数量、页面数量、单页问题数量均为动态(单页最多10个问题)
- 现状:已通过Apps Script完成表单生成,但下拉问题无法关联同名对应页面,尝试多种Stack Overflow示例无效,报错「TypeError: item.createChoice is not a function」
报错原因
你直接将formItems[0]赋值给item,但该对象是基础Item类型,不包含createChoice方法。必须先调用asListItem()将其转换为ListItem类型,才能使用下拉选项相关的专属方法。
修复后的代码
function updateForm(){ var ss = SpreadsheetApp.getActive(); var qsht = ss.getSheetByName("Questions"); var qvals = qsht.getDataRange().getValues(); var form = FormApp.openById("111Dqn_IJJn-QufnuZrvixToV_JsKZTzMx6eJcv3kfzk"); var items = form.getItems(); // 清空原有下拉选项(为删除关联页面做准备) var multipleChoices = []; for (let i = 1; i < qvals.length; i++){ multipleChoices.push(qvals[i][0] + " " + qvals[i][1]); } var formList = FormApp.ItemType.LIST; var formItems = form.getItems(formList); // 转换为ListItem类型并保存到item变量 var item = formItems[0].asListItem(); item.setChoiceValues(multipleChoices); Logger.log("当前操作的项类型:" + item.getType()); Logger.log("当前操作的项标题:" + item.getTitle()); // 删除第9项之后的所有条目 for (let i = items.length - 1; i > 9; i--){ form.deleteItem(i); } var choices = []; // 创建新页面并关联下拉选项 for (let i = 1; i < qvals.length; i++ ){ var pgTitle = qvals[i][0] + " " + qvals[i][1]; var pgBreakItem = form.addPageBreakItem() .setTitle(pgTitle) .setGoToPage(FormApp.PageNavigationType.SUBMIT); Logger.log("页面分隔符类型:" + pgBreakItem.getType()); Logger.log("页面分隔符标题:" + pgBreakItem.getTitle()); Logger.log("选项标签:" + pgTitle); // 现在item是ListItem类型,可以调用createChoice方法 choices.push(item.createChoice(pgTitle, pgBreakItem)); } // 更新下拉选项 item.setChoices(choices); }
关键修复点
- 类型转换:将
formItems[0]改为formItems[0].asListItem(),确保item是ListItem实例,拥有createChoice和setChoices等专属方法 - 变量统一:后续操作直接使用转换后的
item,避免混用基础Item类型和ListItem类型 - 代码规范:添加分号、使用
let替代var(更符合现代JS规范),提升代码可读性
内容的提问来源于stack exchange,提问作者arul selvan
相关产品推荐
相关产品推荐

