มีวิธีการเชื่อมโยงคำถามสไตล์ "เลือกจากรายการ" ในแบบฟอร์ม Google กับรายการข้อมูล (เช่นในสเปรดชีต) หรือไม่


10

มีวิธีการเชื่อมโยงคำถามสไตล์ "เลือกจากรายการ" ในแบบฟอร์มไปยังรายการข้อมูล (เช่นในสเปรดชีต) หรือไม่

ซึ่งหมายความว่าเมื่อมีการเพิ่มตัวเลือกใหม่ลงในรายการในสเปรดชีต (หรือที่อื่นก็อาจเป็นไปได้ที่จะโฮสต์รายการ) พวกเขาจะปรากฏโดยอัตโนมัติเป็นตัวเลือกเพื่อเลือกในแบบฟอร์มในอนาคต

ในกรณีของฉันมันหมายความว่าผู้ตอบแบบสอบถามกรอกข้อมูลในแบบฟอร์มจะสามารถเลือกอาสาสมัครที่มีอยู่ในช่วงการเป็นอาสาสมัครนั้นจากรายการที่ครอบคลุมของอาสาสมัคร (แทนที่จะพิมพ์ในแต่ละชื่อ) แต่เนื่องจากอาสาสมัครเข้าร่วมเป็นระยะ ๆ จะเป็นประโยชน์อย่างมหาศาลหากสามารถเพิ่มสิ่งเหล่านี้ในตัวเลือกในรายการโดยอัตโนมัติแทนที่จะเพิ่มตัวเลือกใหม่ด้วยตนเองทุกครั้ง

ฉันไม่รู้ว่ามันเป็นไปได้หรือไม่ แต่ฉันจะขอบคุณถ้าใครสามารถแนะนำวิธีการทำมัน


เพื่อไม่ดีคุณไม่ได้รอบเพื่อดูคำตอบที่ได้รับ ....
จาค็อบ ม.ค. Tuinstra

คำตอบ:


3

คำตอบของ Tom Horwood ใช้งานได้ดี แต่หลังจากแก้ไขข้อผิดพลาดที่สำคัญในรหัสของเขาแล้ว การอ้างอิงLIST_DATAองค์ประกอบทั้งหมดควรใช้ดัชนีj(ไม่ใช่i) ฉันไม่มีกรรมพอที่จะแสดงความคิดเห็นในโพสต์ของ Tom ดังนั้นนี่คือ monty เต็ม:

ด้านล่างเป็นรหัสที่ถูกต้อง ฉันยังเปลี่ยนชื่อของLIST_DATAองค์ประกอบเพื่อให้เป็นคำอธิบายเพิ่มเติมเล็กน้อย นอกจากนี้ยังแสดงให้เห็นว่า Tom คิดล่วงหน้าอย่างไร (รุ่งโรจน์!) และให้สิ่งอำนวยความสะดวกในการอัปเดตองค์ประกอบรูปแบบมากกว่าหนึ่งรายการด้วยเนื้อหาของรายการสเปรดชีตมากกว่าหนึ่งรายการ

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 Script เป็นครั้งแรก) ฉันได้อ้างถึงชื่อแผ่นงานและชื่อเขตข้อมูลฟอร์มในข้อมูลโค้ดด้านบนเพื่อหวังว่าจะทำให้เข้าใจได้ง่ายขึ้น:

  1. ในสเปรดชีตที่เชื่อมโยงกับแบบฟอร์มของคุณ:

    • สร้างแผ่นงานใหม่ รายการนี้จะมีรายการที่คุณต้องการเพิ่มลงในเขตข้อมูล ตั้งชื่อที่เหมาะสมให้กับเวิร์กชีท (ตัวอย่างเช่นTaskCategories) วางรายการของคุณไว้ในคอลัมน์แรกของแผ่นงานนั้น ลบคอลัมน์และแถวพิเศษทั้งหมดในแผ่นงานนั้น (อาจเป็นหรือไม่จำเป็น - ยังไม่ได้ทดสอบ)
    • จากเมนูเครื่องมือให้เลือก "ตัวแก้ไขสคริปต์" คัดลอกและวางข้อมูลโค้ดด้านบนลงในเครื่องมือแก้ไขสคริปต์ คุณจะต้องเปลี่ยนส่วนต่าง ๆ ของสคริปต์ต่อไปนี้:
      • ค่าของตัวแปรFORMIDจะต้องเปลี่ยนเป็น ID ของแบบฟอร์มของคุณ ID คือรหัสยาว (ระหว่างเครื่องหมายทับซ้าย) ในแถบ URL ในเบราว์เซอร์ของคุณสำหรับแบบฟอร์มที่ต้องการ
      • LIST_DATAตัวแปรจะต้องมีการปรับเปลี่ยนให้เหมาะสมกับรูปแบบและความต้องการของคุณ คุณจะได้ทราบว่าในแต่ละรายการLIST_DATAคือ tuple ของและformFieldTitle worksheetNameอดีตเป็นชื่อของเขตข้อมูลฟอร์ม (นั่นจะต้องเป็นประเภท "เลือกจากรายการ" ของสนาม) - Question Titleในการแก้ไขรูปแบบที่เรียกว่า ส่วนหลังคือชื่อของแผ่นงานที่คุณสร้างไว้ก่อนหน้านี้ซึ่งมีรายการของรายการที่คุณต้องการเติมข้อมูลด้วย เพิ่มสิ่งอันดับเหล่านี้ลงในรายการตามที่คุณต้องการ
      • ตอนนี้บันทึกสคริปต์ (คลิกที่ไอคอนบันทึก)
      • ทดสอบสคริปต์โดยเลือก 'เรียกใช้' จากเมนูตัวแก้ไขสคริปต์และเลือก "updateLists" ครั้งแรกที่คุณทำเช่นนี้จะขออนุญาต หากสคริปต์ประสบความสำเร็จคุณสามารถสังเกตเห็นว่าตอนนี้แบบฟอร์มของคุณมีฟิลด์ที่ระบุเติมอยู่มิฉะนั้นคุณจะเห็นข้อความแสดงข้อผิดพลาดบนหน้าจอ
  2. List Updaterถ้าคุณกลับไปสเปรดชีตคุณจะเห็นรายการเมนูใหม่ที่ชื่อ มีหนึ่งไอเท็มUpdate Listsที่คุณต้องรันทุกครั้งที่คุณเปลี่ยนเวิร์กชีทรายการใด ๆ - มันจะอัปเดตฟอร์มตามนั้น

ฉันยังทราบด้วยว่าเพื่อประโยชน์ของผู้อ่าน FormRanger นั้นไม่สามารถทำงานร่วมกับ Google Spreadsheets ใหม่ได้ นักพัฒนาของ FormRanger พูดได้มากบนเว็บไซต์ บางที / หวังว่าจะมีการเปลี่ยนแปลงในอนาคต แต่ในขณะนี้การโพสต์รหัสข้างต้นใช้งานได้สำหรับฉันและฉันใช้มันในรูปแบบที่ปรับใช้สำหรับลูกค้า


ฉันคิดว่านี่เป็นคำตอบที่ดีสำหรับการรวมทีละขั้นตอนสำหรับผู้ที่ไม่มีประสบการณ์ในการเชื่อมโยงสคริปต์หรืออะไรก็ตาม นอกจากนี้การจู้จี้จุกจิกกับการจัดรูปแบบโค้ด js เพิ่มเซมิโคลอนหลังการเริ่มต้นอาร์เรย์ LIST_DATA ตอนนี้เพื่อปรับแต่งเพิ่มเติมเช่นถ้าคุณมีคอลัมน์ส่วนหัวใช้ "สำหรับ (var i = 1; i <data.length; i + = 1) {// ข้ามแถวส่วนหัวตามดัชนีเริ่มต้นที่ 1"
Gary

แก้ไขเพื่อแก้ไขเซมิโคลอนที่หายไป - ขอบคุณ @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);
}

ลิงก์ของฟอร์มได้รับการแก้ไขแล้ว
Tom Horwood ใน

1

มีส่วนเสริมของ Google Forms ที่เรียกว่าForm Formซึ่งอย่างน้อยก็มีวิธีการแบบกึ่งอัตโนมัติ: เมื่อใดก็ตามที่คุณเปลี่ยนคำตอบในสเปรดชีตคุณจะต้องใส่ตัวเลือกในคำตอบของคุณอีกครั้ง แต่อย่างน้อยมันค่อนข้างตรงไปตรงมา .


0

คุณไม่สามารถทำได้ด้วย Google ฟอร์มปกติ

อย่างไรก็ตามคุณสามารถสร้าง GUI ของคุณเองโดยใช้สคริปต์ของ Google AppsและเฉพาะUIService อย่างไรก็ตามระวังว่าคุณจะต้องสร้าง GUI ทั้งหมดขึ้นใหม่ - คุณไม่สามารถใช้ชิ้นส่วนจากแบบฟอร์มที่มีอยู่ของคุณ

หรือคุณสามารถใช้GUI Builder มันเป็นโปรแกรมแก้ไขแบบ WYSIWYG สำหรับ GUI ของสคริปต์ Google Apps

ไม่ว่าคุณจะเลือกแบบไหนคุณควรเตรียมทำโปรแกรมบางอย่างเพื่อให้ได้สิ่งที่คุณต้องการ


1
ตัวสร้าง GUI เลิกใช้แล้วดังนั้นฉันจะไม่ใช้สิ่งนั้นอีกต่อไป
Jacob Jan Tuinstra

UIService ยังถูกคัดค้าน
Rubén

0

มีสคริปต์สำหรับสิ่งนั้นที่เรียกว่า FormRanger: https://docs.google.com/document/d/1YvgrxeZJNb2CBpSra1j59Mh1bVpk4vBQYLOoyVjby7A/edit?hl=en&forcehl=1


โปรดทราบว่าคุณต้องเรียกใช้ scrip นี้ใหม่ด้วยตนเองทุกครั้งที่ข้อมูลของคุณในสเปรดชีตที่เชื่อมโยงมีการเปลี่ยนแปลง!
kynan

0

ไม่มีทางที่จะทำงานโดยอัตโนมัติปรับปรุงรายการโดยการเป็นทริกเกอร์ [ 1 ] [ 2 ] Update Listsสำหรับ

พา ธ คือตัวแก้ไขสคริปต์ -> ทรัพยากร -> ทริกเกอร์ของโครงการปัจจุบัน

จากนั้นadd a new trigger. สำหรับตัวอย่างที่กำหนดคุณสามารถตั้งค่าupdatesListการทำงานและfrom spreadsheet On form submissionวิธีนี้onOpenไม่จำเป็นต้องใช้ฟังก์ชั่น


-1

ใช่มันสามารถทำได้ใช้เวลาส่วนหนึ่งของวันในการหาคำตอบแล้วพัฒนามันเพื่อจุดประสงค์ของฉัน แต่ก็สามารถทำได้

ความต้องการของฉันคือการมีแบบฟอร์มลงทะเบียนอาสาสมัครเพื่อให้ผู้คนตรวจสอบกล่องหลายกล่องจากรายการของพื้นที่ที่พวกเขาต้องการเป็นอาสาสมัคร ดังนั้นคำถามหนึ่งข้อที่มีหลายกล่องปัญหาคือสเปรดชีตของ Google ที่เป็นผลลัพธ์แสดงรายการทุกสิ่งที่พวกเขาตรวจสอบในเซลล์เดียว มีตัวเลือกอาสาสมัคร 21 ตัวเพื่อให้ชัดเจนว่าจะไม่เป็นรูปแบบที่มีประโยชน์สำหรับข้อมูลนั้น ฉันต้องการทำสิ่งที่ฉันเข้าใจคุณว่าคุณต้องการฉันต้องการมีคอลัมน์ที่มีตัวเลือก 21 ตัวในคอลัมน์ของตัวเอง จากนั้นถัดจาก Timestamp (สร้างฟอร์ม) ชื่ออีเมลและโทรศัพท์มี 21 คอลัมน์ด้วย "ใช่" หรือเว้นว่างไว้ ส่วนหัวของคอลัมน์คือแต่ละตัวเลือกที่พวกเขาสามารถเลือกได้ บางคนอาจสงสัยว่าทำไมไม่เพียงแค่มี 21 คำถามด้วย "ใช่" หรือ "ไม่"

โปรดทราบว่าเมื่อมีคนกรอกแบบฟอร์ม Google สเปรดชีตผลลัพธ์แทรกแถวแทนที่จะเพิ่มข้อมูลลงในแถวว่างถัดไป ซึ่งหมายความว่าสูตรใด ๆ ที่อยู่ในแถวเพิ่งถูกกระแทกและข้อมูลใหม่จากสูตรไม่มีสูตรถัดไปสองสูตรเพื่อทำงานกับข้อมูลอินพุต เพื่อให้ได้มากกว่านี้ฉันได้เพิ่มชีตในสเปรดชีต (สมุดงาน) ฉันใช้ข้อมูลจาก brettathds ที่http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKwฉันจึงใส่สูตรต่อไปนี้ลงในเซลล์ A1 ของแผ่นงานที่ 2 นี้: = ARRAYFORMULA (Sheet1! A1: A) ฉันทำสิ่งที่คล้ายกันสำหรับแต่ละคอลัมน์ผ่านคอลัมน์ E คอลัมน์ E มีคำถามพร้อมช่องทำเครื่องหมาย 21 ช่อง

ยังอยู่ในแผ่นงานที่สองแถวที่ 1 ของคอลัมน์ FY มีส่วนหัวเหมือนกับข้อความในตัวเลือกช่องทำเครื่องหมายแต่ละรายการจากรายการตรวจสอบของพื้นที่ที่พวกเขายินดีที่จะเป็นอาสาสมัคร จากนั้นคอลัมน์ Z เป็นคำถามถัดไปและคำถามสุดท้ายในแบบฟอร์มมันเป็นคำถามข้อความสั้น ๆ ที่มีชื่อว่า "ความคิดเห็นเพิ่มเติม" สำหรับคอลัมน์นั้นฉันใช้ = ARRAYFORMULA (Sheet1! F1: F) ฉันทำสิ่งนี้เป็นคำถามแยกต่างหากแทนที่จะใช้ตัวเลือก "อื่น ๆ " ที่ส่วนท้ายของคำถามในช่องทำเครื่องหมายเพราะดูเหมือนจะไม่เป็นวิธีที่ดีในการดึง ข้อมูลออกไปยังสเปรดชีต

ตอนนี้ถึงส่วนที่ตอบคุณจะรับข้อมูลจากเซลล์ในคอลัมน์ E ได้อย่างไร (ซึ่งอาจมีรายการได้มากถึง 21 รายการ) เพื่อแยกคอลัมน์ด้วย "ใช่" หรือเปล่า สูตรใน F2 บนแผ่นงานที่สองคือ = iferror (ถ้า (ค้นหา (F $ 1, $ E2)> 0, "ใช่",)) สูตรนี้มองเพื่อดูว่าพบข้อความที่แน่นอนในส่วนหัวคอลัมน์ (F1) ใน E2 ถ้ามันจะคืนค่าเป็น "ใช่" ถ้าไม่ใช่จะปล่อยให้มันว่างเปล่า

สูตรนี้อ้างอิงใน F2 เขียน (ใช้ "$" ผ่านทางปุ่ม F4) เพื่อให้ F2 สามารถคัดลอก / วางไปยังแต่ละเซลล์ในแถวที่ 2 จาก GY (Google Spreadsheet ไม่รองรับการคัดลอกสูตรโดยการลาก / คัดลอกในขณะที่คุณสามารถ ใน Excel แต่สามารถทำได้โดยเลือก F2 จากนั้นกด CTRL + C แล้วเลือก G2: Y2 จากนั้นกด CTRL + V) จากนั้นฉันก็ใช้วิธีการเดียวกันกับการคัดลอกวาง F2: Y2 ถึง F3: Y100

จากนั้นฉันซ่อนคอลัมน์ E ไว้ในแผ่นงานที่สองเพื่อให้สเปรดชีตที่ได้นั้นมีขนาดเล็กลง (หลีกเลี่ยงการตัดทั้งหมดจากคำตอบที่ยาว)

ตอนนี้ฉันพร้อมที่จะรับอาสาสมัคร 99 คนผ่านแบบฟอร์มที่รวดเร็วและง่ายดายที่พวกเขากรอก การใช้ตัวเลือกตัวกรองที่ด้านบนของคอลัมน์ยังช่วยให้เห็นว่าใครพร้อมใช้งานในพื้นที่ใดบ้าง

หนึ่งในความผิดหวังครั้งสุดท้ายที่ฉันไม่ได้รับการแก้ไข ฉันกรอกแบบฟอร์มปลอมเพื่อทดสอบสูตรและการออกแบบจากนั้นฉันลบแถวเหล่านั้นออกจากสเปรดชีตที่เชื่อมโยง ฉันมีคนไม่กี่คนที่กรอกแบบฟอร์มซ้ำกันฉันก็ลบแถวของพวกเขาด้วย สำคัญในฟอรัมผลิตภัณฑ์ฉันไม่ใช่คนเดียวที่หงุดหงิดที่จะเรียนรู้ว่า Google ยังคงมีการทดสอบ / ปลอมแปลง / ข้อมูลที่ซ้ำกันในสาย "สรุปการตอบสนอง" (พบภายใต้แท็บ "ฟอร์ม" ของสเปรดชีต) ดังนั้นบทสรุปของการตอบสนองจะไม่มีประโยชน์สำหรับความถูกต้องหากมีการลบแถวเพื่อลบข้อมูลออกจากแบบทดสอบ / ปลอม / แบบฟอร์มที่ซ้ำกัน

แต่มันสำเร็จและฉันบันทึกบันทึกเหล่านี้สำหรับครั้งต่อไปที่ฉันต้องการเหมือนกันฉันมั่นใจว่ามันสามารถทำได้อย่างง่ายดายในเวลาน้อยกว่า 30 นาทีในครั้งต่อไป

หวังว่านี่จะช่วยได้โปรดแจ้งให้เราทราบหากมีคำถามใด ๆ


2
นั่นเป็นข้อความจำนวนมาก
จาค็อบ ม.ค. Tuinstra

ความรุ่งโรจน์สำหรับความพยายาม
Saariko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.