Có cách nào để liên kết một người Chọn Chọn từ một danh sách Câu hỏi về kiểu dáng trong Biểu mẫu của Google với danh sách dữ liệu (ví dụ: trong bảng tính) không?


10

Có cách nào để liên kết câu hỏi kiểu "Chọn từ danh sách" trong một biểu mẫu với danh sách dữ liệu (ví dụ: trong bảng tính) không?

Điều này có nghĩa là khi các tùy chọn mới được thêm vào danh sách trong bảng tính (hoặc bất kỳ nơi nào khác có thể lưu trữ danh sách), chúng sẽ tự động xuất hiện dưới dạng tùy chọn để chọn trong biểu mẫu trong tương lai.

Trong trường hợp của tôi, điều đó có nghĩa là những người được hỏi điền vào mẫu sẽ có thể chọn những tình nguyện viên có mặt trong phiên tình nguyện cụ thể đó từ danh sách tình nguyện viên toàn diện (thay vì gõ từng tên riêng lẻ), nhưng vì các tình nguyện viên tham gia một cách rời rạc, sẽ rất hữu ích nếu có thể tự động thêm các tùy chọn này vào danh sách thay vì thêm tùy chọn mới theo cách thủ công mỗi lần.

Tôi không biết nếu điều này là có thể nhưng tôi thực sự sẽ đánh giá cao nếu có ai có thể đề xuất một cách làm.


Thật tệ, bạn không có mặt để xem tất cả câu trả lời được đưa ra ....
Jacob Jan Tuinstra

Câu trả lời:


3

Câu trả lời của Tom Horwood hoạt động rất tốt, nhưng chỉ sau khi sửa một lỗi quan trọng trong mã của anh ta. Tất cả các tham chiếu đến LIST_DATAcác yếu tố nên được thực hiện bằng cách sử dụng chỉ mục j(không i). Tôi không có đủ nghiệp lực để bình luận về bài viết của Tom vì vậy đây là câu chuyện đầy đủ:

Dưới đây là mã sửa chữa. Tôi cũng đã thay đổi tên của các LIST_DATAyếu tố để chúng được mô tả nhiều hơn một chút. Nó cũng cho thấy Tom đã nghĩ như thế nào (kudos!) Và cung cấp phương tiện để cập nhật nhiều hơn một yếu tố biểu mẫu với nội dung của nhiều danh sách bảng tính.

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

Để tóm tắt cách làm cho ứng dụng này hoạt động (đối với những người, như tôi, người đang sử dụng Google Apps Script lần đầu tiên). Tôi đã đề cập đến tên trang tính và tên trường mẫu trong đoạn mã ở trên để hy vọng làm cho nó dễ hiểu hơn:

  1. Trong bảng tính được liên kết với biểu mẫu của bạn:

    • Tạo một bảng tính mới. Điều này sẽ chứa danh sách các mục bạn muốn thêm vào một trường. Đặt cho bảng tính một tên phù hợp (ví dụ, TaskCategories). Đặt danh sách các mục của bạn ở đó trong cột đầu tiên của bảng tính đó. Xóa tất cả các cột và hàng bổ sung trên trang tính đó (điều này có thể hoặc không cần thiết - chưa được kiểm tra)
    • Từ menu Công cụ, chọn "Trình chỉnh sửa tập lệnh". Sao chép và dán đoạn mã ở trên vào trình chỉnh sửa tập lệnh. Bạn sẽ cần thay đổi các phần sau của tập lệnh:
      • Giá trị của biến FORMIDsẽ cần được thay đổi thành ID của biểu mẫu của bạn. ID là mã dài (giữa các dấu gạch chéo về phía trước) trong thanh URL trong trình duyệt của bạn cho dạng mong muốn.
      • Các LIST_DATAbiến sẽ cần phải được sửa đổi cho phù hợp với hình thức của bạn và nhu cầu của bạn. Bạn sẽ lưu ý rằng mỗi mục trong LIST_DATAmột tuple formFieldTitleworksheetName. Cái trước là tên của trường biểu mẫu (phải là loại trường "chọn từ danh sách") - trong trình chỉnh sửa biểu mẫu mà nó được gọi Question Title. Cái sau là tên của bảng tính mà bạn đã tạo trước đó có chứa danh sách các mục bạn muốn điền vào trường. Thêm nhiều bộ dữ liệu này vào danh sách mà bạn cần.
      • Bây giờ lưu tập lệnh (Nhấp vào biểu tượng lưu)
      • Kiểm tra tập lệnh bằng cách chọn 'Chạy' từ menu trình chỉnh sửa tập lệnh và chọn "updateLists". Lần đầu tiên bạn làm điều này nó sẽ xin phép. Nếu tập lệnh thành công thì bạn có thể quan sát rằng biểu mẫu của bạn hiện có các trường được chỉ định được điền, nếu không, bạn sẽ lưu ý một thông báo lỗi trên màn hình.
  2. Nếu bạn quay lại bảng tính, bạn sẽ thấy một mục menu mới có tên List Updater. Nó có một mục Update Listsmà bạn cần chạy mỗi khi bạn thay đổi bất kỳ (các) trang tính trong danh sách của bạn - nó sẽ cập nhật biểu mẫu cho phù hợp.

Tôi cũng lưu ý, vì lợi ích của độc giả, FormRanger không hoạt động với Bảng tính Google mới. Các nhà phát triển FormRanger nói nhiều như vậy trên trang web của họ. Có lẽ / hy vọng điều đó sẽ thay đổi trong tương lai, nhưng tại thời điểm đăng bài này, đoạn mã trên hoạt động với tôi và tôi đang sử dụng nó trong một hình thức triển khai cho một khách hàng.


Tôi nghĩ rằng đây là một câu trả lời tuyệt vời để bao gồm từng bước cho những người không có kinh nghiệm liên kết một kịch bản hoặc bất cứ điều gì. Ngoài ra, để kén chọn định dạng mã js, thêm dấu chấm phẩy sau khi khởi tạo mảng LIST_DATA. Bây giờ để tùy chỉnh nó nhiều hơn, như nếu bạn có một cột tiêu đề, hãy sử dụng "for (var i = 1; i <data.length; i + = 1) {// Bỏ qua hàng tiêu đề bằng cách bắt đầu chỉ mục tại 1."
Gary

Edited để sửa chữa các dấu chấm phẩy thiếu - nhờ @Gary cho nhận thấy :-)
allnatural

2

Bạn có thể làm điều này với một biểu mẫu thông thường và một tập lệnh, sử dụng Form.getItems (), tìm mục trong vòng lặp, sau đó Item.asListItem (). SetChoices (...)

Dưới đây là một số mã mẫu mà tôi đã sử dụng trong bảng mẫumẫu này

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

Liên kết biểu mẫu hiện đã được sửa
Tom Horwood

1

Có một tiện ích bổ sung Google Forms được gọi là Giá trị biểu mẫu ít nhất cung cấp một cách bán tự động: bất cứ khi nào bạn thay đổi câu trả lời trong bảng tính, bạn cần phải tự điền lại các lựa chọn trong câu trả lời của mình, nhưng ít nhất nó khá đơn giản để thực hiện .


0

Bạn không thể làm điều này với Google Forms thông thường.

Tuy nhiên, bạn có thể tạo GUI của riêng mình bằng cách sử dụng Google Apps Script và cụ thể là UIService . Tuy nhiên, hãy lưu ý rằng bạn sẽ phải tạo lại toàn bộ GUI - bạn không thể sử dụng các phần từ biểu mẫu hiện có của mình.

Ngoài ra, bạn có thể sử dụng GUI Builder . Đây là trình chỉnh sửa WYSIWYG cho GUI GUI của Google Apps.

Cho dù bạn chọn cách nào, bạn nên chuẩn bị thực hiện một số chương trình để đạt được những gì bạn muốn.


1
GUI Builder không được dùng nữa, vì vậy tôi sẽ không sử dụng nó nữa.
Jacob Jan Tuinstra

Dịch vụ UIS cũng không được chấp nhận.
Rubén


0

Có một cách để tự động hóa danh sách cập nhật bằng cách đặt Kích hoạt [ 1 ] [ 2 ] cho Update Lists.

Đường dẫn là Script Editor -> Tài nguyên -> kích hoạt dự án hiện tại

Sau đó , add a new trigger. Đối với các ví dụ đã cho, bạn có thể thiết lập updatesListđể chạy from spreadsheetOn form submission. Bằng cách này, chức năng onOpensẽ không cần thiết.


-1

Vâng, nó có thể được thực hiện, dành một phần thời gian trong ngày để tìm câu trả lời và sau đó phát triển nó cho mục đích của tôi, nhưng nó có thể được thực hiện.

Nhu cầu của tôi là có một mẫu đăng ký tình nguyện để mọi người kiểm tra nhiều hộp từ danh sách các lĩnh vực mà họ muốn tình nguyện. Do đó, một câu hỏi với nhiều hộp, vấn đề là bảng tính Google kết quả chỉ liệt kê mọi thứ họ đã kiểm tra trong một ô. Có 21 lựa chọn tình nguyện, vì vậy rõ ràng đó sẽ không phải là một định dạng hữu ích cho thông tin đó. Tôi muốn làm điều mà tôi hiểu bạn nói rằng bạn muốn, tôi muốn có một cột với mỗi trong số 21 tùy chọn trong một cột của riêng nó. Sau đó, bên cạnh Dấu thời gian (biểu mẫu được tạo), tên, email và điện thoại của họ có 21 cột với "có" hoặc để trống. Tiêu đề cột là mỗi tùy chọn họ có thể chọn. Một số người có thể tự hỏi tại sao không chỉ có 21 câu hỏi với "có" hoặc "không".

Đầu tiên lưu ý rằng khi ai đó hoàn thành biểu mẫu google, bảng tính kết quả sẽ chèn một hàng thay vì thêm dữ liệu vào hàng trống tiếp theo. Điều này có nghĩa là bất kỳ công thức nào trên hàng vừa bị hỏng và dữ liệu mới từ công thức không có công thức nào tiếp theo hai công thức này sẽ hoạt động với dữ liệu đầu vào. Để vượt qua điều này, tôi đã thêm một bảng vào bảng tính (bảng tính). Tôi đã sử dụng đầu vào từ brettathds tại http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw Do đó tôi đã chèn công thức sau vào Ô A1 của trang 2 này: = ARRAYFORMULA (Trang 1! A1: A). Tôi đã làm tương tự cho mỗi cột thông qua cột E. Cột E có câu hỏi với 21 hộp kiểm.

Vẫn ở tờ thứ hai, Hàng 1 của Cột FY có các tiêu đề giống hệt với văn bản trên mỗi tùy chọn hộp kiểm từ danh sách kiểm tra các khu vực họ sẵn sàng tình nguyện. Sau đó, Cột Z là câu hỏi tiếp theo và cuối cùng trong mẫu, đó là một câu hỏi văn bản ngắn có tiêu đề "Nhận xét bổ sung". Đối với cột đó, tôi đã sử dụng = ARRAYFORMULA (Trang 1! F1: F) Tôi đã làm điều này như một câu hỏi riêng thay vì sử dụng tùy chọn "khác" ở cuối các câu hỏi trong hộp kiểm vì dường như không phải là một cách hay để kéo nó dữ liệu ra bảng tính.

Bây giờ đến phần trả lời làm thế nào để bạn lấy thông tin từ ô trong cột E (có thể có tối đa 21 mục được liệt kê) để tách các cột bằng "có" hoặc chỉ để trống. Công thức trong F2 trên trang tính thứ hai là = iferror (if (search (F $ 1, $ E2)> 0, "Yes",)) Công thức này đang tìm xem có tìm thấy văn bản chính xác trong tiêu đề cột (F1) không trong E2, nếu có thì nó trả về "Có", nếu không, nó sẽ để trống.

Công thức này được tham chiếu trong F2 được viết (sử dụng "$", thông qua phím F4) để F2 có thể được sao chép / dán vào từng ô trong hàng 2 từ GY (Bảng tính Google không hỗ trợ sao chép công thức bằng cách kéo / sao chép như bạn có thể trong Excel, nhưng có thể được thực hiện bằng cách chọn F2, sau đó CTRL + C, sau đó chọn G2: Y2, sau đó CTRL + V). Sau đó, tôi sử dụng bản sao phương pháp tương tự đã dán F2: Y2 đến F3: Y100.

Sau đó tôi đã ẩn Cột E trên trang tính thứ hai để bảng tính kết quả nhỏ gọn hơn (tránh tất cả các gói từ các câu trả lời dài).

Bây giờ tôi đã sẵn sàng nhận 99 tình nguyện viên thông qua hình thức nhanh chóng và dễ dàng mà họ hoàn thành. Việc sử dụng các tùy chọn bộ lọc ở đầu các cột cũng giúp xem ai có sẵn cho khu vực nào.

Một sự thất vọng cuối cùng mà tôi đã không được giải quyết. Tôi đã hoàn thành một số biểu mẫu không có thật để kiểm tra công thức và thiết kế của mình, sau đó tôi đã xóa các hàng đó khỏi bảng tính được liên kết. Tôi cũng đã có một vài người hoàn thành các hình thức trùng lặp, tôi cũng xóa hàng của họ. Đáng chú ý trong các diễn đàn sản phẩm, tôi không phải là người duy nhất nản lòng khi biết rằng bằng cách nào đó Google vẫn có dữ liệu kiểm tra / không có thật / trùng lặp được nối vào "Tóm tắt phản hồi" (tìm thấy trong tab "Biểu mẫu" của bảng tính). Do đó, tóm tắt các câu trả lời là vô ích đối với độ chính xác nếu đã có các hàng bị xóa để xóa dữ liệu khỏi các biểu mẫu kiểm tra / không có thật / trùng lặp.

Nhưng nó đã được thực hiện và tôi đang lưu những ghi chú này cho lần tiếp theo tôi cần tương tự, tôi tự tin rằng nó có thể dễ dàng được thực hiện trong vòng chưa đầy 30 phút vào lần tới.

Hy vọng điều này sẽ giúp, cho tôi biết nếu có câu hỏi.


2
Đó là rất nhiều văn bản.
Jacob Jan Tuinstra

Kudos cho nỗ lực
Saariko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.