เป็นไปได้ไหมที่ Google Forms จะให้ค่าที่ไม่ซ้ำกันในแต่ละแถวที่แทรกเข้าไปในสเปรดชีตและการประทับเวลา?
เป็นไปได้ไหมที่ Google Forms จะให้ค่าที่ไม่ซ้ำกันในแต่ละแถวที่แทรกเข้าไปในสเปรดชีตและการประทับเวลา?
คำตอบ:
คุณสามารถทำได้โดยการเพิ่มทริกเกอร์สคริปต์
สมมติว่าฟอร์มปัจจุบันของคุณมีสองคอลัมน์Timestamp
และคำตอบสำหรับคำถามเดียว ดังนั้นขณะนี้คุณมีคอลัมน์ A และ B ที่เติมข้อมูล สมมติว่าคุณต้องการให้คอลัมน์ C มีหมายเลขเพิ่มอัตโนมัติ
คุณต้องไปที่Tools
> ก่อน Script Editor
ในหน้าต่าง Script Editor ป้อนสคริปต์ต่อไปนี้:
function onFormSubmit(e) {
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getLastRow();
sheet.getRange(row,3).setValue(row);
}
บันทึกสคริปต์แล้วไปที่Triggers
เมนูและเลือกCurrent script's triggers
เติมรายการแบบหล่นลงดังนี้:
คลิก Save
จากนั้นบันทึกและปิดหน้าต่าง Google App Script
ตอนนี้เมื่อคุณส่งแบบฟอร์มแล้วจะมีการกรอกหมายเลขแถวในคอลัมน์ C พร้อมกับข้อมูลที่ส่งผ่านแบบฟอร์มของคุณ
ในคุณต้องการเปลี่ยนคอลัมน์ที่หมายเลขแถวได้รับการบันทึกให้คุณต้องเปลี่ยนบรรทัดของสคริปต์นี้:
sheet.getRange(row,3).setValue(row);
และเปลี่ยนค่า 3 เป็นหมายเลขดัชนีคอลัมน์ที่สอดคล้องกัน
นอกเหนือจากคำตอบที่ยอดเยี่ยมของ Barry หากคุณต้องการที่จะลบแถวออกและยังคง ID ที่ไม่ซ้ำกันคุณสามารถมีเซลล์แบบคงที่ที่นับ จากนั้นคุณสามารถใช้หมายเลขนี้และเพิ่มในทุกรายการใหม่ไปยังตาราง
ดังนั้นการแก้ไขจะต้องเก็บหมายเลขไว้ในสเปรดชีตของคุณ ('M1' ในรหัสด้านล่าง) และแก้ไขโค้ดให้มีลักษณะดังนี้:
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);
}
อีกครั้งเปลี่ยนบรรทัดสุดท้ายที่สองเพื่อเปลี่ยนที่วาง ID ของคุณ
การสร้างทั้งคำตอบก่อนหน้า (จาก Barry และ Danny):
สมมติว่าคอลัมน์ ID คือคอลัมน์ A เลือกเซลล์ "Next ID" และตั้งเป็นสูตรต่อไปนี้ (สมมติว่ามันอยู่ใน "P1"):
=MAX(A:A)+1
สร้างสคริปต์โดยใช้เครื่องมือแก้ไขสคริปต์ภายใต้เมนู "เครื่องมือ" และวางในสิ่งต่อไปนี้:
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);
}
}
เพิ่มทริกเกอร์สคริปต์โดยใช้เมนู "ทริกเกอร์" ในเครื่องมือแก้ไขสคริปต์:
นอกเหนือจากคำตอบข้างต้น - การแก้ปัญหานี้ไม่ต้องการเซลล์สเปรดชีตเพิ่มเติม
คุณสามารถใช้ตัวจัดการเหตุการณ์ inbuilt เพื่อส่งแบบฟอร์มเพื่อรับรหัสเฉพาะ เนื่องจากสเปรดชีตเป็นเพียงปลายทางสำหรับฟอร์มการลบแถวจึงไม่ได้เป็นการลบการตอบกลับ โดยที่ในใจ ...
แก้ไข: ลบต้องใช้ ID และจัดการกับปัญหาการจัดรูปแบบวันที่
/**
* 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
ฟังก์ชั่นได้ง่ายขึ้นอย่างมากโดยเพียงแค่กลับความยาวของการตอบสนองถึงวันที่ (นั่นคือสิ่งที่ตรรกะของฟังก์ชั่นนี้ที่อธิบายข้างต้นจะทำในรูปแบบที่ซับซ้อนมากกว่า) โดยพื้นฐานแล้วจะมีบรรทัดเดียวในฟังก์ชั่น:return getConnectedForm().getResponses().length;
นี่เป็นอนุพันธ์ของคำตอบอื่น ๆ แต่อาจเป็นประโยชน์สำหรับผู้ใช้ในอนาคต
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);
}
}
ความแตกต่างที่สำคัญคือมันจะอัปเดตคอลัมน์ 1 ในแถวที่ใช้งานอยู่เมื่อแถวนั้นได้รับการแก้ไข แต่ถ้าไม่มีค่าที่ระบุไว้เท่านั้น
คุณควรตั้งค่าทริกเกอร์ตามที่ระบุไว้ในคำตอบอื่น ๆ เมื่อในการแก้ไข
สำหรับ"เป็นไปได้ไหมที่ฟอร์มของ Google จะให้ค่าที่ไม่ซ้ำกับแต่ละแถวที่แทรกเข้าไปในสเปรดชีตและเวลาประทับ?" ในขณะที่ยังอนุญาตให้ลบแถวในแผ่นการตอบกลับฟอร์มก่อนที่จะเพิ่มการตอบสนองเพิ่มเติมโดยไม่ต้องทำซ้ำค่านี้ควรทำงาน:
=iferror(ArrayFormula(match(A1:A,A:A,0)),"")