ฉันสามารถเพิ่มฟิลด์การสร้างอัตโนมัติลงในสเปรดชีตของ Google โดยใช้แบบฟอร์ม Google ได้หรือไม่


20

เป็นไปได้ไหมที่ Google Forms จะให้ค่าที่ไม่ซ้ำกันในแต่ละแถวที่แทรกเข้าไปในสเปรดชีตและการประทับเวลา?


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

ฉันเดาว่ามีบางอย่างเปลี่ยนแปลงไปตั้งแต่คำตอบนี้ได้รับเพราะหลังจากสร้างทริกเกอร์และเพิ่มรหัสให้กับสคริปต์แล้วจะไม่มีอะไรเกิดขึ้นเมื่อส่งแบบฟอร์ม ไม่มีใครมีคำแนะนำสำหรับการแก้ปัญหาข้างต้นเพื่อทำงานกับ Google Sheeth เวอร์ชันใหม่
user3255228

คำตอบ:


11

คุณสามารถทำได้โดยการเพิ่มทริกเกอร์สคริปต์

สมมติว่าฟอร์มปัจจุบันของคุณมีสองคอลัมน์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

เติมรายการแบบหล่นลงดังนี้:

ทริกเกอร์ Google Script

คลิก Save

จากนั้นบันทึกและปิดหน้าต่าง Google App Script

ตอนนี้เมื่อคุณส่งแบบฟอร์มแล้วจะมีการกรอกหมายเลขแถวในคอลัมน์ C พร้อมกับข้อมูลที่ส่งผ่านแบบฟอร์มของคุณ

ในคุณต้องการเปลี่ยนคอลัมน์ที่หมายเลขแถวได้รับการบันทึกให้คุณต้องเปลี่ยนบรรทัดของสคริปต์นี้:

sheet.getRange(row,3).setValue(row);

และเปลี่ยนค่า 3 เป็นหมายเลขดัชนีคอลัมน์ที่สอดคล้องกัน


เป็นไปได้ไหมที่จะใช้สคริปต์นี้ แต่ฉันต้องการหมายเลขที่ไม่ซ้ำกันเพื่อที่ว่าถ้าฉันลบหรือเพิ่มแถวมันจะไม่ทำให้เสียตัวอย่าง: ฉันมี ID หรือแถว 1, 2, 3, 4, 5, 6 แต่ฉันลบเอง 5 หลังจากส่งแบบฟอร์ม ID 6 จะเปลี่ยนเป็นบรรทัด 5 ดังนั้นรหัสถัดไปในแบบฟอร์มการส่งจะเป็น 6 อีกครั้งฉันจะมี aduplicate ดังนั้นจึงเป็นไปได้ที่จะใช้การประทับเวลาและสร้างหมายเลขเพิ่มอัตโนมัติที่ไม่ซ้ำใคร

ยิ่งไปกว่านั้นตอนนี้ฉันใช้สิ่งนี้เพื่อขอ URL ที่ฉันควบคุมด้วยข้อมูลทั้งหมดและใส่ลงในแอปของฉันทันที
Toby Allen

7

นอกเหนือจากคำตอบที่ยอดเยี่ยมของ 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 ของคุณ


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

หมายเลขไม่จำเป็นต้องอัปเดตเมื่อทำการลบหากรหัสที่ไม่ซ้ำนั้นเป็นสิ่งที่จำเป็นทั้งหมด (ตามคำถามเดิม) หากคุณลดค่าการลบคุณจะได้รับรหัสซ้ำกัน
Danny Parker

7

การสร้างทั้งคำตอบก่อนหน้า (จาก 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);
  }
}

เพิ่มทริกเกอร์สคริปต์โดยใช้เมนู "ทริกเกอร์" ในเครื่องมือแก้ไขสคริปต์: ป้อนคำอธิบายรูปภาพที่นี่


4

นอกเหนือจากคำตอบข้างต้น - การแก้ปัญหานี้ไม่ต้องการเซลล์สเปรดชีตเพิ่มเติม

คุณสามารถใช้ตัวจัดการเหตุการณ์ 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);
  }

}

ฉันไม่ได้รับสิ่งนี้ สิ่งนี้จะถูกเรียกได้อย่างไรเมื่อมีการส่งแบบฟอร์ม?
CodyBugstein

@Imray: ฉันคิดว่านี่ต้องเป็นสคริปต์ในสเปรดชีต คุณสามารถตั้งค่าทริกเกอร์ในสเปรดชีตเพื่อเรียกใช้ฟังก์ชันเมื่อส่งแบบฟอร์ม ฉันจะเพิ่มความจริงให้กับคำตอบนี้ถ้ามันใช้งานได้ (ฉันต้องตรวจสอบมัน)
แกรี่เอส

1
getUniqueIDฟังก์ชั่นได้ง่ายขึ้นอย่างมากโดยเพียงแค่กลับความยาวของการตอบสนองถึงวันที่ (นั่นคือสิ่งที่ตรรกะของฟังก์ชั่นนี้ที่อธิบายข้างต้นจะทำในรูปแบบที่ซับซ้อนมากกว่า) โดยพื้นฐานแล้วจะมีบรรทัดเดียวในฟังก์ชั่น:return getConnectedForm().getResponses().length;
Abid H. Mujtaba

2

นี่เป็นอนุพันธ์ของคำตอบอื่น ๆ แต่อาจเป็นประโยชน์สำหรับผู้ใช้ในอนาคต

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 ในแถวที่ใช้งานอยู่เมื่อแถวนั้นได้รับการแก้ไข แต่ถ้าไม่มีค่าที่ระบุไว้เท่านั้น

คุณควรตั้งค่าทริกเกอร์ตามที่ระบุไว้ในคำตอบอื่น ๆ เมื่อในการแก้ไข

ตั้งค่าทริกเกอร์เป็นเปิดเมื่อแก้ไข


0

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

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.