Dapatkah saya menambahkan bidang peningkatan otomatis ke Google Spreadsheet berdasarkan Formulir Google?

20

Apakah mungkin dalam Formulir Google untuk memberikan nilai unik untuk setiap baris yang dimasukkan ke dalam spreadsheet serta stempel waktu?

Toby Allen
sumber
Stempel waktu AFAIK ditambahkan secara otomatis saat Anda membuat Formulir. Ketika Anda akan melihat di dalam kolom spreadsheet, yang pertama biasanya cap waktu (kecuali Anda menghapusnya karena alasan tertentu dan saya tidak tahu apa yang terjadi jika Anda melakukannya)
Robert Koritnik
Saya menduga ada sesuatu yang berubah sejak jawaban ini diberikan karena setelah membuat pelatuk dan menambahkan kode ke skrip, tidak ada yang terjadi ketika formulir dikirimkan. Adakah yang punya saran untuk mendapatkan solusi di atas untuk bekerja pada versi baru Google Sheeth
user3255228

Jawaban:

11

Anda dapat melakukan ini dengan menambahkan pemicu skrip.

Andaikan Formulir Anda saat ini memiliki dua kolom Timestampdan jawaban untuk satu pertanyaan. Jadi saat ini Anda memiliki kolom A dan B yang diisi dengan data. Mari kita asumsikan Anda ingin kolom C meminta Anda menambahkan angka secara otomatis.

Anda harus pergi dulu ke Tools > Script Editor

Di jendela Editor Skrip masukkan skrip berikut:

function onFormSubmit(e) {

var sheet = SpreadsheetApp.getActiveSheet();
var row =  SpreadsheetApp.getActiveSheet().getLastRow();

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


}

Simpan skrip lalu buka Triggersmenu dan pilihCurrent script's triggers

Populasikan drop down sebagai berikut:

Pemicu Google Script

Klik Save

Kemudian Simpan dan tutup jendela Google App Script.

Sekarang ketika formulir Anda dikirimkan, itu akan mengisi nomor baris di kolom C bersama dengan data yang telah dikirimkan melalui formulir Anda.

Jika Anda ingin mengubah kolom tempat nomor baris disimpan, Anda perlu mengubah baris skrip ini:

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

dan ubah nilai 3 ke nomor indeks kolom yang sesuai.

pembuat kode
sumber
Apakah mungkin untuk menggunakan skrip ini tetapi saya memerlukan nomor unik sehingga jika saya pernah menghapus atau menambah baris, ia tidak akan mengacaukan contoh: Saya memiliki ID atau baris 1, 2, 3, 4, 5, 6 tetapi saya secara manual menghapus 5 setelah formulir kirim ID 6 akan beralih ke baris 5 sehingga ID berikutnya pada formulir kirim akan 6 lagi saya akan memiliki aduplicate. Jadi mungkinkah untuk menggunakan cap waktu dan membuat nomor penambahan otomatis yang unik darinya?
Bahkan lebih baik, saya sekarang menggunakan ini untuk membuat permintaan dapatkan ke url saya mengontrol dengan semua data dan memasukkannya langsung ke aplikasi saya
Toby Allen
7

Selanjutnya ke jawaban yang sangat baik oleh Barry, jika Anda ingin dapat menghapus baris, dan masih menyimpan ID unik Anda dapat memiliki sel statis yang mempertahankan hitungan. Anda kemudian dapat menggunakan nomor ini dan menambahkannya di setiap entri baru ke tabel.

Jadi modifikasinya adalah menyimpan nomor di suatu tempat di spreadsheet Anda ('M1' dalam kode di bawah ini) dan memodifikasi kode agar terlihat seperti ini:

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

Sekali lagi, ubah baris terakhir kedua untuk mengubah tempat ID Anda ditempatkan.

Danny Parker
sumber
Saya telah menerapkan ini tetapi ini tidak berhasil dalam kasus menghapus baris di antara baris data. jadi itu harus memperbarui nilai tersembunyi setiap kali menghapus baris terjadi
Nomor tidak perlu diperbarui pada penghapusan jika hanya diperlukan ID unik (sesuai pertanyaan awal). Jika Anda mengurangi nilai pada penghapusan Anda akan mendapatkan duplikat ID.
Danny Parker
7

Membangun kedua jawaban sebelumnya (dari Barry dan Danny):

Mengasumsikan kolom ID adalah kolom A. Pilih sel "ID Berikutnya" dan setel ke rumus berikut (dengan asumsi itu dalam "P1"):

=MAX(A:A)+1

Buat skrip menggunakan editor skrip di bawah menu "Tools", dan rekatkan yang berikut ini:

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

Tambahkan pemicu skrip menggunakan menu "Pemicu" di editor skrip: masukkan deskripsi gambar di sini

diri
sumber
4

Lebih jauh ke jawaban di atas - Solusi ini tidak memerlukan sel spreadsheet tambahan.

Anda dapat menggunakan penangan acara bawaan untuk mengirimkan formulir untuk mendapatkan id unik. Karena spreadsheet hanyalah tujuan untuk formulir, menghapus baris sebenarnya tidak menghapus respons. Dengan mengingat hal itu ...

EDIT: menghapus kebutuhan untuk ID dan berurusan dengan masalah format tanggal.

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

}
Tom Horwood
sumber
Saya tidak mengerti. Bagaimana cara ini dipanggil saat formulir dikirimkan?
CodyBugstein
@Imray: Saya pikir ini pasti skrip di spreadsheet. Anda dapat mengatur pemicu di spreadsheet untuk menjalankan fungsi saat formulir dikirimkan. Saya akan menambahkan fakta itu ke jawaban ini jika berfungsi (saya perlu memeriksanya).
Gary S.
1
The getUniqueIDfungsi dapat sangat disederhanakan dengan hanya mengembalikan panjang tanggapan sampai saat ini (yang adalah apa logika fungsi ini dijelaskan di atas adalah melakukan dalam mode agak berbelit-belit). Pada dasarnya satu baris dalam fungsi:return getConnectedForm().getResponses().length;
Abid H. Mujtaba
2

Ini adalah turunan dari jawaban lain tetapi mungkin berguna untuk pengguna di masa depan.

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

}

Perbedaan utama adalah ia akan memperbarui kolom 1 di baris aktif ketika baris itu diedit tetapi hanya jika belum ada nilai yang ditentukan.

Anda harus mengatur pemicu seperti yang disebutkan dalam jawaban lain untuk di edit.

atur pemicu ke saat edit

nacross
sumber
0

Untuk "Apakah mungkin dalam Formulir Google untuk memberikan nilai unik untuk setiap baris yang dimasukkan ke dalam spreadsheet serta stempel waktu?" sementara juga memungkinkan penghapusan baris dalam lembar respons Formulir sebelum penambahan Respons lebih lanjut tanpa nilai duplikat, ini harus bekerja:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
kacang
sumber