Tôi có thể thêm trường tự động vào Bảng tính Google dựa trên Biểu mẫu Google không?


20

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?


Dấu thời gian AFAIK được tự động thêm vào khi bạn tạo Biểu mẫu. Khi bạn nhìn vào bên trong các cột của bảng tính, cái đầu tiên thường là dấu thời gian (trừ khi bạn xóa nó vì một số lý do và tôi thực sự không biết điều gì sẽ xảy ra nếu bạn làm điều đó)
Robert Koritnik 23/212

Tôi đoán rằng có điều gì đó đã thay đổi kể từ khi câu trả lời này được đưa ra bởi vì sau khi tạo trình kích hoạt và thêm mã vào tập lệnh, không có gì xảy ra khi biểu mẫu được gửi. Có ai có lời khuyên nào để các giải pháp trên hoạt động trên phiên bản mới của Google
Sheeth

Câu trả lời:


11

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 Timestampvà 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 Triggersmenu và chọnCurrent script's triggers

Dân số thả xuống như sau:

Trình kích hoạt Google Script

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.


Có thể sử dụng tập lệnh này không nhưng tôi cần một số duy nhất để nếu tôi xóa hoặc thêm một hàng, nó sẽ không làm hỏng nó ví dụ: Tôi có ID hoặc hàng 1, 2, 3, 4, 5, 6 nhưng tôi xóa thủ công 5 sau khi gửi biểu mẫu ID 6 sẽ chuyển sang dòng 5, vì vậy ID tiếp theo trên biểu mẫu gửi sẽ là 6 lần nữa tôi sẽ bị trùng lặp. Vì vậy, có thể sử dụng dấu thời gian và tạo một số tăng tự động duy nhất từ ​​nó không?

Thậm chí tốt hơn, bây giờ tôi sử dụng điều này để thực hiện yêu cầu nhận một url mà tôi kiểm soát với tất cả dữ liệu và đưa thẳng vào ứng dụng của mình
Toby Allen

7

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.


Tôi đã áp dụng điều này nhưng điều này không thành công trong trường hợp xóa hàng ở giữa các hàng dữ liệu. vì vậy, nó sẽ cập nhật giá trị ẩn bất cứ khi nào xóa hàng xảy ra

Số không cần cập nhật khi xóa nếu ID duy nhất là tất cả những gì được yêu cầu (theo câu hỏi ban đầu). Nếu bạn giảm giá trị khi xóa, bạn sẽ nhận được ID trùng lặp.
Daniel Parker

7

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: nhập mô tả hình ảnh ở đây


4

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

}

Tôi không hiểu điều này. Làm thế nào để được gọi khi biểu mẫu được gửi?
CodyBugstein

@Imray: Tôi nghĩ rằng đây phải là một tập lệnh trong bảng tính. Bạn có thể thiết lập trình kích hoạt trong bảng tính để chạy chức năng khi biểu mẫu được gửi. Tôi sẽ thêm thực tế đó vào câu trả lời này nếu nó hoạt động (tôi cần kiểm tra nó).
Gary S.

1
Các getUniqueIDchứ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;
Abid H. Mujtaba

2

Đâ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.

đặt kích hoạt để chỉnh sửa


0

Đố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)),"")
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.