Google Forms có thể cung cấp một giá trị duy nhất cho mỗi hàng mà nó chèn vào bảng tính cũng như dấu thời gian không?
Google Forms có thể cung cấp một giá trị duy nhất cho mỗi hàng mà nó chèn vào bảng tính cũng như dấu thời gian không?
Câu trả lời:
Bạn có thể làm điều này bằng cách thêm một kích hoạt kịch bản.
Giả sử Mẫu hiện tại của bạn có hai cột Timestamp
và câu trả lời cho một câu hỏi. Vì vậy, hiện tại bạn có các cột A và B chứa dữ liệu. Giả sử bạn muốn cột C có số tự động tăng.
Trước tiên bạn cần phải đi đến Tools
> Script Editor
Trong cửa sổ Script Editor, nhập đoạn script sau:
function onFormSubmit(e) {
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getLastRow();
sheet.getRange(row,3).setValue(row);
}
Lưu tập lệnh và sau đó vào Triggers
menu và chọnCurrent script's triggers
Dân số thả xuống như sau:
Nhấp chuột Save
Sau đó Lưu và đóng cửa sổ Google App Script.
Bây giờ khi biểu mẫu của bạn được gửi, nó sẽ điền số hàng trong cột C cùng với dữ liệu đã được gửi qua biểu mẫu của bạn.
Trong bạn muốn thay đổi cột mà số hàng được lưu vào bạn cần thay đổi dòng này của tập lệnh:
sheet.getRange(row,3).setValue(row);
và thay đổi giá trị 3 thành số chỉ mục cột tương ứng.
Hơn nữa với câu trả lời xuất sắc của Barry, nếu bạn muốn có thể xóa các hàng và vẫn giữ một ID duy nhất, bạn có thể có một ô tĩnh duy trì số đếm. Sau đó, bạn có thể sử dụng số này và tăng nó trên mỗi mục mới vào bảng.
Vì vậy, sửa đổi sẽ là giữ một số ở đâu đó trên bảng tính của bạn ('M1' trong mã bên dưới) và sửa đổi mã để trông như thế này:
function onFormSubmit(e)
{
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getLastRow();
var bugCount = sheet.getRange("M1").getValue();
bugCount++;
sheet.getRange(row,1).setValue(bugCount);
sheet.getRange("M1").setValue(bugCount);
}
Một lần nữa, thay đổi dòng cuối cùng thứ hai để thay đổi nơi ID của bạn được đặt.
Dựa trên cả hai câu trả lời trước (từ Barry và Danny):
Giả sử cột ID là cột A. Chọn một ô "ID tiếp theo" và đặt nó vào công thức sau (giả sử nó nằm trong "P1"):
=MAX(A:A)+1
Tạo tập lệnh bằng trình chỉnh sửa tập lệnh trong menu "Công cụ" và dán vào phần sau:
function onFormSubmit(e) {
// Get the active sheet
var sheet = SpreadsheetApp.getActiveSheet();
// Get the active row
var row = sheet.getActiveCell().getRowIndex();
// Get the next ID value. NOTE: This cell should be set to: =MAX(A:A)+1
var id = sheet.getRange("P1").getValue();
// Check of ID column is empty
if (sheet.getRange(row, 1).getValue() == "") {
// Set new ID value
sheet.getRange(row, 1).setValue(id);
}
}
Thêm trình kích hoạt tập lệnh bằng trình đơn "Kích hoạt" trong trình chỉnh sửa tập lệnh:
Hơn nữa với các câu trả lời ở trên - Giải pháp này không yêu cầu thêm một ô bảng tính.
Bạn có thể sử dụng các trình xử lý sự kiện sẵn có để gửi biểu mẫu để có được một id duy nhất. Vì bảng tính chỉ là đích đến của biểu mẫu, việc xóa một hàng không thực sự xóa phản hồi. Với ý nghĩ đó...
EDIT: cần xóa ID và xử lý các vấn đề định dạng ngày.
/**
* This function extracts the relevant properties from the event handler,
* then uses them to get the uniqueID and record the response
* @param {Object} e The event parameter for form submission to a spreadsheet;
* e has the following properties values, range, namedValues
*/
function onFormSubmit(e) {
var uniqueID = getUniqueID(e.values);
recordResponseID(e.range, uniqueID);
}
/**
* Records the unique ID for this response to the correct cell.
* @param {Object} eventRange Range in which the response is written
* @param {Integer} uniqueID Unique id for this range
*/
function recordResponseID(eventRange, uniqueID) {
var row = eventRange.getRow();
var column = eventRange.getLastColumn() + 1;
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(row, column).setValue(uniqueID);
}
/**
* A shortcut function to get the form that is connected to this spreadsheet
* @return {Form} The form associated with this spreadsheet.
**/
function getConnectedForm() {
var formUrl = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
var form = FormApp.openByUrl(formUrl);
return form;
}
/**
* Returns a unique ID for the response, by finding the actual Response that
* has the same properties.
* @param {Array} eventValues Array of: Timestamp_string, form_response_value...
* @return {Integer} The unique id (by 1 based array position) of the Response
*/
function getUniqueID(eventValues) {
var isMatch = false;
var eventItems = eventValues.slice(1);
var responses = getConnectedForm().getResponses();
//loop backwards through responses (latest is most likely)
for (var i = responses.length - 1; i > -1; i--) {
var responseItems = responses[i].getItemResponses();
//check each value matches
for (var j = 0; j < responseItems.length; j++) {
if (responseItems[j].getResponse() !== eventItems[j]) {
break;
}
isMatch = true;
}
if (isMatch) {
return i + 1;
}
}
}
function testOnSubmit() {
var answers = [
["Sue", "39", "Okay I suppose"],
["John", "22", "Great"],
["Jane", "45", "yeah no"],
["Bob", "33", "Super"]
];
var form = getConnectedForm();
var items = form.getItems();
for (var i = 0; i < answers.length; i++) {
var formResponse = form.createResponse();
for (var j = 0; j < items.length; j++) {
var item = items[j];
var itemResponse = item.asTextItem().createResponse(answers[i][j]);
formResponse.withItemResponse(itemResponse);
}
formResponse.submit();
Utilities.sleep(500);
}
}
getUniqueID
chức năng có thể được đơn giản hóa rất nhiều bằng cách đơn giản trở về chiều dài của các câu trả lời cho đến nay (có nghĩa là những gì logic của chức năng này được mô tả ở trên được thực hiện trong một thời trang khá phức tạp). Về cơ bản là một dòng duy nhất trong chức năng:return getConnectedForm().getResponses().length;
Đây là một dẫn xuất của các câu trả lời khác nhưng nó có thể hữu ích cho người dùng trong tương lai.
function onEdit(e)
{
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();
var bugCount = sheet.getRange("M2").getValue();
bugCount++;
if (sheet.getRange(row, 1).getValue() == "") {
sheet.getRange(row,1).setValue(bugCount);
sheet.getRange("M2").setValue(bugCount);
}
}
Sự khác biệt chính là nó sẽ cập nhật cột 1 trong hàng hoạt động khi hàng đó được chỉnh sửa nhưng chỉ khi chưa có giá trị được chỉ định.
Bạn nên đặt kích hoạt như được đề cập trong các câu trả lời khác để chỉnh sửa.
Đối với "Google Form có thể cung cấp một giá trị duy nhất cho mỗi hàng mà nó chèn vào bảng tính cũng như dấu thời gian không?" đồng thời cho phép xóa một hàng trong bảng phản hồi Biểu mẫu trước khi thêm Phản hồi tiếp theo mà không trùng lặp các giá trị, điều này sẽ hoạt động:
=iferror(ArrayFormula(match(A1:A,A:A,0)),"")