Bir Google Formundaki "Listeden seç" tarzı bir soruyu veri listesine (örneğin bir e-tabloda) bağlamanın bir yolu var mı?


10

Bir formdaki "Listeden seç" tarzı bir soruyu veri listesine (örneğin bir e-tabloda) bağlamanın bir yolu var mı?

Bu, e-tablodaki listeye yeni seçenekler eklendikçe (veya listeyi barındırmanın mümkün olduğu her yerde), gelecekte formda seçim yapma seçeneği olarak otomatik olarak görünecekleri anlamına gelir.

Benim durumumda, formu dolduran katılımcıların, hangi gönüllü oturumda mevcut olan gönüllüleri kapsamlı gönüllü listesinden seçebilecekleri anlamına gelecektir (her adı ayrı ayrı yazmak yerine), ancak gönüllüler ara sıra katıldıkları için, bunları her seferinde manuel olarak yeni bir seçenek eklemek yerine otomatik olarak listedeki seçeneklere eklemek mümkün olsaydı çok yardımcı olurdu.

Bunun mümkün olup olmadığı hakkında hiçbir fikrim yok, ancak bunu yapmanın bir yolunu önerebilirse gerçekten takdir ediyorum.


Kötü, verilen tüm cevabı görmek için etrafında değilsiniz ....
Jacob Jan Tuinstra

Yanıtlar:


3

Tom Horwood'un cevabı harika çalışıyor, ancak yalnızca kodundaki önemli bir hatayı düzelttikten sonra. LIST_DATAElemanlara yapılan tüm atıflar indeks kullanılarak yapılmalıdır j(değil i). Tom'un gönderisine yorum yapmak için yeterli karmam yok, bu yüzden tam olarak monty:

Düzeltilmiş kod aşağıdadır. LIST_DATAÖğelerin adını da değiştirdim, böylece biraz daha açıklayıcı olacaklar. Ayrıca Tom'un nasıl düşündüğünü (kudos!) Ve birden fazla form öğesini birden fazla e-tablo listesinin içeriğiyle güncellemesini sağladığını gösterir.

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

Bunun nasıl çalışacağını özetlemek için (benim gibi Google Apps Script'i ilk kez kullananlar için). Umarım daha anlaşılır hale getirmek için yukarıdaki kod pasajında ​​sayfa adlarına ve form alanı adlarına başvurdum:

  1. Formunuzla ilişkilendirilmiş e-tabloda:

    • Yeni bir çalışma sayfası oluşturun. Bu, bir alana eklemek istediğiniz öğelerin listesini içerir. Çalışma sayfasına uygun bir ad verin (örneğin, TaskCategories). Öğe listenizi o çalışma sayfasının ilk sütununa yerleştirin. Bu sayfadaki tüm fazladan sütunları ve satırları silin (bu gerekli olabilir veya olmayabilir - test edilmemiştir)
    • Araçlar menüsünden "Komut Dosyası Düzenleyicisi" ni seçin. Yukarıdaki kod snippet'ini kopyalayıp komut dosyası düzenleyicisine yapıştırın. Komut dosyasının aşağıdaki bölümlerini değiştirmeniz gerekecektir:
      • Değişken değerinin FORMIDformunuzun kimliğiyle değiştirilmesi gerekir. Kimlik, istenen form için tarayıcınızdaki URL çubuğundaki uzun eğik çizgi (eğik çizgiler arasında).
      • LIST_DATADeğişken formunuzu ve ihtiyaçlarınıza göre modifiye edilmesi gerekecektir. Her ürün dikkat edeceğiz LIST_DATAbir başlık olur formFieldTitleve worksheetName. Birincisi, form alanının adıdır (bu, "listeden seç" alan türü olmalıdır) - adlandırılan form düzenleyicide Question Title. İkincisi, daha önce oluşturduğunuz ve alanı doldurmak istediğiniz öğelerin listesini içeren çalışma sayfasının adıdır. Bu tuple'ların çoğunu istediğiniz kadar listeye ekleyin.
      • Şimdi betiği kaydedin (Kaydet simgesine tıklayın)
      • Komut dosyası düzenleyici menüsünden 'Çalıştır'ı seçip "güncellemeListeleri" ni seçerek komut dosyasını test edin. Bunu ilk kez yaptığınızda izin isteyecektir. Komut dosyası başarılı olursa, formunuzda artık belirtilen alanların doldurulduğunu gözlemleyebilirsiniz, aksi takdirde ekranda bir hata iletisi görürsünüz.
  2. E-tabloya dönerseniz, başlıklı yeni bir menü öğesi görmeniz gerekir List Updater. Update ListsListe (ler) inizin çalışma sayfalarından herhangi birini her değiştirdiğinizde çalıştırmanız gereken bir öğe vardır - formu buna göre güncelleyecektir.

Ayrıca, okuyucuların yararına FormRanger'ın yeni Google E-Tablolar ile çalışmadığını da not ediyorum. FormRanger geliştiricileri web sitelerinde de bunu söylerler. Belki / umarım bu gelecekte değişecek, ancak bu gönderme sırasında yukarıdaki kod benim için çalışıyor ve ben bir istemci için konuşlandırılmış bir formda kullanıyorum.


Bence bu bir senaryo veya herhangi bir şey ilişkilendirme deneyimi olmayanlar için adım adım dahil etmek için harika bir cevap. Ayrıca, js kodu biçimlendirmesi seçici olmak için LIST_DATA dizi başlatma işleminden sonra noktalı virgül ekleyin. Şimdi daha fazla özelleştirmek için, başlık sütununuz varsa "kullanın (var i = 1; i <data.length; i + = 1) {// Dizini 1'den başlayarak başlık satırını atla"
Gary

Eksik noktalı virgül düzeltildi - fark ettiğiniz için teşekkürler @Gary :-)
allnatural

2

Bunu normal bir form ve bir komut dosyasıyla Form.getItems () kullanarak yapabilir, öğeyi döngüde bulabilir, ardından Item.asListItem (). SetChoices (...)

Bu örnek sayfada ve formda kullandığım bazı örnek kodlar

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

Form bağlantısı düzeltildi
Tom Horwood

1

En azından yarı otomatik bir yol sunan Form Değerleri adlı bir Google Form eklentisi vardır : e-tablodaki yanıtlarınızı her değiştirdiğinizde, cevabınızdaki seçenekleri manuel olarak yeniden doldurmanız gerekir, ancak en azından bunu yapmak oldukça kolaydır. .


0

Bunu normal Google Formlar ile yapamazsınız.

Bununla birlikte, Google Apps Komut Dosyasını ve özellikle UIService'i kullanarak kendi GUI'nizi oluşturabilirsiniz . Bununla birlikte, GUI'nin tamamını yeniden oluşturmanız gerekeceğini unutmayın - mevcut formunuzdaki parçaları kullanamazsınız.

Alternatif olarak, GUI Builder'ı kullanabilirsiniz . Google Apps Komut Dosyası GUI'leri için bir WYSIWYG düzenleyicisidir.

Hangisini seçerseniz seçin, istediğinizi elde etmek için bazı programlama yapmaya hazır olmalısınız.


1
GUI Builder kullanımdan kaldırıldı, bu yüzden artık bunu kullanmazdım.
Jacob Jan Tuinstra

UIService de kullanımdan kaldırıldı.
Rubén


0

İçin bir Tetikleyici [ 1 ] [ 2 ] ayarlayarak liste güncellemesini otomatikleştirmenin bir yolu vardır Update Lists.

Yol Komut Dosyası Düzenleyicisi -> Kaynaklar -> Mevcut projenin tetikleyicileri

Sonra add a new trigger. Verilen örnekler için ayarlayabileceğiniz updatesListçalıştırmak için from spreadsheetve On form submission. Bu şekilde işleve onOpenihtiyaç duyulmaz.


-1

Evet, yapılabilir, günün büyük bir bölümünü cevabı bulmak ve daha sonra benim amacım için geliştirmek, ancak yapılabilir.

İhtiyacım insanların gönüllü olmak istedikleri alanların listesinden birden fazla kutuyu kontrol etmeleri için gönüllü kayıt formuna sahip olmaktı. Bu nedenle, birden fazla kutu içeren bir soru, sorun, ortaya çıkan Google e-tablosunun kontrol ettikleri her şeyi bir hücrede listelemesidir. 21 gönüllü seçeneği vardı, bu yüzden bu bilgi için yararlı bir format olmayacaktı. İstediğini söylemek istediğini anladığımı yapmak istedim, 21 seçeneğin her birinin kendi sütununda bir sütun olmasını istedim. Ardından Zaman Damgası (form oluşturuldu), ad, e-posta ve telefonun yanında "evet" veya boş bırakılan 21 sütun bulunur. Sütun başlığı seçebilecekleri her seçenektir. Bazıları neden sadece "evet" veya "hayır" ile ilgili 21 soru olmadığını merak ediyor olabilir.

Birisi bir google formunu doldurduğunda, sonuçtaki e-tablonun bir sonraki boş satıra veri eklemek yerine bir satır eklediğini unutmayın. Bu, satırda bulunan formüllerin yeni oluşturulduğunu ve formüldeki yeni verilerin, giriş verileriyle çalışmak için sonraki iki formülü olmadığı anlamına gelir. Bunun ötesine geçmek için e-tabloya (çalışma kitabı) bir sayfa ekledim. Http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw adresindeki brettathds girdisini kullandım, bu nedenle aşağıdaki formülü bu 2. sayfanın A1 Hücresine ekledim : = ARRAYFORMULA (Sayfa1! A1: A). E sütununda her sütun için benzer yaptım. E sütununda 21 onay kutusuyla soru var.

Yine de ikinci sayfada, Sütun FY'sinin 1. Satırı, gönüllü olmak istedikleri alanların kontrol listesindeki her bir onay kutusundaki metnin başlıklarıyla özdeşti. Z sütunu formdaki bir sonraki ve son soruydu, sadece "Ek Yorumlar" başlıklı kısa bir metin sorusuydu. Bu sütun için = ARRAYFORMULA (Sayfa1! F1: F) kullandım Bunu onay kutusu sorularının sonunda "diğer" seçeneğini kullanmak yerine ayrı bir soru olarak yaptım, çünkü bunu çekmek için iyi bir yol görünmüyordu verileri e-tabloya ekler.

Şimdi, sütunları "evet" veya yalnızca boş olarak ayırmak için E sütunundaki hücreden (listelenen en fazla 21 öğe olabilir) bilgiyi nasıl yanıtladığınız bölümüne. İkinci sayfadaki F2'deki formül = iferror şeklindedir (arama (F $ 1, $ E2)> 0, "Evet",)) Bu formül, sütun başlığındaki (F1) tam metnin bulunup bulunmadığını görmek ister. E2'de, eğer öyleyse bir "Evet" döndürür, değilse boş bırakır.

F2'de başvurulan bu formül yazılır (F4 tuşu ile "$" kullanılarak), böylece F2 GY'den 2. satırdaki her hücreye kopyalanabilir / yapıştırılabilir (Google E-Tablo, formüllerin sürükleyip / kopyalayarak kopyalamayı desteklemez ancak F2, ardından CTRL + C, ardından G2: Y2, ardından CTRL + V) seçilerek yapılabilir. Daha sonra F2: Y2'den F3: Y100'e yapıştırılan aynı metodoloji kopyasını kullanıyorum.

Daha sonra ortaya çıkan elektronik tablonun daha kompakt olması için (E yanıtını uzun cevaplardan kaçınarak) ikinci sayfada Sütun E'yi sakladım.

Şimdi tamamladıkları hızlı ve kolay form aracılığıyla 99 gönüllü almaya hazırım. Sütunların üst kısmındaki filtre seçeneklerinin kullanılması, hangi alanlarda kimin müsait olduğunu görmeye de yardımcı oldu.

Çözülmediğim son bir hayal kırıklığı. Formüllerimi ve tasarımımı test etmek için bazı sahte formları tamamladım, daha sonra bu satırları bağlantılı e-tablodan sildim. Ayrıca yinelenen formları doldurmuş birkaç kişim vardı, satırlarını da sildim. Ürün forumlarında kayda değer bir şekilde, Google'ın bir şekilde hala "Yanıtların Özeti" (e-tablonun "Form" sekmesi altında bulunur) test / sahte / yinelenen verisine sahip olduğunu öğrenen tek hayal kırıklığı değilim. Bu nedenle, test / sahte / yinelenen formlardan veri kaldırmak için silinen satırlar varsa, yanıtların özeti doğruluk açısından işe yaramaz.

Ama bu tamamlandı ve benzer notlara bir daha ihtiyacım olduğunda kaydediyorum, bir dahaki sefere 30 dakikadan daha kısa sürede kolayca yapılabileceğinden eminim.

Umarım bu yardımcı olur, herhangi bir sorunuz varsa bana bildirin.


2
Bu çok fazla metin.
Jacob Jan Tuinstra

Çaba için Kudos
Saariko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.