Esiste un modo per collegare una domanda di stile "Scegli da un elenco" in un Modulo Google a un elenco di dati (ad esempio in un foglio di calcolo)?


10

Esiste un modo per collegare una domanda di stile "Scegli da un elenco" in un modulo a un elenco di dati (ad esempio in un foglio di calcolo)?

Ciò significherebbe che quando nuove opzioni venivano aggiunte all'elenco nel foglio di calcolo (o ovunque fosse possibile ospitare l'elenco), sarebbero automaticamente visualizzate come un'opzione da selezionare nel modulo in futuro.

Nel mio caso significherebbe che gli intervistati compilando il modulo sarebbero in grado di selezionare quali volontari erano presenti in quella particolare sessione di volontariato dall'elenco completo dei volontari (piuttosto che digitare ogni nome singolarmente), ma poiché i volontari si uniscono sporadicamente, sarebbe estremamente utile se fosse possibile aggiungerli automaticamente alle opzioni nell'elenco anziché aggiungere una nuova opzione manualmente ogni volta.

Non ho idea se questo sia possibile, ma lo apprezzerei davvero se qualcuno potesse suggerire un modo per farlo.


Peccato, non sei in giro per vedere tutte le risposte date ....
Jacob Jan Tuinstra,

Risposte:


3

La risposta di Tom Horwood funziona alla grande, ma solo dopo aver corretto un errore importante nel suo codice. Tutti i riferimenti agli LIST_DATAelementi devono essere fatti usando l'indice j(non i). Non ho abbastanza karma per commentare il post di Tom, quindi ecco il messaggio completo:

Di seguito è riportato il codice corretto. Ho anche cambiato il nome degli LIST_DATAelementi in modo che siano un po 'più descrittivi. Mostra anche come Tom aveva pensato al futuro (complimenti!) E fornito la possibilità di aggiornare più di un elemento del modulo con i contenuti di più di un elenco di fogli di calcolo.

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

Riassumendo come farlo funzionare (per quelli, come me, che utilizzano Google Apps Script per la prima volta). Ho fatto riferimento ai nomi dei fogli e ai nomi dei campi dei moduli nello snippet di codice sopra per renderlo più comprensibile:

  1. Nel foglio di calcolo associato al modulo:

    • Crea un nuovo foglio di lavoro. Questo conterrà l'elenco di elementi che desideri aggiungere a un campo. Assegna al foglio di lavoro un nome adatto (ad esempio, TaskCategories). Inserisci il tuo elenco di elementi lì nella prima colonna di quel foglio di lavoro. Elimina tutte le colonne e le righe aggiuntive su quel foglio (questo può o non può essere necessario - non testato)
    • Dal menu Strumenti, selezionare "Script Editor". Copia e incolla il frammento di codice sopra nell'editor di script. Dovrai modificare le seguenti parti dello script:
      • Il valore della variabile FORMIDdovrà essere modificato nell'ID del modulo. L'ID è il codice lungo (tra le barre) nella barra dell'URL nel browser per il modulo desiderato.
      • La LIST_DATAvariabile dovrà essere modificata per adattarla al tuo modulo e alle tue esigenze. Noterai che ogni elemento in LIST_DATAè una tupla di formFieldTitlee worksheetName. Il primo è il nome del campo modulo (che deve essere un tipo di campo "scegli dalla lista") - nell'editor del modulo viene chiamato Question Title. Quest'ultimo è il nome del foglio di lavoro creato in precedenza che contiene l'elenco di elementi con cui si desidera popolare il campo. Aggiungi tutte queste tuple all'elenco di cui hai bisogno.
      • Ora salva lo script (fai clic sull'icona di salvataggio)
      • Prova lo script scegliendo 'Esegui' dal menu dell'editor degli script e selezionando "updateLists". La prima volta che lo fai ti verrà chiesto il permesso. Se lo script ha esito positivo, puoi osservare che ora il modulo ha i campi specificati popolati, altrimenti noterai un messaggio di errore sullo schermo.
  2. Se ritorni al foglio di calcolo, dovresti visualizzare una nuova voce di menu dal titolo List Updater. Ha un elemento Update Listsche devi eseguire ogni volta che modifichi uno dei tuoi fogli di lavoro della tua lista (e) - aggiornerà il modulo di conseguenza.

Noto anche, a beneficio dei lettori, che FormRanger non funziona con i nuovi fogli di calcolo di Google. Gli sviluppatori di FormRanger lo dicono sul loro sito web. Forse / speriamo che cambierà in futuro, ma come al momento di pubblicare questo codice il codice sopra funziona per me e lo sto usando in un modulo distribuito per un client.


Penso che questa sia un'ottima risposta per includere passo dopo passo coloro che non hanno esperienza nell'associare una sceneggiatura o altro. Inoltre, per essere pignoli sulla formattazione del codice js aggiungere un punto e virgola dopo l'inizializzazione dell'array LIST_DATA. Ora per personalizzarlo di più, come se avessi una colonna di intestazione usa "for (var i = 1; i <data.length; i + = 1) {// Salta la riga di intestazione iniziando l'indice a 1."
Gary,

Modificato per correggere il punto e virgola mancante - grazie @Gary per aver notato :-)
allnatural

2

Puoi farlo con un modulo normale e uno script, usando Form.getItems (), trova l'elemento in loop, quindi Item.asListItem (). SetChoices (...)

Ecco un po 'di codice di esempio, che ho usato in questo foglio e modulo di esempio

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

Il link al modulo è stato corretto
Tom Horwood,

1

Esiste un componente aggiuntivo di Google Forms chiamato Form Values che offre almeno un modo semi-automatico: ogni volta che cambi le tue risposte nel foglio di lavoro devi ripopolare manualmente le scelte nella tua risposta, ma almeno è piuttosto semplice da fare .


0

Non puoi farlo con i normali moduli Google.

Puoi, tuttavia, creare la tua GUI personalizzata utilizzando Google Apps Script e in particolare UIService . Tieni presente, tuttavia, che dovrai ricreare l'intera GUI: non puoi utilizzare parti del modulo esistente.

In alternativa, è possibile utilizzare GUI Builder . È un editor WYSIWYG per le GUI di Google Apps Script.

Qualunque sia la tua scelta, dovresti essere pronto a fare un po 'di programmazione per ottenere ciò che desideri.


1
Il GUI Builder è obsoleto, quindi non lo userei più.
Jacob Jan Tuinstra,

Anche UIService è obsoleto.
Rubén


0

C'è un modo per automatizzare l'aggiornamento dell'elenco impostando un trigger [ 1 ] [ 2 ] per Update Lists.

Il percorso è Script Editor -> Risorse -> Trigger del progetto corrente

Poi, add a new trigger. Per gli esempi forniti, è possibile impostare updatesListl'esecuzione from spreadsheete On form submission. In questo modo, la funzione onOpennon sarà necessaria.


-1

Sì, può essere fatto, ho trascorso buona parte della giornata a trovare la risposta e poi a svilupparla per i miei scopi, ma può essere fatta.

Il mio bisogno era di avere un modulo di iscrizione volontario per consentire alle persone di selezionare più caselle da un elenco di aree in cui vorrebbero fare volontariato. Pertanto una domanda con più caselle, il problema è che il foglio di calcolo di Google risultante ha appena elencato tutto ciò che ha controllato in una cella. C'erano 21 opzioni di volontariato, quindi chiaramente non sarebbe stato un formato utile per quelle informazioni. Volevo fare quello che ti ho capito dire che volevi, volevo avere una colonna con ciascuna delle 21 opzioni in una colonna a sé stante. Quindi accanto al loro Timestamp (modulo generato), nome, e-mail e telefono ci sono 21 colonne con "sì" o lasciato in bianco. L'intestazione della colonna è ogni opzione che potrebbero scegliere. Alcuni potrebbero chiedersi perché non avere solo 21 domande con "sì" o "no".

Innanzitutto, quando qualcuno completa un modulo Google, il foglio di calcolo risultante inserisce una riga anziché aggiungere i dati alla successiva riga vuota. Ciò significa che tutte le formule che si trovavano nella riga sono state appena eliminate e i nuovi dati della formula non hanno una formula successiva per funzionare con i dati di input. Per andare oltre ho aggiunto un foglio al foglio di lavoro (cartella di lavoro). Ho utilizzato input da brettathds su http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw Ho quindi inserito la seguente formula nella cella A1 di questo secondo foglio: = ARRAYFORMULA (Foglio1! A1: A). Ho fatto simili per ogni colonna attraverso la colonna E. La colonna E ha la domanda con le 21 caselle di controllo.

Sempre sul secondo foglio, la riga 1 delle colonne FY aveva intestazioni identiche al testo su ciascuna opzione della casella di controllo dalla lista di controllo delle aree che sono disposte a fare volontariato. Quindi la colonna Z è stata la domanda successiva e l'ultima del modulo, è stata una breve domanda di testo che è stata appena intitolata "Commenti aggiuntivi". Per quella colonna ho usato il = ARRAYFORMULA (Foglio1! F1: F) L'ho fatto come una domanda separata piuttosto che utilizzare l'opzione "altro" alla fine delle domande della casella di controllo in quanto non sembrava essere un buon modo per estrarlo dati nel foglio di calcolo.

Ora alla parte che risponde come si ottengono le informazioni dalla cella nella colonna E (che potrebbe avere fino a 21 elementi elencati) per separare le colonne con "sì" o semplicemente vuoto. La formula in F2 sul secondo foglio è = iferror (if (cerca (F $ 1, $ E2)> 0, "Sì",)) Questa formula sta cercando di vedere se è stato trovato il testo esatto nell'intestazione di colonna (F1) in E2, se lo è, restituisce un "Sì", in caso contrario lo lascia vuoto.

Questa formula a cui fa riferimento F2 è scritta (utilizzando "$", tramite il tasto F4) in modo che F2 possa essere copiato / incollato in ogni cella della riga 2 da GY (Google Spreadsheet non supporta la copia di formule trascinandole / copiandole come puoi in Excel, ma è possibile farlo selezionando F2, quindi CTRL + C, quindi selezionare G2: Y2, quindi CTRL + V). Quindi utilizzando la stessa metodologia copia incollata da F2: Y2 a F3: Y100.

Ho quindi nascosto la colonna E sul secondo foglio in modo che il foglio di calcolo risultante fosse più compatto (evitando tutto l'avvolgimento delle risposte lunghe).

Ora sono pronto a ricevere 99 volontari tramite il modulo rapido e semplice che completano. L'utilizzo delle opzioni di filtro nella parte superiore delle colonne ha anche aiutato a vedere chi era disponibile per quali aree.

Un'ultima frustrazione che non mi sono risolto. Ho completato alcuni moduli fasulli per testare le mie formule e il design, quindi ho eliminato quelle righe dal foglio di calcolo collegato. Ho avuto anche alcune persone che hanno compilato moduli duplicati, ho anche eliminato le loro righe. Degno di nota nei forum sui prodotti, non sono il solo frustrato nell'apprendere che in qualche modo Google ha ancora i dati di test / fasulli / duplicati collegati nel "Riepilogo delle risposte" (che si trova nella scheda "Modulo" del foglio di calcolo). Pertanto, il riepilogo delle risposte è inutile per l'accuratezza se sono state eliminate righe per rimuovere i dati dai moduli test / fasulli / duplicati.

Ma è realizzato e sto salvando queste note per la prossima volta che ho bisogno di simili, sono fiducioso che potrebbe essere fatto facilmente in meno di 30 minuti la prossima volta.

Spero che questo ti aiuti, fammi sapere se hai qualche domanda.


2
È un sacco di testo.
Jacob Jan Tuinstra,

Complimenti per lo sforzo
Saariko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.