基于包含 3 列的 Google 表格:
col 1 包含部门代码,col 2 包含城市名称,col 3 包含机构名称,
我正在尝试编写一个代码,该代码可以生成一个谷歌表单,该表单分为几个部分,其中包含一些问题,这些问题的答案项会根据上一个问题的答案进行过滤,也就是说,我希望根据所选的部门代码,在下一部分要求选择城市时,只有该部门的城市可用,并且根据所选城市,在最后一部分要求选择机构时,只有该城市的机构可用。
我有适用于部门和城市的代码
请参阅使用以下代码生成的Google表单
const FORM_ID="1OkH_GNjrvOCkiBAXKqmRQq3e1uYxEpE8baqEDVokFso"
let form=FormApp.openById(FORM_ID)
function resetForm(){
let items=form.getItems()
items.forEach(item=>form.deleteItem(item))
}
function createConditionalForm(){
resetForm()
let ws=SpreadsheetApp.getActiveSpreadsheet()
let ss=ws.getSheetByName("Feuille 4")
let table=ss.getDataRange().getValues()
table.shift()
let dptOptions=table.map(row=>row[0])
let singleDptOptions=[]
dptOptions.forEach(option=>{
if(singleDptOptions.indexOf(option)==-1)
singleDptOptions.push(option)
})
let departementQuestion = form.addMultipleChoiceItem().setTitle("Select Region")
let finalDptOptions = []
singleDptOptions.forEach(dptOption=>{
let section=form.addPageBreakItem().setTitle(dptOption)
section.setGoToPage(FormApp.PageNavigationType.SUBMIT)
let cityOptions=table.filter(option=>option[0]==dptOption).map(row=>row[1])
let singleCityOptions=[]
cityOptions.forEach(option=>{
if(singleCityOptions.indexOf(option)==-1)
singleCityOptions.push(option)
})
let cityQuestion = form.addMultipleChoiceItem().setTitle("Select City")
cityQuestion.setChoiceValues(singleCityOptions)
let dptChoice = departementQuestion.createChoice(dptOption, section)
finalDptOptions.push(dptChoice)
})
departementQuestion.setChoices(finalDptOptions)
}
但在选择城市后,我无法添加另一个包含机构的部分。
这是我目前的情况,但我不断收到错误消息,提示数组为空。
const FORM_ID="Form_ID"
let form=FormApp.openById(FORM_ID)
function resetForm(){
let items=form.getItems()
items.forEach(item=>form.deleteItem(item))
}
function createConditionalForm(){
resetForm()
let ws=SpreadsheetApp.getActiveSpreadsheet()
let ss=ws.getSheetByName("Feuille 4")
let table=ss.getDataRange().getValues()
table.shift()
let dptOptions=table.map(row=>row[0])
let singleDptOptions=[]
dptOptions.forEach(option=>{
if(singleDptOptions.indexOf(option)==-1)
singleDptOptions.push(option)
})
let departementQuestion = form.addMultipleChoiceItem().setTitle("Select Dpt code")
let finalDptOptions = []
singleDptOptions.forEach(dptOption=>{
let section=form.addPageBreakItem().setTitle(dptOption)
let cityOptions=table.filter(option=>option[0]==dptOption).map(row=>row[1])
let singleCityOptions=[]
cityOptions.forEach(option=>{
if(singleCityOptions.indexOf(option)==-1)
singleCityOptions.push(option)
})
let cityQuestion = form.addMultipleChoiceItem().setTitle("Select City")
let finalCityOptions=[]
singleCityOptions.forEach(cityOption=>{
let section2=form.addPageBreakItem().setTitle(cityOption)
section2.setGoToPage(FormApp.PageNavigationType.SUBMIT)
let etabOptions=table.filter(option=>option[0]==cityOption).map(row=>row[2])
let singleEtabOptions=[]
etabOptions.forEach(option=>{
if(singleEtabOptions.indexOf(option)==-1)
singleEtabOptions.push(option)
})
let etabQuestion=form.addMultipleChoiceItem().setTitle("Select Place")
etabQuestion.setChoiceValues(singleEtabOptions)
let cityChoice = cityQuestion.createChoice(cityOption, section2)
finalCityOptions.push(cityChoice)
})
cityQuestion.setChoices(finalCityOptions)
cityQuestion.setChoiceValues(singleCityOptions)
let dptChoice = departementQuestion.createChoice(dptOption, section)
finalDptOptions.push(dptChoice)
})
departementQuestion.setChoices(finalDptOptions)
}
有任何线索可以告诉我如何调整初始代码吗?
感谢您的帮助 !
您想要根据地区、城市(地区内)和机构(地区/城市内)创建依赖下拉列表。您在获取相关机构时遇到困难。
数据的层次结构反映了脚本内的处理顺序:
以下脚本的逻辑遵循此层次结构。
此语句:
Logger.log("DEBUG: Region = "+dptOption+"\ncity name = "+uniqueCityName+"\nestablishments = "+regionCityEstablishment)
未注释;它允许 OP 扫描/查看脚本生成的结果。值得一提的是,通过与源数据的比较,已经确认了样本结果。
注 1:脚本不会创建表单 - 这是一项单独的任务。但是,确定每个区域、区域内的特定城市以及每个区域内每个特定城市的机构后,此步骤会得到简化。
注 2:最终表单的有效性和响应性值得质疑。表单中有 8 个地区、471 个独立城市和 1,641 个机构。就用户体验而言,在许多情况下,选项数量会扩展到数百个。就表单的响应性而言,必须承认包含数百个部分的表单的性能可能不可接受。也许,OP 可以对此进行反思并考虑可能的选项。
地区/城市及机构分析
当测试脚本时,似乎
Exception: Array is empty: values
出现了错误,我相信这就是你所说的意思keep geting error messages saying that the array is empty
。检查代码后,错误原因是
该脚本正在过滤
Département
,这是option[0]
,不是Nom_commune
,这是option[1]
。您可以将其更改为:
完整代码如下:
笔记:
{ }
条件语句末尾没有花括号。此语法完全有效,但如果您使用花括号来分隔代码块并使用多行和缩进,则更容易理解代码。