Google Formuna dayalı bir Google E-Tablosuna otomatik görüntüleme alanı ekleyebilir miyim?


20

Google Formlar'da, e-tabloya eklediği her satıra ve zaman damgasına benzersiz bir değer vermek mümkün müdür?


Bir Form oluşturduğunuzda AFAIK zaman damgası otomatik olarak eklenir. E-tablo sütunlarının içine baktığınızda, ilki genellikle zaman damgasıdır (bir nedenle silmediyseniz ve bunu yaparsanız gerçekten ne olduğunu bilmiyorsam)
Robert Koritnik

Tetikleyici oluşturduktan ve betiğe kod ekledikten sonra, form gönderildiğinde hiçbir şey olmuyor çünkü bu yanıt verildiğinden beri bir şey değiştiğini tahmin ediyorum. Herkes Google Sheeth'in yeni sürümü üzerinde çalışmak için yukarıdaki çözümleri almak için herhangi bir tavsiye var mı
user3255228

Yanıtlar:


11

Bir komut dosyası tetikleyicisi ekleyerek bunu yapabilirsiniz.

Mevcut Formunuzun iki sütunu Timestampve bir sorunun cevabı olduğunu varsayalım. Şu anda verilerle dolu A ve B sütunlarınız var. Diyelim ki C sütununun otomatik olarak artış sayısını almasını istiyoruz.

Önce şuraya gitmelisiniz Tools > Script Editor

Komut Dosyası Düzenleyicisi penceresinde aşağıdaki komut dosyasını girin:

function onFormSubmit(e) {

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

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


}

Komut dosyasını kaydedin ve Triggersmenüye gidin veCurrent script's triggers

Açılır menüleri aşağıdaki gibi doldurun:

Google Script Tetikleyicileri

tık Save

Ardından Google App Script penceresini kaydedin ve kapatın.

Şimdi formunuz gönderildiğinde, formunuz aracılığıyla gönderilen verilerle birlikte C sütunundaki satır numarasını dolduracaktır.

Satır numarasının kaydedildiği sütunu değiştirmek istiyorsanız, komut dosyasının bu satırını değiştirmeniz gerekir:

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

ve 3 değerini ilgili sütun dizin numarasına değiştirin.


Bu komut dosyası kullanmak mümkün mü, ancak benzersiz bir numaraya ihtiyacım var, bu yüzden hiç silmeyeceğim veya bir satır ekleyeceksem, bunu örneklemeyeceğim: ID veya satır 1, 2, 3, 4, 5, 6 var ama manuel olarak siliyorum Form gönderme ID 6 sonra 5 satır 5 kayar böylece form gönderme sonraki ID 6 tekrar olacak reklam olacak. Peki zaman damgasını kullanmak ve bunun dışında benzersiz bir otomatik artış numarası yapmak mümkün mü?

Daha da iyisi, şimdi tüm verilerle kontrol ettiğim bir URL'ye bir istekte bulunmak ve bunu doğrudan uygulamama koymak için kullanıyorum
Toby Allen

7

Barry'nin mükemmel cevabına ek olarak, satırları kaldırmak ve yine de benzersiz bir kimlik tutmak istiyorsanız, bir sayıyı koruyan statik bir hücreye sahip olabilirsiniz. Daha sonra bu sayıyı kullanabilir ve tablodaki her yeni girişte artırabilirsiniz.

Bu nedenle değişiklik, e-tablonuzda bir yerde bir sayı tutmak (aşağıdaki kodda 'M1') ve kodu aşağıdaki gibi değiştirmek için olacaktır:

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

Yine, kimliğinizin nereye yerleştirileceğini değiştirmek için ikinci son satırı değiştirin.


Bunu uyguladım ancak veri satırları arasındaki satırın silinmesi durumunda bu başarılı olmaz. Bu nedenle, her satır silme sırasında gizli değeri güncellemelidir

Tek gereken (eğer orijinal soruya göre) benzersiz kimlikler varsa, numara silindiğinde güncellenmesi gerekmez. Silme sırasında değeri düşürürseniz, yinelenen kimlikler alırsınız.
Danny Parker

7

Önceki yanıtların her ikisine de dayanarak (Barry ve Danny'den):

Kimlik sütununun A sütunu olduğu varsayılarak bir "Next ID" hücresi seçin ve aşağıdaki formüle ayarlayın ("P1" de olduğu varsayılarak):

=MAX(A:A)+1

"Araçlar" menüsü altındaki komut dosyası düzenleyicisini kullanarak komut dosyası oluşturun ve aşağıdakileri yapıştırın:

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

Komut dosyası düzenleyicisindeki "Tetikleyiciler" menüsünü kullanarak bir komut dosyası tetikleyicisi ekleyin: resim açıklamasını buraya girin


4

Yukarıdaki yanıtlara ek olarak - Bu çözüm fazladan bir elektronik tablo hücresi gerektirmez.

Benzersiz bir kimlik almak üzere formun gönderilmesi için dahili olay işleyicilerini kullanabilirsiniz. Elektronik tablo yalnızca formun hedefi olduğundan, bir satırı silmek yanıtı gerçekten silmez. Bunu göz önünde bulundurarak ...

DÜZENLEME: kimlik gereksinimi kaldırıldı ve tarih biçimlendirme sorunları ele alındı.

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

}

Bunu anlamıyorum. Form gönderildiğinde bu nasıl çağrılır?
CodyBugstein

@Imray: Bunun e-tabloda bir komut dosyası olması gerektiğini düşünüyorum. Form gönderildiğinde bir işlevi çalıştırmak için e-tabloda bir tetikleyici ayarlayabilirsiniz. Çalışırsa bu gerçeği bu cevaba ekleyeceğim (kontrol etmem gerekiyor).
Gary S.

1
getUniqueIDİşlevi büyük ölçüde sadece (bu fonksiyonun mantık oldukça dolambaçlı biçimde yapıyor yukarıda açıklanan budur) bugüne kadar yanıtların uzunluğunu döndürerek basitleştirilmiş olabilir. Temelde fonksiyonda tek bir satır:return getConnectedForm().getResponses().length;
Abid H. Mujtaba

2

Bu, diğer cevapların bir türevidir, ancak gelecekteki kullanıcılar için yararlı olabilir.

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

}

Temel fark, o satır düzenlendiğinde etkin satırdaki 1. sütunu güncelleyecektir, ancak yalnızca önceden bir değer belirtilmemişse.

Tetiği, düzenlemeye ilişkin diğer yanıtlarda belirtildiği gibi ayarlamanız gerekir.

tetikleyiciyi düzenleme olarak ayarla


0

For "Google Formunda o elektronik tabloya ekler her satır yanı sıra zaman damgasına benzersiz bir değer vermek mümkün mü?" ayrıca değerleri çoğaltmadan başka bir Yanıt eklenmeden önce Form yanıtları sayfasında bir satırın silinmesine izin verirken, bunun çalışması gerekir:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.