Com base em uma planilha do Google contendo 3 colunas:
a coluna 1 contém códigos de departamento, a coluna 2 contém nomes de cidades, a coluna 3 contém nomes de estabelecimentos,
Aqui está o link para as planilhas do Google que estou usando como fonte para o formulário
Estou tentando ter um código que gere um formulário do Google dividido em seções contendo perguntas com itens de resposta filtrados dependendo da resposta da pergunta anterior, ou seja, gostaria que dependendo do código do departamento selecionado, apenas as cidades deste departamento estivessem disponíveis na próxima seção solicitando a seleção de uma cidade, e dependendo da cidade selecionada, apenas os estabelecimentos da cidade estivessem disponíveis na última seção solicitando a seleção de um estabelecimento.
Eu tenho esse código que funciona para departamentos e cidades
veja o formulário do google que é gerado com o código abaixo
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)
}
mas não consigo adicionar outra seção com estabelecimentos depois da seleção da cidade.
Aqui está onde estou até agora, mas continuo recebendo mensagens de erro dizendo que a matriz está vazia.
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)
}
Alguma ideia de como posso adaptar o código inicial?
Obrigado pela ajuda !
Você quer criar dropdowns dependentes com base em região, cidade (dentro de uma região) e estabelecimento (dentro de região/cidade). Você está tendo dificuldade para obter os estabelecimentos relevantes.
A hierarquia de dados reflete a ordem de processamento dentro do script:
A lógica do script a seguir segue essa hierarquia.
Esta declaração:
Logger.log("DEBUG: Region = "+dptOption+"\ncity name = "+uniqueCityName+"\nestablishments = "+regionCityEstablishment)
foi deixada sem comentário; ela permite que o OP escaneie/visualize os resultados gerados pelo script.A propósito, uma amostra de resultados foi confirmada pela comparação com os dados de origem.
NOTA#1 : o script NÃO cria o formulário - essa é uma tarefa separada. No entanto, as etapas para isso são simplificadas tendo identificado cada região, cidades únicas dentro de uma região e estabelecimentos com cada cidade única com cada região.
NOTA#2 : É preciso questionar a eficácia e a capacidade de resposta do Formulário final. Há 8 regiões, 471 cidades únicas e 1.641 estabelecimentos. No que diz respeito à experiência do usuário, em muitos casos o número de opções se estende para centenas. No que diz respeito à capacidade de resposta do Formulário, é preciso aceitar que o desempenho de um formulário contendo várias centenas de seções pode não ser aceitável. É, talvez, algo sobre o qual o OP pode refletir e considerar opções possíveis.
Análise de Regiões/Cidades e Estabelecimentos
Quando o script é testado, parece que o erro
Exception: Array is empty: values
aparece, que é o que acredito que você quis dizer com a declaraçãokeep geting error messages saying that the array is empty
.Ao revisar o código, a causa do erro é
O script está filtrando
Département
, o que éoption[0]
, nãoNom_commune
, o que éoption[1]
.Você pode mudar isso para:
O código completo se tornaria:
Notas:
{ }
no final de suas instruções condicionais. Essa sintaxe é perfeitamente válida, mas é muito mais fácil entender o código se você usar chaves para delimitar os blocos de código e usar várias linhas e recuo.