¿Hay alguna forma de vincular una pregunta de estilo "Elegir de una lista" en un formulario de Google a una lista de datos (por ejemplo, en una hoja de cálculo)?


10

¿Hay alguna forma de vincular una pregunta de estilo "Elegir de una lista" en un formulario a una lista de datos (por ejemplo, en una hoja de cálculo)?

Esto significaría que a medida que se agregan nuevas opciones a la lista en la hoja de cálculo (o en cualquier otro lugar donde sea posible alojar la lista) aparecerán automáticamente como una opción para seleccionar en el formulario en el futuro.

En mi caso, significaría que los encuestados que completen el formulario podrán seleccionar qué voluntarios estuvieron presentes en esa sesión de voluntariado en particular de la lista completa de voluntarios (en lugar de escribir cada nombre individualmente), pero dado que los voluntarios se unen esporádicamente, sería de gran ayuda si fuera posible agregarlos a las opciones de la lista automáticamente en lugar de agregar una nueva opción manualmente cada vez.

No tengo idea de si esto es posible, pero realmente agradecería si alguien pudiera sugerir una forma de hacerlo.


Que mal, no estás cerca para ver toda la respuesta dada ...
Jacob Jan Tuinstra

Respuestas:


3

La respuesta de Tom Horwood funciona muy bien, pero solo después de corregir un error importante en su código. Todas las referencias a LIST_DATAelementos deben hacerse usando el índice j(no i). No tengo suficiente karma para comentar sobre la publicación de Tom, así que aquí está el monty completo:

A continuación se muestra el código corregido. También he cambiado el nombre de los LIST_DATAelementos para que sean un poco más descriptivos. También muestra cómo Tom había pensado en el futuro (¡felicitaciones!) Y proporcionó la posibilidad de actualizar más de un elemento de formulario con el contenido de más de una lista de hojas de cálculo.

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 cómo hacer que esto funcione (para aquellos, como yo, que están usando Google Apps Script por primera vez). Me he referido a los nombres de las hojas y los nombres de los campos de formulario en el fragmento de código anterior para que sea más comprensible:

  1. En la hoja de cálculo asociada con su formulario:

    • Crea una nueva hoja de trabajo. Esto contendrá la lista de elementos que desea agregar a un campo. Dé a la hoja de trabajo un nombre adecuado (por ejemplo, TaskCategories). Coloque su lista de elementos allí en la primera columna de esa hoja de trabajo. Elimine todas las columnas y filas adicionales en esa hoja (esto puede o no ser necesario, no lo he probado)
    • En el menú Herramientas, elija "Editor de secuencias de comandos". Copie y pegue el fragmento de código anterior en el editor de scripts. Deberá cambiar las siguientes partes del script:
      • El valor de la variable FORMIDdeberá cambiarse a la ID de su formulario. La ID es el código largo (entre barras diagonales) en la barra de URL de su navegador para el formulario deseado.
      • La LIST_DATAvariable deberá modificarse para adaptarse a su forma y sus necesidades. Notarás que cada elemento en LIST_DATAes una tupla de formFieldTitley worksheetName. El primero es el nombre del campo de formulario (que debe ser un tipo de campo "elegir de la lista") - en el editor de formulario se llama Question Title. Este último es el nombre de la hoja de trabajo que creó anteriormente que contiene la lista de elementos con los que desea llenar el campo. Agregue tantas de estas tuplas a la lista como necesite.
      • Ahora guarde el script (haga clic en el icono de guardar)
      • Pruebe la secuencia de comandos seleccionando 'Ejecutar' en el menú del editor de secuencias de comandos y seleccionando "actualizarListas" La primera vez que haga esto, le pedirá permiso. Si la secuencia de comandos tiene éxito, puede observar que su formulario ahora tiene los campos especificados, de lo contrario, verá un mensaje de error en la pantalla.
  2. Si vuelve a la hoja de cálculo, debería ver un nuevo elemento del menú titulado List Updater. Tiene un elemento Update Listsque debe ejecutar cada vez que cambia cualquiera de las hojas de trabajo de su lista (s): actualizará el formulario en consecuencia.

También noto, para beneficio de los lectores, que FormRanger no funciona con las nuevas hojas de cálculo de Google. Los desarrolladores de FormRanger dicen lo mismo en su sitio web. Quizás / con suerte eso cambiará en el futuro, pero a la fecha de esta publicación, el código anterior funciona para mí y lo estoy usando en forma desplegada para un cliente.


Creo que esta es una gran respuesta para incluir paso a paso para aquellos sin experiencia en asociar un script o algo así. Además, para ser exigente con el formato de código js, ​​agregue un punto y coma después de la inicialización de la matriz LIST_DATA. Ahora, para personalizarlo más, como si tuviera una columna de encabezado, use "for (var i = 1; i <data.length; i + = 1) {// Omita la fila del encabezado iniciando el índice en 1."
Gary

Editado para arreglar el punto y coma faltante - gracias @Gary por notar :-)
allnatural

2

Puede hacer esto con un formulario normal y un script, utilizando Form.getItems (), busque el elemento en bucle, luego Item.asListItem (). SetChoices (...)

Aquí hay un código de muestra, que he usado en esta hoja y formulario de ejemplo

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);
}

El enlace del formulario ahora está arreglado
Tom Horwood

1

Existe un complemento de Formularios de Google llamado Valores de formulario que al menos ofrece una forma semiautomática: cada vez que cambie sus respuestas en la hoja de cálculo, debe volver a llenar manualmente las opciones en su respuesta, pero al menos es bastante sencillo de hacer .


0

No puede hacer esto con los formularios regulares de Google.

Sin embargo, puede crear su propia GUI utilizando Google Apps Script , y específicamente el UIService . Sin embargo, tenga en cuenta que tendrá que volver a crear la GUI completa; no puede usar partes de su formulario existente.

Alternativamente, puede usar el GUI Builder . Es un editor WYSIWYG para las GUI de Google Apps Script.

Cualquiera que elija, debe estar preparado para hacer un poco de programación para lograr lo que desea.


1
El GUI Builder está en desuso, por lo que ya no lo usaría más.
Jacob Jan Tuinstra

El UIService también está en desuso.
Rubén


0

Hay una manera de automatizar la actualización de la lista configurando un Trigger [ 1 ] [ 2 ] para Update Lists.

La ruta es Editor de secuencias de comandos -> Recursos -> Activadores del proyecto actual

A continuación, add a new trigger. Para los ejemplos dados, puede configurar updatesListpara ejecutar from spreadsheety On form submission. De esta manera, la función onOpenno será necesaria.


-1

Sí, se puede hacer, pasé una buena parte del día buscando la respuesta y luego desarrollándola para mis propósitos, pero se puede hacer.

Mi necesidad era tener un formulario de inscripción de voluntarios para que las personas marquen varias casillas de una lista de áreas en las que les gustaría ser voluntario. Por lo tanto, una pregunta con varios cuadros, el problema es que la hoja de cálculo de Google resultante simplemente enumeró todo lo que verificaron en una celda. Hubo 21 opciones de voluntariado, por lo que claramente no sería un formato útil para esa información. Quería hacer lo que entendí que dijiste que querías, quería tener una columna con cada una de las 21 opciones en una columna propia. Luego, junto a su Marca de tiempo (formulario generado), nombre, correo electrónico y teléfono, hay 21 columnas con "sí" o en blanco. El encabezado de la columna es cada opción que podrían elegir. Algunos podrían preguntarse por qué no solo tienen 21 preguntas con "sí" o "no".

Primero tenga en cuenta que cuando alguien completa un formulario de Google, la hoja de cálculo resultante inserta una fila en lugar de agregar los datos a la siguiente fila vacía. Esto significa que cualquier fórmula que estaba en la fila acaba de ser derribada y los nuevos datos de la fórmula no tienen fórmula los dos siguientes para que funcione con los datos de entrada. Para superar esto, agregué una hoja a la hoja de cálculo (libro de trabajo). Utilicé información de brettathds en http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw . Por lo tanto, inserté la siguiente fórmula en la celda A1 de esta segunda hoja: = ARRAYFORMULA (Hoja1! A1: A). Hice lo mismo para cada columna a través de la columna E. La columna E tiene la pregunta con las 21 casillas de verificación.

Todavía en la segunda hoja, la fila 1 de las columnas FY tenía encabezados idénticos al texto en cada opción de la casilla de verificación de la lista de áreas que están dispuestos a ser voluntarios. Luego, la Columna Z fue la siguiente y última pregunta en el formulario, fue una breve pregunta de texto que se tituló "Comentarios adicionales". Para esa columna utilicé el = ARRAYFORMULA (Sheet1! F1: F) Hice esto como una pregunta separada en lugar de utilizar la opción "otro" al final de las preguntas de la casilla de verificación, ya que no parecía haber una buena manera de sacar eso datos en la hoja de cálculo.

Ahora a la parte que responde cómo obtiene la información de la celda en la columna E (que podría tener hasta 21 elementos enumerados) para separar las columnas con "sí" o simplemente en blanco. La fórmula en F2 en la segunda hoja es = iferror (if (search (F $ 1, $ E2)> 0, "Yes",)) Esta fórmula busca ver si se encuentra el texto exacto en el encabezado de columna (F1) en E2, si es así, devuelve un "Sí", si no, lo deja en blanco.

Esta fórmula a la que se hace referencia en F2 se escribe (utilizando "$", mediante la tecla F4) para que F2 se pueda copiar / pegar en cada celda de la fila 2 desde GY (la hoja de cálculo de Google no admite la copia de fórmulas arrastrando / copiando como puede en Excel, pero se puede hacer seleccionando F2, luego CTRL + C, luego seleccione G2: Y2, luego CTRL + V). Luego, utilizo la misma metodología copia pegada F2: Y2 a F3: Y100.

Luego escondí la columna E en la segunda hoja para que la hoja de cálculo resultante fuera más compacta (evitando todo el ajuste de las respuestas largas).

Ahora estoy listo para recibir 99 voluntarios a través del formulario rápido y fácil que completan. La utilización de las opciones de filtro en la parte superior de las columnas también ayudó a ver quién estaba disponible para qué áreas.

Una frustración final que no me resolvió. Completé algunos formularios falsos para probar mis fórmulas y mi diseño, luego eliminé esas filas de la hoja de cálculo vinculada. También tuve algunas personas que completaron formularios duplicados, también eliminé sus filas. Cabe destacar que en los foros de productos, no soy el único frustrado al saber que de alguna manera Google todavía tiene los datos de prueba / falsos / duplicados conectados al "Resumen de respuestas" (que se encuentra en la pestaña "Formulario" de la hoja de cálculo). Por lo tanto, el resumen de respuestas es inútil para la precisión si se han eliminado filas para eliminar datos de formularios de prueba / falsos / duplicados.

Pero se ha logrado y estoy guardando estas notas para la próxima vez que necesite algo similar, estoy seguro de que podría hacerlo fácilmente en menos de 30 minutos la próxima vez.

Espero que esto ayude, avíseme si tiene alguna pregunta.


2
Eso es mucho texto.
Jacob Jan Tuinstra

Felicitaciones por el esfuerzo
Saariko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.