Existe uma maneira de vincular uma pergunta no estilo "Escolha de uma lista" em um Formulário do Google a uma lista de dados (por exemplo, em uma planilha)?

10

Existe uma maneira de vincular uma questão de estilo "Escolha de uma lista" em um formulário a uma lista de dados (por exemplo, em uma planilha)?

Isso significaria que, à medida que novas opções fossem adicionadas à lista na planilha (ou onde quer que fosse possível hospedar a lista), elas apareceriam automaticamente como uma opção para selecionar no formulário no futuro.

No meu caso, isso significaria que os respondentes que preenchessem o formulário poderiam selecionar quais voluntários estavam presentes naquela sessão de voluntariado específica da lista abrangente de voluntários (em vez de digitar cada nome individualmente), mas, como os voluntários se juntam esporadicamente, seria extremamente útil se fosse possível adicioná-las automaticamente às opções da lista, em vez de adicionar uma nova opção manualmente a cada vez.

Não tenho idéia se isso é possível, mas eu realmente apreciaria se alguém pudesse sugerir uma maneira de fazê-lo.

andy
fonte
Para ruim, você não está por perto para ver toda a resposta dada ....
Jacob Jan Tuinstra

Respostas:

3

A resposta de Tom Horwood funciona muito bem, mas somente após a correção de um erro importante em seu código. Todas as referências a LIST_DATAelementos devem ser feitas usando o índice j(não i). Eu não tenho karma suficiente para comentar no post de Tom, então aqui está o monty:

Abaixo está o código corrigido. Também mudei o nome dos LIST_DATAelementos para que eles sejam um pouco mais descritivos. Também mostra como Tom havia pensado no futuro (parabéns!) E forneceu a facilidade de atualizar mais de um elemento do formulário com o conteúdo de mais de uma lista de planilhas.

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

Para resumir como fazer isso funcionar (para aqueles que, como eu, estão usando o Google Apps Script pela primeira vez). Mencionei nomes de planilhas e nomes de campos de formulário no snippet de código acima para, com sorte, torná-lo mais compreensível:

  1. Na planilha associada ao seu formulário:

    • Crie uma nova planilha. Isso conterá a lista de itens que você deseja adicionar a um campo. Atribua um nome adequado à planilha (por exemplo TaskCategories). Coloque sua lista de itens na primeira coluna dessa planilha. Exclua todas as colunas e linhas extras dessa planilha (isso pode ou não ser necessário - não foi testado)
    • No menu Ferramentas, escolha "Editor de scripts". Copie e cole o snippet de código acima no editor de script. Você precisará alterar as seguintes partes do script:
      • O valor da variável FORMIDprecisará ser alterado para o ID do seu formulário. O ID é o código longo (entre barras) na barra de URL do seu navegador para o formulário desejado.
      • A LIST_DATAvariável precisará ser modificada para se adequar ao seu formulário e às suas necessidades. Você notará que cada item em LIST_DATAé uma tupla de formFieldTitlee worksheetName. O primeiro é o nome do campo do formulário (que deve ser do tipo "escolha da lista") - no editor de formulário é chamado Question Title. O último é o nome da planilha criada anteriormente que contém a lista de itens com os quais você deseja preencher o campo. Adicione quantas dessas tuplas você precisar à lista.
      • Agora salve o script (clique no ícone Salvar)
      • Teste o script escolhendo 'Executar' no menu do editor de scripts e escolhendo "updateLists". A primeira vez que você fizer isso, solicitará permissão. Se o script for bem-sucedido, você poderá observar que seu formulário agora possui os campos especificados preenchidos, caso contrário, você notará uma mensagem de erro na tela.
  2. Se você retornar à planilha, verá um novo item de menu intitulado List Updater. Ele possui um item Update Listsque você precisa executar sempre que alterar qualquer planilha da (s) sua (s) lista (s) - ele atualizará o formulário de acordo.

Observo também, para benefício dos leitores, que o FormRanger não funciona com as novas planilhas do Google. Os desenvolvedores do FormRanger dizem isso em seu site. Talvez / espero que isso mude no futuro, mas, no momento desta publicação, o código acima funciona para mim e eu o estou usando em um formulário implantado para um cliente.

tudo natural
fonte
Eu acho que essa é uma ótima resposta para incluir o passo a passo para quem não tem experiência em associar um script ou algo assim. Além disso, para ser exigente na formatação do código js, ​​adicione um ponto-e-vírgula após a inicialização da matriz LIST_DATA. Agora, para personalizá-lo mais, como se você tiver uma coluna de cabeçalho, use "for (var i = 1; i <data.length; i + = 1) {// Ignore a linha do cabeçalho iniciando o índice em 1."
Gary
Editado para corrigir o ponto e vírgula faltando - graças @Gary para perceber :-)
Allnatural
2

Você pode fazer isso com um formulário normal e um script, usando Form.getItems (), encontre o item em loop e, em seguida, Item.asListItem (). SetChoices (...)

Aqui está um código de exemplo, que eu usei nesta planilha e formulário de exemplo

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}
Tom Horwood
fonte
O link do formulário agora está corrigido
Tom Horwood
1

Existe um complemento do Google Forms chamado Form Values, que oferece pelo menos uma maneira semi-automática: sempre que você altera suas respostas na planilha, é necessário preencher novamente manualmente as opções na sua resposta, mas pelo menos é bastante simples de fazer. .

kynan
fonte
0

Você não pode fazer isso com os Formulários regulares do Google.

No entanto, você pode criar sua própria GUI usando o Google Apps Script , e especificamente o UIService . Esteja ciente, no entanto, de que você precisará recriar toda a GUI - você não pode usar partes do formulário existente.

Como alternativa, você pode usar o GUI Builder . É um editor WYSIWYG para GUIs de scripts do Google Apps.

Qualquer que seja a sua escolha, você deve estar preparado para fazer alguma programação para alcançar o que deseja.

Vidar S. Ramdal
fonte
1
O GUI Builder está obsoleto, então eu não o usaria mais.
: 11133 Jacob Jan Tuinstra
O UIService também está obsoleto.
Rubén
0

Existe uma maneira de automatizar a atualização da lista definindo um Disparador [ 1 ] [ 2 ] para Update Lists.

O caminho é Editor de scripts -> Recursos -> Gatilhos do projeto atual

Então add a new trigger,. Para os exemplos fornecidos, você pode configurar updatesListpara executar from spreadsheete On form submission. Dessa forma, a função onOpennão será necessária.

Nayuki Pereira Hara
fonte
-1

Sim, isso pode ser feito, passei boa parte do dia encontrando a resposta e desenvolvendo-a para meus propósitos, mas pode ser feito.

Minha necessidade era ter um formulário de inscrição voluntário para as pessoas marcarem várias caixas de uma lista de áreas que gostariam de oferecer. Portanto, uma pergunta com várias caixas, o problema é que a planilha do Google resultante apenas listou tudo o que foi verificado em uma célula. Havia 21 opções de voluntariado, de modo que claramente não seria um formato útil para essa informação. Eu queria fazer o que eu entendi que você queria dizer, queria ter uma coluna com cada uma das 21 opções em uma coluna própria. Em seguida, ao lado do carimbo de data e hora (formulário gerado), nome, email e telefone, existem 21 colunas com "yes" ou deixadas em branco. O cabeçalho da coluna é cada opção que eles poderiam escolher. Alguns podem se perguntar por que não apenas ter 21 perguntas com "sim" ou "não".

Primeira observação: quando alguém preenche um formulário do Google, a planilha resultante insere uma linha em vez de adicionar os dados à próxima linha vazia. Isso significa que todas as fórmulas que estavam na linha foram desanimadas e os novos dados da fórmula não têm fórmula nos próximos dois para trabalhar com os dados de entrada. Para ir além disso, adicionei uma planilha à planilha (pasta de trabalho). Utilizei a entrada de brettathds em http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw . Portanto, inseri a seguinte fórmula na célula A1 desta 2ª folha: = ARRAYFORMULA (Folha1! A1: A). Fiz semelhante para cada coluna através da coluna E. A coluna E tem a pergunta com as 21 caixas de seleção.

Ainda na segunda folha, a Linha 1 das Colunas AF tinha cabeçalhos idênticos ao texto em cada opção da caixa de seleção da lista de verificação das áreas que eles estão dispostos a oferecer. Em seguida, a coluna Z foi a próxima e a última pergunta no formulário, era uma pergunta de texto curto, intitulada "Comentários adicionais". Para essa coluna, usei o = ARRAYFORMULA (Sheet1! F1: F). Fiz isso como uma pergunta separada, em vez de utilizar a opção "other" no final das perguntas da caixa de seleção, pois parecia não haver uma boa maneira de extrair isso. dados na planilha.

Agora, à parte que responde como você obtém as informações da célula na coluna E (que pode ter até 21 itens listados) para separar as colunas com "yes" ou apenas em branco. A fórmula em F2 na segunda planilha é = iferror (if (search (F $ 1, $ E2)> 0, "Yes",)) Essa fórmula está procurando verificar se o texto exato no cabeçalho da coluna (F1) é encontrado no E2, se for, retorna "Sim"; caso contrário, deixa em branco.

Essa fórmula referenciada em F2 é gravada (utilizando "$", por meio da tecla F4), para que F2 possa ser copiado / colado em cada célula da linha 2 da GY (o Google Spreadsheet não suporta a cópia de fórmulas por arrastar / copiar, como você pode no Excel, mas isso pode ser feito selecionando F2, CTRL + C, depois selecione G2: Y2 e CTRL + V). Utilizando a mesma cópia de metodologia, colei F2: Y2 em F3: Y100.

Em seguida, escondi a coluna E na segunda folha para que a planilha resultante fosse mais compacta (evitando todo o envolvimento das respostas longas).

Agora estou pronto para receber 99 voluntários através do formulário rápido e fácil que eles preencherem. A utilização das opções de filtro na parte superior das colunas também ajudou a ver quem estava disponível para quais áreas.

Uma frustração final que eu não resolvi. Concluí alguns formulários falsos para testar minhas fórmulas e design e, em seguida, excluí essas linhas da planilha vinculada. Também tive algumas pessoas que preencheram formulários duplicados e também excluí as linhas deles. Digno de nota nos fóruns de produtos, não sou o único frustrado ao saber que, de alguma forma, o Google ainda tem os dados de teste / falsos / duplicados conectados ao "Resumo de respostas" (encontrado na guia "Formulário" da planilha). Portanto, o resumo das respostas é inútil quanto à precisão se houver linhas excluídas para remover dados de formulários de teste / falsos / duplicados.

Mas está realizado e estou salvando essas anotações para a próxima vez que precisar de algo semelhante, estou confiante de que isso poderia ser feito facilmente em menos de 30 minutos na próxima vez.

Espero que isso ajude, deixe-me saber se tiver alguma dúvida.

user37987
fonte
2
Isso é muito texto.
Jacob Jan Tuinstra
Kudos para o esforço
Saariko