Apakah mungkin dalam Formulir Google untuk memberikan nilai unik untuk setiap baris yang dimasukkan ke dalam spreadsheet serta stempel waktu?
Apakah mungkin dalam Formulir Google untuk memberikan nilai unik untuk setiap baris yang dimasukkan ke dalam spreadsheet serta stempel waktu?
Jawaban:
Anda dapat melakukan ini dengan menambahkan pemicu skrip.
Andaikan Formulir Anda saat ini memiliki dua kolom Timestamp
dan 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 Triggers
menu dan pilihCurrent script's triggers
Populasikan drop down sebagai berikut:
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.
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.
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:
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);
}
}
getUniqueID
fungsi 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;
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.
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)),"")