क्या Google फ़ॉर्म में डेटा की सूची में (स्प्रेडशीट में उदाहरण के लिए "सूची से चुनें" शैली प्रश्न को लिंक करने का एक तरीका है)?


10

क्या डेटा की सूची के लिए "स्प्रेडशीट में उदाहरण के लिए" सूची में से चुनें "शैली प्रश्न से लिंक करने का एक तरीका है?

इसका मतलब यह होगा कि स्प्रेडशीट में सूची में नए विकल्प जोड़े गए थे (या जहां कहीं भी सूची को होस्ट करना संभव हो सकता है) वे स्वचालित रूप से भविष्य में फॉर्म में चयन करने के विकल्प के रूप में दिखाई देंगे।

मेरे मामले में इसका मतलब यह होगा कि फॉर्म भरने वाले उत्तरदाता यह चुनने में सक्षम होंगे कि कौन से स्वयंसेवक स्वयंसेवकों की व्यापक सूची (विशेष रूप से प्रत्येक नाम को व्यक्तिगत रूप से टाइप करने की बजाय) से उस विशेष स्वयंसेवक सत्र में मौजूद थे, लेकिन चूंकि स्वयंसेवक छिटपुट रूप से शामिल होते हैं, इसलिए हर बार मैन्युअल रूप से एक नया विकल्प जोड़ने के बजाय यदि सूची में इन विकल्पों को स्वचालित रूप से जोड़ना संभव होता तो यह बेहद मददगार होता।

मुझे पता नहीं है कि यह संभव है लेकिन मैं वास्तव में इसकी सराहना करूंगा यदि कोई इसे करने का एक तरीका सुझा सकता है।


बुरा
मानने के

जवाबों:


3

टॉम होरवुड का जवाब महान काम करता है, लेकिन अपने कोड में एक महत्वपूर्ण त्रुटि को सुधारने के बाद ही। LIST_DATAतत्वों के सभी संदर्भों को सूचकांक j(नहीं i) का उपयोग करके बनाया जाना चाहिए । मेरे पास टॉम के पोस्ट पर टिप्पणी करने के लिए पर्याप्त कर्म नहीं है इसलिए पूरी तरह से मोंटी है:

नीचे सही कोड है। मैंने LIST_DATAतत्वों का नाम भी बदल दिया है, इसलिए वे थोड़े अधिक वर्णनात्मक हैं। यह भी दिखाता है कि टॉम ने आगे कैसे सोचा था (कुडोस!) और एक से अधिक स्प्रैडशीट सूची की सामग्री के साथ एक से अधिक फार्म तत्व को अपडेट करने की सुविधा प्रदान की।

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

यह बताने के लिए कि इसे कैसे प्राप्त किया जाए (मेरे जैसे लोगों के लिए, जो पहली बार Google Apps स्क्रिप्ट का उपयोग कर रहे हैं)। मैंने शीट नामों को संदर्भित किया है और कोड स्निपेट में फ़ील्ड नामों को उपरोक्त रूप से उम्मीद करता हूं कि इसे अधिक समझ में आता है:

  1. स्प्रैडशीट में जो आपके फॉर्म से जुड़ी है:

    • एक नई वर्कशीट बनाएं। इसमें उन आइटमों की सूची होगी, जिन्हें आप किसी फ़ील्ड में जोड़ना चाहते हैं। वर्कशीट को उपयुक्त नाम (उदाहरण के लिए TaskCategories) दें। उस वर्कशीट के पहले कॉलम में अपनी वस्तुओं की सूची वहां रखें। उस शीट पर सभी अतिरिक्त कॉलम और पंक्तियों को हटा दें (यह आवश्यक हो सकता है या नहीं - परीक्षण नहीं किया गया है)
    • टूल्स मेनू से, "स्क्रिप्ट एडिटर" चुनें। कोड स्निपेट को स्क्रिप्ट एडिटर में ऊपर कॉपी और पेस्ट करें। आपको स्क्रिप्ट के निम्नलिखित भागों को बदलने की आवश्यकता होगी:
      • चर के मूल्य FORMIDको आपके फॉर्म की आईडी में बदलना होगा। वांछित फॉर्म के लिए आपके ब्राउज़र में URL बार में आईडी (फॉरवर्ड स्लैश के बीच) आईडी एक लंबा कोड है।
      • LIST_DATAचर अपने फार्म और आपकी आवश्यकताओं के अनुरूप संशोधित करने की आवश्यकता होगी। आप ध्यान दें हूँ कि प्रत्येक आइटम में LIST_DATAसे एक टपल है formFieldTitleऔर worksheetName। पूर्व प्रपत्र फ़ील्ड का नाम है (जिसे "सूची से चुनें" फ़ील्ड का प्रकार होना चाहिए) - फॉर्म संपादक में इसे कहा जाता है Question Title। उत्तरार्द्ध उस वर्कशीट का नाम है जिसे आपने पहले बनाया था जिसमें उन वस्तुओं की सूची शामिल है जिन्हें आप फ़ील्ड के साथ आबाद करना चाहते हैं। इन ट्यूपल्स में से कई को सूची में जोड़ें जैसे आपको ज़रूरत है।
      • अब स्क्रिप्ट को सेव करें (सेव आइकन पर क्लिक करें)
      • स्क्रिप्ट संपादक मेनू से 'रन' चुनकर और "अपडेटलिस्ट" का चयन करके स्क्रिप्ट का परीक्षण करें। पहली बार जब आप ऐसा करेंगे तो यह अनुमति मांगेगा। यदि स्क्रिप्ट सफल हो जाती है तो आप देख सकते हैं कि आपके फॉर्म में अब निर्दिष्ट फ़ील्ड्स आबाद हैं, अन्यथा आप स्क्रीन पर एक त्रुटि संदेश नोट करेंगे।
  2. यदि आप स्प्रेडशीट पर लौटते हैं, तो आपको एक नया मेनू आइटम देखना चाहिए List Updater। इसमें एक आइटम है Update Listsजिसे आपको अपनी सूची (एस) की वर्कशीट (एस) को बदलने के लिए हर बार चलाने की आवश्यकता है - यह प्रपत्र को तदनुसार अपडेट करेगा।

मैं यह भी ध्यान देता हूं कि पाठकों के लाभ के लिए, कि FormRanger नए Google स्प्रेडशीट के साथ काम नहीं करता है। FormRanger डेवलपर्स अपनी वेबसाइट पर जितना कहते हैं। शायद / उम्मीद है कि भविष्य में बदल जाएगा, लेकिन इस पोस्टिंग के समय के रूप में उपरोक्त कोड मेरे लिए काम करता है और मैं इसे क्लाइंट के लिए तैनात रूप में उपयोग कर रहा हूं।


मुझे लगता है कि यह एक पटकथा या किसी भी चीज का अनुभव किए बिना उन लोगों के लिए कदम से कदम मिलाकर एक शानदार उत्तर है। इसके अलावा, js कोड फ़ॉर्मेटिंग पर picky होने के लिए LIST_DATA सरणी आरंभीकरण के बाद एक अर्ध-बृहदान्त्र जोड़ें। अब इसे और अधिक कस्टमाइज़ करने के लिए, जैसे कि यदि आपके पास हैडर कॉलम का उपयोग "के लिए" (var i = 1; i <data.length; i + = 1) {// शीर्ष लेख पंक्ति को 1. पर इंडेक्स शुरू करके छोड़ें।
गैरी

देख रही के लिए :-) धन्यवाद @Gary - संपादित लापता अर्धविराम ठीक करने के लिए
allnatural

2

आप Form.getItems () का उपयोग करके सामान्य रूप और स्क्रिप्ट के साथ ऐसा कर सकते हैं, आइटम को लूप में खोजें, फिर Item.asListItem ()। SetChoices (...)।

यहाँ कुछ नमूना कोड है, जो मैंने इस उदाहरण शीट और फॉर्म में उपयोग किया है

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

फार्म लिंक अब तय हो गया है
टॉम होरवुड

1

एक Google प्रपत्र है, जिसे फॉर्म वैल्यू कहा जाता है, जो कम से कम एक अर्ध-स्वचालित तरीका प्रदान करता है: जब भी आप स्प्रैडशीट में अपने उत्तर बदलते हैं, तो आपको अपने उत्तर में विकल्पों को मैन्युअल रूप से पुन: पॉप्युलेट करने की आवश्यकता होती है, लेकिन कम से कम यह करने के लिए सीधा है ।


0

आप नियमित Google फ़ॉर्म के साथ ऐसा नहीं कर सकते।

हालाँकि, आप Google Apps स्क्रिप्ट और विशेष रूप से UIService का उपयोग करके अपना खुद का GUI बना सकते हैं । हालाँकि, अवगत रहें, कि आपको पूरे जीयूआई को फिर से बनाना होगा - आप अपने मौजूदा फॉर्म के कुछ हिस्सों का उपयोग नहीं कर सकते।

वैकल्पिक रूप से, आप GUI बिल्डर का उपयोग कर सकते हैं । यह Google Apps Script GUIs के लिए WYSIWYG संपादक है।

जो आप कभी भी चुनते हैं, आपको जो कुछ भी चाहिए उसे प्राप्त करने के लिए कुछ प्रोग्रामिंग करने के लिए तैयार रहना चाहिए।


1
जीयूआई बिल्डर पदावनत है, इसलिए मैं अब इसका उपयोग नहीं करूंगा।
जैकब जान टुंस्ट्रा

UIService भी पदावनत है।
रुबेन

0

उसके लिए एक स्क्रिप्ट है, जिसे फ़ॉर्मरेंजर कहा जाता है: https://docs.google.com/document/d/1YvgrxeZJNb2CBpSra1j59Mh1bVpk4vBQYLOoyjjby7A/edit?hl=hi&forcehl=1


ध्यान दें कि जब भी आपका डेटा लिंक किए गए स्प्रेडशीट में परिवर्तित हो, तब आपको इस स्क्रिप को मैन्युअल रूप से री-रन करना होगा!
किन्नन १४'१५

0

एक ट्रिगर [ 1 ] [ 2 ] के लिए सेट करके सूची अपडेट को स्वचालित करने का एक तरीका है Update Lists

पथ स्क्रिप्ट संपादक है -> संसाधन -> वर्तमान परियोजना के ट्रिगर

फिर, add a new trigger। दिए गए उदाहरणों के लिए, आप updatesListचलाने के लिए from spreadsheetऔर सेट कर सकते हैं On form submission। इस तरह, फ़ंक्शन onOpenकी आवश्यकता नहीं होगी।


-1

हाँ, यह किया जा सकता है, उत्तर खोजने के लिए दिन का एक अच्छा हिस्सा बिताया और फिर इसे अपने उद्देश्यों के लिए विकसित किया, लेकिन यह किया जा सकता है।

मेरी आवश्यकता लोगों के लिए एक स्वयंसेवक साइन-अप फॉर्म की आवश्यकता है ताकि वे उन क्षेत्रों की सूची से कई बक्से की जांच कर सकें जिन्हें वे स्वयंसेवक करना चाहते हैं। इसलिए कई बक्से के साथ एक प्रश्न, समस्या यह है कि परिणामस्वरूप Google स्प्रेडशीट ने केवल एक सेल में जाँच की गई सभी चीज़ों को सूचीबद्ध किया है। 21 स्वयंसेवक विकल्प थे, ताकि स्पष्ट रूप से उस जानकारी के लिए एक उपयोगी प्रारूप नहीं होगा। मैं वह करना चाहता था जो मुझे समझ में आए कि आप कहना चाहते हैं, मैं चाहता था कि उसके स्वयं के कॉलम में 21 विकल्पों में से प्रत्येक के साथ एक कॉलम हो। फिर उनके टाइमस्टैम्प (उत्पन्न), नाम, ईमेल और फोन के बगल में "हां" या बाएं खाली के साथ 21 कॉलम हैं। कॉलम हेडिंग प्रत्येक विकल्प है जिसे वे चुन सकते हैं। कुछ लोग आश्चर्यचकित हो सकते हैं कि "हाँ" या "नहीं" के साथ सिर्फ 21 प्रश्न क्यों नहीं हैं।

पहले ध्यान दें कि जब कोई व्यक्ति Google फ़ॉर्म को पूरा करता है तो परिणामी स्प्रेडशीट अगली खाली पंक्ति में डेटा जोड़ने के बजाय एक पंक्ति सम्मिलित करता है। इसका मतलब यह है कि जो भी सूत्र पंक्ति में थे, वे बस टकरा गए और फार्मूले के नए डेटा के पास इनपुट डेटा के साथ काम करने के लिए अगले दो सूत्र नहीं हैं। इससे आगे निकलने के लिए मैंने स्प्रेडशीट (वर्कबुक) में एक शीट जोड़ी। मैंने http://productforums.google.com/forum/# -topic / docs / dlW6U6cHuKw पर brettathds से इनपुट का उपयोग किया इसलिए मैंने इस द्वितीय पत्रक के सेल A1 में निम्न सूत्र सम्मिलित किया: = ARRAFFORMULA (Sheet1: A1)! मैंने कॉलम ई के माध्यम से प्रत्येक कॉलम के लिए समान किया। कॉलम ई में 21 चेकबॉक्स के साथ सवाल है।

फिर भी दूसरी शीट पर, कॉलम 1 FY के हेडर के पास प्रत्येक चेकबॉक्स विकल्प पर पाठ के समान हेडर थे, उन क्षेत्रों की चेकलिस्ट से जो वे स्वयंसेवक के लिए तैयार हैं। तब कॉलम Z फॉर्म पर अगला और अंतिम प्रश्न था, यह एक छोटा पाठ प्रश्न था जिसका शीर्षक केवल "अतिरिक्त टिप्पणियाँ" था। उस कॉलम के लिए मैंने = ARRAYFORMULA (Sheet1! F1: F) का उपयोग किया, मैंने इसे चेकबॉक्स के अंत में "अन्य" विकल्प का उपयोग करने के बजाय एक अलग प्रश्न के रूप में किया क्योंकि इसमें खींचने का एक अच्छा तरीका नहीं दिखाई दिया था। स्प्रेडशीट में डेटा बाहर।

अब वह भाग जो उत्तर देता है कि आपको स्तंभ E में सेल से जानकारी कैसे मिलती है (जो सूचीबद्ध 21 आइटम तक हो सकती है) स्तंभों को "हां" या सिर्फ रिक्त के साथ अलग करने के लिए। दूसरी शीट पर F2 में सूत्र = iferror है (यदि (खोज (F $ 1, $ E2)> 0, "हां",)) यह सूत्र यह देखना चाह रहा है कि क्या स्तंभ शीर्ष लेख (F1) में सटीक पाठ पाया गया है E2 में, यदि यह है तो यह एक "हाँ" देता है, यदि यह इसे खाली नहीं छोड़ता है।

F2 में संदर्भित यह सूत्र (F4 कुंजी के माध्यम से "$" का उपयोग करते हुए) लिखा गया है, ताकि GY से पंक्ति 2 में प्रत्येक सेल में F2 को कॉपी / पेस्ट किया जा सके (Google स्प्रैडशीट आपके द्वारा ड्रैग / कॉपी करके सूत्रों की प्रतिलिपि का समर्थन नहीं करता है) एक्सेल में, लेकिन यह F2 का चयन करके किया जा सकता है, फिर CTRL + C, फिर G2: Y2, फिर CTRL + V) का चयन करें। मैं तो एक ही कार्यप्रणाली कॉपी का उपयोग कर F2: Y2 से F3: Y100 चिपकाया।

मैंने तब कॉलम ई को दूसरी शीट पर छिपा दिया, ताकि परिणामस्वरूप स्प्रेडशीट अधिक कॉम्पैक्ट हो (लंबे उत्तरों से सभी लपेटो से बचना)।

अब मैं 99 स्वयंसेवकों को त्वरित और आसान रूप में प्राप्त करने के लिए तैयार हूं जो वे पूरा करते हैं। कॉलम के शीर्ष पर फ़िल्टर विकल्पों का उपयोग करने से यह देखने में भी मदद मिली कि कौन से क्षेत्रों के लिए कौन उपलब्ध था।

एक अंतिम निराशा जो मुझे हल नहीं हुई। मैंने अपने सूत्रों और डिज़ाइन का परीक्षण करने के लिए कुछ फर्जी फ़ॉर्म पूरे किए, मैंने फिर उन पंक्तियों को लिंक की गई स्प्रेडशीट से हटा दिया। मेरे पास कुछ लोग भी थे जिन्होंने डुप्लिकेट फ़ॉर्म पूरे किए, मैंने उनकी पंक्तियों को भी हटा दिया। उत्पाद मंचों में उल्लेखनीय, मैं केवल यह जानने के लिए निराश नहीं हूं कि किसी भी तरह से Google के पास अभी भी परीक्षण / फर्जी / डुप्लिकेट डेटा है जिसे "सारांशों के सारांश" (स्प्रेडशीट के "फॉर्म" टैब के तहत पाया गया) में तारांकित किया गया है। इसलिए सटीकता के लिए प्रतिक्रियाओं का सारांश बेकार है यदि परीक्षण / फर्जी / डुप्लिकेट रूपों से डेटा को हटाने के लिए पंक्तियों को हटा दिया गया है।

लेकिन यह पूरा हो गया है और मैं अगली बार जब मुझे ऐसी ही जरूरत है, तो मैं इन नोटों को बचा रहा हूं, मुझे विश्वास है कि यह अगली बार 30 मिनट से भी कम समय में आसानी से किया जा सकता है।

आशा है कि यह मदद करता है, मुझे पता है अगर कोई सवाल है।


2
वह बहुत पाठ है।
याकूब जान टुंस्ट्रा

प्रयास के लिए
कुदोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.