Existe-t-il un moyen de lier une question de style «Choisir dans une liste» dans un formulaire Google à une liste de données (par exemple dans une feuille de calcul)?


10

Existe-t-il un moyen de lier une question de style "Choisir dans une liste" dans un formulaire à une liste de données (par exemple dans une feuille de calcul)?

Cela signifierait que de nouvelles options étant ajoutées à la liste dans la feuille de calcul (ou partout où il pourrait être possible d'héberger la liste), elles apparaîtraient automatiquement comme une option à sélectionner dans le formulaire à l'avenir.

Dans mon cas, cela signifierait que les répondants remplissant le formulaire seraient en mesure de sélectionner les volontaires présents à cette session de volontariat particulière dans la liste complète des volontaires (plutôt que de taper chaque nom individuellement), mais comme les volontaires se joignent sporadiquement, il serait extrêmement utile s'il était possible de les ajouter automatiquement aux options de la liste plutôt que d'ajouter une nouvelle option manuellement à chaque fois.

Je n'ai aucune idée si cela est possible mais j'apprécierais vraiment que quelqu'un puisse suggérer une façon de le faire.


Dommage, vous n'êtes pas là pour voir toutes les réponses données ....
Jacob Jan Tuinstra

Réponses:


3

La réponse de Tom Horwood fonctionne très bien, mais seulement après avoir corrigé une erreur importante dans son code. Toutes les références aux LIST_DATAéléments doivent être faites à l'aide de l'index j(pas i). Je n'ai pas suffisamment de karma pour commenter le post de Tom, alors voici le mois complet:

Voici le code corrigé. J'ai également changé le nom des LIST_DATAéléments afin qu'ils soient un peu plus descriptifs. Il montre également comment Tom avait anticipé (bravo!) Et a fourni la possibilité de mettre à jour plus d'un élément de formulaire avec le contenu de plusieurs listes de feuilles de calcul.

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

Pour résumer comment faire fonctionner cela (pour ceux, comme moi, qui utilisent Google Apps Script pour la première fois). J'ai fait référence aux noms de feuilles et aux noms de champs de formulaire dans l'extrait de code ci-dessus pour, espérons-le, le rendre plus compréhensible:

  1. Dans la feuille de calcul associée à votre formulaire:

    • Créez une nouvelle feuille de calcul. Celui-ci contiendra la liste des éléments que vous souhaitez ajouter à un champ. Donnez à la feuille de calcul un nom approprié (par exemple, TaskCategories). Mettez votre liste d'éléments dans la première colonne de cette feuille de calcul. Supprimez toutes les colonnes et lignes supplémentaires sur cette feuille (cela peut être nécessaire ou non - n'a pas été testé)
    • Dans le menu Outils, choisissez "Script Editor". Copiez et collez l'extrait de code ci-dessus dans l'éditeur de script. Vous devrez modifier les parties suivantes du script:
      • La valeur de variable FORMIDdevra être remplacée par l'ID de votre formulaire. L'ID est le code long (entre les barres obliques) dans la barre d'URL de votre navigateur pour le formulaire souhaité.
      • La LIST_DATAvariable devra être modifiée en fonction de votre formulaire et de vos besoins. Vous remarquerez que chaque élément dans LIST_DATAest un tuple de formFieldTitleet worksheetName. Le premier est le nom du champ du formulaire (qui doit être un type de champ "choisissez dans la liste") - dans l'éditeur de formulaire, il s'appelle Question Title. Ce dernier est le nom de la feuille de calcul que vous avez créée précédemment et qui contient la liste des éléments avec lesquels vous souhaitez remplir le champ. Ajoutez autant de tuples à la liste que vous le souhaitez.
      • Maintenant, enregistrez le script (cliquez sur l'icône d'enregistrement)
      • Testez le script en choisissant «Exécuter» dans le menu de l'éditeur de script et en choisissant «updateLists». La première fois que vous faites cela, il vous demandera la permission. Si le script réussit, vous pouvez constater que votre formulaire contient désormais les champs spécifiés, sinon vous remarquerez un message d'erreur à l'écran.
  2. Si vous revenez à la feuille de calcul, vous devriez voir un nouvel élément de menu intitulé List Updater. Il contient un élément Update Listsque vous devez exécuter chaque fois que vous modifiez l'une de vos feuilles de calcul de liste (s) - il mettra à jour le formulaire en conséquence.

Je note également, pour le bénéfice des lecteurs, que FormRanger ne fonctionne pas avec les nouvelles feuilles de calcul Google. Les développeurs de FormRanger en disent autant sur leur site Web. Peut-être / j'espère que cela changera à l'avenir, mais au moment de cette publication, le code ci-dessus fonctionne pour moi et je l'utilise sous une forme déployée pour un client.


Je pense que c'est une excellente réponse pour inclure l'étape par étape pour ceux qui n'ont pas d'expérience en associant un script ou quoi que ce soit. De plus, pour être pointilleux sur la mise en forme du code js, ajoutez un point-virgule après l'initialisation du tableau LIST_DATA. Maintenant, pour le personnaliser davantage, comme si vous avez une colonne d'en-tête, utilisez "for (var i = 1; i <data.length; i + = 1) {// Ignorer la ligne d'en-tête en commençant l'index à 1."
Gary

Modifié pour corriger le point-virgule manquant - merci @Gary d'avoir remarqué :-)
allnatural

2

Vous pouvez le faire avec un formulaire normal et un script, en utilisant Form.getItems (), recherchez l'élément en boucle, puis Item.asListItem (). SetChoices (...)

Voici un exemple de code que j'ai utilisé dans cet exemple de feuille et de formulaire

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

Le lien du formulaire est maintenant corrigé
Tom Horwood

1

Il existe un module complémentaire Google Forms appelé Form Values qui offre au moins un moyen semi-automatique: chaque fois que vous modifiez vos réponses dans la feuille de calcul, vous devez recopier manuellement les choix dans votre réponse, mais au moins c'est plutôt simple à faire .


0

Vous ne pouvez pas le faire avec les formulaires Google habituels.

Vous pouvez cependant créer votre propre interface graphique à l'aide de Google Apps Script , et en particulier du service UIS . Sachez cependant que vous devrez recréer l'intégralité de l'interface graphique - vous ne pouvez pas utiliser des parties de votre formulaire existant.

Alternativement, vous pouvez utiliser le GUI Builder . Il s'agit d'un éditeur WYSIWYG pour les interfaces graphiques de script Google Apps.

Quel que soit votre choix, vous devez être prêt à faire de la programmation pour atteindre ce que vous voulez.


1
Le GUI Builder est obsolète, donc je ne l'utiliserais plus.
Jacob Jan Tuinstra

L'UIService est également obsolète.
Rubén


0

Il existe un moyen d'automatiser la mise à jour de la liste en définissant un déclencheur [ 1 ] [ 2 ] pour Update Lists.

Le chemin est Script Editor -> Resources -> Déclencheurs du projet en cours

Ensuite, add a new trigger. Pour les exemples donnés, vous pouvez définir updatesListpour exécuter from spreadsheetet On form submission. De cette façon, la fonction onOpenne sera pas nécessaire.


-1

Oui, cela peut être fait, j'ai passé une bonne partie de la journée à trouver la réponse, puis à la développer pour mes besoins, mais cela peut être fait.

Mon besoin était d'avoir un formulaire d'inscription pour que les gens puissent cocher plusieurs cases d'une liste de domaines qu'ils aimeraient proposer. Par conséquent, une question avec plusieurs cases, le problème est que la feuille de calcul Google résultante vient de répertorier tout ce qu'ils ont vérifié dans une cellule. Il y avait 21 options de bénévolat, ce qui ne serait clairement pas un format utile pour cette information. Je voulais faire ce que j'ai compris que vous vouliez dire, je voulais avoir une colonne avec chacune des 21 options dans une colonne qui lui est propre. Ensuite, à côté de leur horodatage (formulaire généré), de leur nom, de leur adresse e-mail et de leur téléphone, il y a 21 colonnes avec "oui" ou laissées en blanc. L'en-tête de colonne est chaque option qu'ils pourraient choisir. Certains pourraient se demander pourquoi ne pas simplement poser 21 questions avec «oui» ou «non».

Notez d'abord que lorsque quelqu'un remplit un formulaire Google, la feuille de calcul résultante insère une ligne plutôt que d'ajouter les données à la ligne vide suivante. Cela signifie que toutes les formules qui se trouvaient sur la ligne viennent d'être tronquées et que les nouvelles données de la formule n'ont aucune formule à côté des deux pour fonctionner avec les données d'entrée. Pour aller au-delà, j'ai ajouté une feuille à la feuille de calcul (classeur). J'ai utilisé les commentaires de brettathds sur http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw J'ai donc inséré la formule suivante dans la cellule A1 de cette 2e feuille: = ARRAYFORMULA (feuille1! A1: A). J'ai fait la même chose pour chaque colonne jusqu'à la colonne E. La colonne E contient la question avec les 21 cases à cocher.

Toujours sur la deuxième feuille, la ligne 1 des colonnes FY avait des en-têtes identiques au texte de chaque option de case à cocher de la liste de contrôle des domaines qu'ils sont prêts à proposer. Ensuite, la colonne Z était la prochaine et dernière question du formulaire, c'était une question textuelle courte qui était juste intitulée "Commentaires supplémentaires". Pour cette colonne, j'ai utilisé le = ARRAYFORMULA (Sheet1! F1: F), je l'ai fait comme une question distincte plutôt que d'utiliser l'option "autre" à la fin des questions de la case à cocher car il ne semblait pas être un bon moyen de tirer cela. les données dans la feuille de calcul.

Passons maintenant à la partie qui répond comment obtenir les informations de la cellule de la colonne E (qui peut avoir jusqu'à 21 éléments répertoriés) pour séparer les colonnes par "oui" ou simplement en blanc. La formule dans F2 sur la deuxième feuille est = iferror (if (recherche (F $ 1, $ E2)> 0, "Oui",)) Cette formule cherche à voir si le texte exact dans l'en-tête de colonne (F1) est trouvé dans E2, si c'est le cas, il retourne un "Oui", sinon il le laisse vide.

Cette formule référencée dans F2 est écrite (en utilisant "$", via la touche F4) afin que F2 puisse être copié / collé dans chaque cellule de la ligne 2 de GY (Google Spreadsheet ne prend pas en charge la copie de formules par glisser / copier comme vous le pouvez) dans Excel, mais cela peut être fait en sélectionnant F2, puis CTRL + C, puis sélectionnez G2: Y2, puis CTRL + V). J'utilise ensuite la même copie de méthodologie collée F2: Y2 à F3: Y100.

J'ai ensuite caché la colonne E sur la deuxième feuille afin que la feuille de calcul résultante soit plus compacte (en évitant tout envelopper des réponses longues).

Maintenant, je suis prêt à recevoir 99 bénévoles via le formulaire rapide et facile qu'ils remplissent. L'utilisation des options de filtre en haut des colonnes a également aidé à voir qui était disponible pour quelles zones.

Une dernière frustration que je n'ai pas résolu. J'ai rempli quelques faux formulaires pour tester mes formules et ma conception, puis j'ai supprimé ces lignes de la feuille de calcul liée. J'ai également eu quelques personnes qui ont rempli des formulaires en double, j'ai également supprimé leurs lignes. À noter dans les forums de produits, je ne suis pas le seul frustré d'apprendre que Google a toujours les données de test / faux / en double câblées dans le "Résumé des réponses" (trouvé sous l'onglet "Formulaire" de la feuille de calcul). Par conséquent, le résumé des réponses est inutile pour la précision s'il y a eu des lignes supprimées pour supprimer les données des formulaires de test / faux / dupliqués.

Mais c'est accompli et j'enregistre ces notes pour la prochaine fois que j'en ai besoin, je suis convaincu que cela pourrait facilement être fait en moins de 30 minutes la prochaine fois.

J'espère que cela vous aidera, faites-moi savoir si vous avez des questions.


2
Ça fait beaucoup de texte.
Jacob Jan Tuinstra

Bravo pour l'effort
Saariko
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.