Apakah ada cara untuk menautkan pertanyaan gaya "Pilih dari daftar" dalam Formulir Google ke daftar data (misalnya dalam spreadsheet)?

10

Apakah ada cara untuk menautkan pertanyaan gaya "Pilih dari daftar" dalam formulir ke daftar data (mis. Dalam spreadsheet)?

Ini berarti bahwa ketika opsi baru ditambahkan ke daftar di spreadsheet (atau di mana pun dimungkinkan untuk meng-host daftar), mereka akan secara otomatis muncul sebagai opsi untuk memilih dalam formulir di masa mendatang.

Dalam kasus saya, itu berarti bahwa responden yang mengisi formulir akan dapat memilih sukarelawan mana yang hadir pada sesi sukarelawan tertentu dari daftar sukarelawan yang komprehensif (daripada mengetik setiap nama secara individu), tetapi karena sukarelawan bergabung secara sporadis, maka akan sangat membantu jika memungkinkan untuk menambahkan ini ke opsi pada daftar secara otomatis daripada menambahkan opsi baru secara manual setiap kali.

Saya tidak tahu apakah ini mungkin tapi saya akan sangat menghargai jika ada yang bisa menyarankan cara melakukannya.

andy
sumber
Buruknya

Jawaban:

3

Jawaban Tom Horwood bekerja dengan baik, tetapi hanya setelah memperbaiki kesalahan penting dalam kodenya. Semua referensi ke LIST_DATAelemen harus dibuat menggunakan indeks j(bukan i). Saya tidak memiliki karma yang cukup untuk mengomentari posting Tom jadi inilah monty sepenuhnya:

Di bawah ini adalah kode yang diperbaiki. Saya juga mengubah nama LIST_DATAelemen sehingga sedikit lebih deskriptif. Ini juga menunjukkan bagaimana Tom berpikir ke depan (pujian!) Dan menyediakan fasilitas untuk memperbarui lebih dari satu elemen bentuk dengan isi lebih dari satu daftar spreadsheet.

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

Untuk meringkas cara agar ini berfungsi (bagi mereka, seperti saya, yang menggunakan Google Apps Script untuk pertama kalinya). Saya telah merujuk nama lembar dan nama bidang formulir dalam cuplikan kode di atas agar mudah dimengerti:

  1. Di spreadsheet yang dikaitkan dengan formulir Anda:

    • Buat lembar kerja baru. Ini akan berisi daftar item yang ingin Anda tambahkan ke bidang. Berikan lembar kerja nama yang sesuai (misalnya, TaskCategories). Letakkan daftar barang Anda di sana di kolom pertama lembar kerja itu. Hapus semua kolom dan baris tambahan pada lembar itu (ini mungkin atau mungkin tidak perlu - belum diuji)
    • Dari menu Alat, pilih "Editor Skrip". Salin dan tempel cuplikan kode di atas ke dalam editor skrip. Anda perlu mengubah bagian skrip berikut:
      • Nilai variabel FORMIDperlu diubah ke ID formulir Anda. ID adalah kode panjang (antara garis miring) di bilah URL di browser Anda untuk formulir yang diinginkan.
      • The LIST_DATAvariabel akan perlu dimodifikasi sesuai bentuk dan kebutuhan Anda. Anda akan perhatikan bahwa setiap item dalam LIST_DATAadalah tupel dari formFieldTitledan worksheetName. Yang pertama adalah nama bidang formulir (yang harus berupa jenis "pilih dari daftar") - dalam editor formulir itu disebut Question Title. Yang terakhir adalah nama lembar kerja yang Anda buat sebelumnya yang berisi daftar item yang ingin Anda isi bidangnya. Tambahkan sebanyak mungkin tupel ini ke daftar yang Anda butuhkan.
      • Sekarang simpan skripnya (Klik ikon simpan)
      • Uji skrip dengan memilih 'Jalankan' dari menu editor skrip dan pilih "updateLists". Pertama kali Anda melakukan ini, ia akan meminta izin. Jika skrip berhasil maka Anda dapat mengamati bahwa formulir Anda sekarang memiliki bidang yang ditentukan diisi, jika tidak Anda akan mencatat pesan kesalahan di layar.
  2. Jika Anda kembali ke spreadsheet, Anda akan melihat item menu baru yang berjudul List Updater. Ini memiliki satu item Update Listsyang harus Anda jalankan setiap kali Anda mengubah lembar kerja daftar Anda - itu akan memperbarui formulir yang sesuai.

Saya juga mencatat, untuk kepentingan pembaca, bahwa FormRanger tidak berfungsi dengan Google Spreadsheets baru. Pengembang FormRanger mengatakan banyak hal di situs web mereka. Mungkin / mudah-mudahan itu akan berubah di masa depan, tetapi pada saat posting ini kode di atas berfungsi untuk saya dan saya menggunakannya dalam bentuk yang dikerahkan untuk klien.

semuanya alami
sumber
Saya pikir ini adalah jawaban yang bagus untuk memasukkan langkah demi langkah bagi mereka yang tidak memiliki pengalaman mengaitkan skrip atau apa pun. Juga, untuk pilih-pilih pada pemformatan kode js tambahkan titik koma setelah inisialisasi array LIST_DATA. Sekarang untuk menyesuaikannya lebih lanjut, seperti jika Anda memiliki kolom tajuk, gunakan "untuk (var i = 1; i <data.length; i + = 1) {// Lewati baris tajuk dengan memulai indeks pada 1."
Gary
Diedit untuk memperbaiki titik koma yang hilang - terima kasih @Gary untuk memperhatikan :-)
allnatural
2

Anda dapat melakukan ini dengan bentuk normal dan skrip, menggunakan Form.getItems (), cari item dalam loop, lalu Item.asListItem (). SetChoices (...)

Berikut adalah beberapa kode contoh, yang telah saya gunakan dalam lembar dan formulir contoh ini

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
sumber
Tautan formulir sekarang diperbaiki
Tom Horwood
1

Ada add-on Google Forms yang disebut Form Values yang setidaknya menawarkan cara semi-otomatis: setiap kali Anda mengubah jawaban Anda dalam spreadsheet, Anda perlu mengisi ulang secara manual pilihan dalam jawaban Anda, tetapi setidaknya itu agak mudah dilakukan .

kynan
sumber
0

Anda tidak dapat melakukan ini dengan Formulir Google biasa.

Anda dapat, bagaimanapun, membuat GUI Anda sendiri dengan menggunakan Google Apps Script , dan khususnya layanan UIS . Perlu diketahui, bahwa Anda harus membuat ulang seluruh GUI - Anda tidak dapat menggunakan bagian dari formulir yang ada.

Atau, Anda dapat menggunakan Pembuat GUI . Ini adalah editor WYSIWYG untuk Google Apps Script GUI.

Yang mana pun yang Anda pilih, Anda harus siap untuk melakukan pemrograman untuk mencapai apa yang Anda inginkan.

Vidar S. Ramdal
sumber
1
Builder GUI sudah usang, jadi saya tidak akan menggunakannya lagi.
Jacob Jan Tuinstra
Layanan UIS juga sudah usang.
Rubén
0

Ada cara untuk mengotomatiskan pembaruan daftar dengan menetapkan Pemicu [ 1 ] [ 2 ] untuk Update Lists.

Jalannya adalah Editor Skrip -> Sumber Daya -> pemicu proyek saat ini

Lalu add a new trigger,. Untuk contoh yang diberikan, Anda dapat mengatur updatesListuntuk menjalankan from spreadsheetdan On form submission. Dengan cara ini, fungsi onOpentidak diperlukan.

Nayuki Pereira Hara
sumber
-1

Ya itu bisa dilakukan, menghabiskan sebagian besar hari mencari jawaban dan kemudian mengembangkannya untuk tujuan saya, tetapi itu bisa dilakukan.

Kebutuhan saya adalah memiliki formulir pendaftaran sukarela bagi orang-orang untuk memeriksa beberapa kotak dari daftar area yang mereka ingin relawan. Karena itu satu pertanyaan dengan banyak kotak, masalahnya adalah bahwa spreadsheet Google yang dihasilkan hanya mencantumkan semua yang mereka periksa dalam satu sel. Ada 21 opsi sukarela, sehingga jelas tidak akan menjadi format yang berguna untuk informasi itu. Saya ingin melakukan apa yang saya mengerti Anda mengatakan Anda inginkan, saya ingin memiliki kolom dengan masing-masing dari 21 opsi di kolomnya sendiri. Kemudian di sebelah Timestamp mereka (formulir dihasilkan), nama, email, dan telepon ada 21 kolom dengan "ya" atau dibiarkan kosong. Judul kolom adalah setiap opsi yang dapat mereka pilih. Beberapa orang mungkin bertanya-tanya mengapa tidak hanya memiliki 21 pertanyaan dengan "ya" atau "tidak".

Perhatikan pertama bahwa ketika seseorang mengisi formulir google, spreadsheet yang dihasilkan menyisipkan baris daripada menambahkan data ke baris kosong berikutnya. Ini berarti bahwa setiap rumus yang ada di baris baru saja dihancurkan dan data baru dari rumus tidak memiliki rumus di sebelahnya untuk bekerja dengan data input. Untuk mengatasi ini saya menambahkan lembar ke spreadsheet (buku kerja). Saya menggunakan input dari brettathds di http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw. Karena itu saya memasukkan formula berikut ke dalam Sel A1 pada lembar ke-2 ini: = ARRAYFORMULA (Sheet1! A1: A). Saya melakukan hal yang sama untuk setiap kolom melalui kolom E. Kolom E memiliki pertanyaan dengan 21 kotak centang.

Masih di lembar kedua, Baris 1 Kolom TA memiliki tajuk yang identik dengan teks pada setiap opsi kotak centang dari daftar centang bidang yang mereka rela sukarela. Kemudian Kolom Z adalah pertanyaan berikutnya dan terakhir pada formulir, itu adalah pertanyaan teks pendek yang baru saja berjudul "Komentar Tambahan". Untuk kolom itu saya menggunakan = ARRAYFORMULA (Sheet1! F1: F) Saya melakukan ini sebagai pertanyaan terpisah daripada menggunakan opsi "lain" di akhir pertanyaan kotak centang karena tampaknya tidak ada cara yang baik untuk menarik itu data ke dalam spreadsheet.

Sekarang ke bagian yang menjawab bagaimana Anda mendapatkan info dari sel di kolom E (yang bisa memuat hingga 21 item) untuk memisahkan kolom dengan "ya" atau hanya kosong. Rumus dalam F2 pada lembar kedua adalah = iferror (if (search (F $ 1, $ E2)> 0, "Ya",)) Rumus ini mencari untuk melihat apakah teks yang tepat di header kolom (F1) ditemukan di E2, jika sudah maka ia mengembalikan "Ya", jika tidak dibiarkan kosong.

Rumus ini yang dirujuk dalam F2 ditulis (menggunakan "$", melalui tombol F4) sehingga F2 dapat disalin / ditempelkan ke setiap sel di baris 2 dari GY (Google Spreadsheet tidak mendukung penyalinan rumus dengan menyeret / menyalin sebanyak yang Anda bisa di Excel, tapi itu bisa dilakukan dengan memilih F2, lalu CTRL + C, lalu pilih G2: Y2, lalu CTRL + V). Saya kemudian menggunakan salinan metodologi yang sama ditempelkan F2: Y2 ke F3: Y100.

Saya kemudian menyembunyikan Kolom E pada lembar kedua sehingga spreadsheet yang dihasilkan lebih kompak (menghindari semua bungkus dari jawaban yang panjang).

Sekarang saya siap menerima 99 sukarelawan melalui formulir cepat dan mudah yang mereka selesaikan. Memanfaatkan opsi filter di bagian atas kolom juga membantu untuk melihat siapa yang tersedia untuk bidang apa.

Satu frustrasi terakhir yang saya tidak dapatkan diselesaikan. Saya menyelesaikan beberapa formulir palsu untuk menguji rumus dan desain saya, saya kemudian menghapus baris-baris itu dari spreadsheet yang ditautkan. Saya juga memiliki beberapa orang yang menyelesaikan formulir duplikat, saya juga menghapus baris mereka. Patut dicatat di forum produk, saya bukan satu-satunya yang frustrasi mengetahui bahwa entah bagaimana Google masih memiliki data uji / palsu / duplikat yang ditransfer ke "Ringkasan Tanggapan" (ditemukan di bawah tab "Formulir" pada spreadsheet). Oleh karena itu ringkasan tanggapan tidak berguna untuk akurasi jika ada baris yang dihapus untuk menghapus data dari test / palsu / formulir duplikat.

Tapi itu selesai dan saya menyimpan catatan ini untuk waktu berikutnya saya perlu serupa, saya yakin bahwa itu dapat dengan mudah dilakukan dalam waktu kurang dari 30 menit di waktu berikutnya.

Semoga ini bisa membantu, beri tahu saya jika ada pertanyaan.

pengguna37987
sumber
2
Itu banyak teks.
Jacob Jan Tuinstra
Kudos for the effort
Saariko