क्या मैं Google फ़ॉर्म के आधार पर Google स्प्रैडशीट में एक ऑटोनक्राइमेंट फ़ील्ड जोड़ सकता हूं?


20

क्या Google फ़ॉर्म में स्प्रेडशीट और टाइमस्टैम्प में सम्मिलित प्रत्येक पंक्ति को एक विशिष्ट मूल्य देना संभव है?


जब आप प्रपत्र बनाते हैं तो AFAIK टाइमस्टैम्प स्वचालित रूप से जुड़ जाता है। आप स्प्रेडशीट कॉलम के अंदर देखो होता है, पहले एक आम तौर पर टाइमस्टैम्प है (जब तक आप किसी कारण से इसे नष्ट कर दिया और मैं वास्तव में नहीं जानता कि यदि आप ऐसा करते हैं तो क्या होता है)
रॉबर्ट Koritnik

मैं अनुमान लगा रहा हूं कि इस उत्तर के बाद से कुछ बदल गया है क्योंकि ट्रिगर बनाने और स्क्रिप्ट में कोड जोड़ने के बाद, फॉर्म जमा होने पर कुछ नहीं होता है। क्या किसी को Google शीथ के नए संस्करण पर काम करने के लिए उपरोक्त समाधान प्राप्त करने की कोई सलाह है
user3255228

जवाबों:


11

आप एक स्क्रिप्ट ट्रिगर जोड़कर ऐसा कर सकते हैं।

मान लें कि आपके वर्तमान फ़ॉर्म में दो कॉलम हैं Timestampऔर एक प्रश्न का उत्तर है। इसलिए आपके पास वर्तमान में डेटा के साथ ए और बी पॉपिंग कॉलम हैं। मान लें कि आप कॉलम C चाहते हैं कि आपके पास स्वतः वृद्धि संख्या है।

आपको सबसे पहले > के पास जाना होगाTools 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 स्क्रिप्ट ट्रिगर

क्लिक करें Save

फिर Google ऐप स्क्रिप्ट विंडो को सहेजें और बंद करें।

अब जब आपका फॉर्म सबमिट किया जाता है तो यह आपके डेटा के साथ कॉलम सी में पंक्ति संख्या को जमा करेगा जो आपके फॉर्म के माध्यम से सबमिट किया गया है।

आप उस पंक्ति को बदलना चाहते हैं जिसे पंक्ति संख्या में सहेजा गया है, आपको स्क्रिप्ट की इस पंक्ति को बदलने की आवश्यकता है:

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

और मान 3 को संबंधित कॉलम इंडेक्स संख्या में बदलें।


क्या इस लिपि का उपयोग करना संभव है, लेकिन मुझे एक अद्वितीय संख्या की आवश्यकता है ताकि यदि मैं कभी हटाऊं या कोई पंक्ति जोड़ूं तो यह न खराब हो जाए उदाहरण: मेरे पास आईडी या पंक्ति 1, 2, 3, 4, 5, 6 है, लेकिन मैं मैन्युअल रूप से हटाता हूं 5 एक फॉर्म सबमिट करने के बाद ID 6 लाइन 5 पर शिफ्ट हो जाएगा, इसलिए फॉर्म सबमिट की अगली आईडी फिर से 6 हो जाएगी। तो क्या टाइम स्टैम्प का उपयोग करना और उसमें से एक अद्वितीय ऑटो-इन्क्रिमिंग नंबर बनाना संभव है?

इससे भी बेहतर, मैं अब इसका उपयोग करने के लिए एक आग्रह करने के लिए एक आग्रह करता हूं मैं सभी डेटा के साथ नियंत्रित करता हूं और इसे सीधे अपने ऐप में डाल देता हूं
टोबी एलन

7

बैरी द्वारा उत्कृष्ट जवाब के आगे, यदि आप पंक्तियों को हटाने में सक्षम होना चाहते हैं, और अभी भी एक अद्वितीय आईडी रखते हैं तो आपके पास एक स्थिर सेल हो सकता है जो एक गिनती बनाए रखता है। फिर आप इस नंबर का उपयोग कर सकते हैं और इसे टेबल पर हर नई प्रविष्टि पर बढ़ा सकते हैं।

इसलिए संशोधन आपकी स्प्रैडशीट (नीचे दिए गए कोड में '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);
}

फिर, दूसरी अंतिम पंक्ति को बदलने के लिए जहां आपकी आईडी रखी गई है।


मैंने इसे लागू कर दिया है, लेकिन डेटा पंक्तियों के बीच पंक्ति को हटाने के मामले में यह सफल नहीं है। इसलिए पंक्ति को हटाते समय इसे छिपे हुए मूल्य को अपडेट करना चाहिए

यदि अद्वितीय आईडी की आवश्यकता है (मूल प्रश्न के अनुसार) तो संख्या को हटाने पर अपडेट करने की आवश्यकता नहीं है। यदि आप विलोपन पर मूल्य घटाते हैं तो आपको डुप्लिकेट आईडी मिल जाएगी।
डैनी पार्कर

7

पिछले उत्तर (बैरी और डैनी दोनों) पर निर्माण:

मान लें कि आईडी कॉलम कॉलम ए है। "नेक्स्ट आईडी" सेल चुनें और इसे निम्न फॉर्मूले पर सेट करें (यह मानते हुए कि यह "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

उपरोक्त उत्तरों के आगे - इस समाधान के लिए एक अतिरिक्त स्प्रेडशीट सेल की आवश्यकता नहीं है।

आप एक अद्वितीय आईडी प्राप्त करने के लिए फॉर्म जमा करने के लिए इनबिल्ट इवेंट हैंडलर का उपयोग कर सकते हैं। क्योंकि स्प्रेडशीट फ़ॉर्म के लिए सिर्फ गंतव्य है, एक पंक्ति को हटाने से वास्तव में प्रतिक्रिया नष्ट नहीं होती है। ये ध्यान रखते हुए...

EDIT: आईडी की आवश्यकता को हटा दिया गया और दिनांक स्वरूपण मुद्दों से निपटा गया।

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

}

मुझे यह नहीं मिलता। फॉर्म सबमिट होने पर इसे कैसे प्राप्त किया जाता है?
कोडब्यूस्टीन

@ आईरे: मुझे लगता है कि स्प्रेडशीट में यह एक स्क्रिप्ट होनी चाहिए। जब आप फ़ॉर्म सबमिट करते हैं, तो आप फ़ंक्शन को चलाने के लिए स्प्रैडशीट में ट्रिगर सेट कर सकते हैं। मैं इस तथ्य को इस उत्तर में जोड़ दूंगा यदि यह काम करता है (मुझे इसकी जांच करने की आवश्यकता है)।
गैरी एस।

1
getUniqueIDसमारोह बहुत बस तारीख करने के लिए प्रतिक्रियाओं की लंबाई (है कि क्या इस समारोह के तर्क ऊपर वर्णित एक नहीं बल्कि घुमावदार फैशन में क्या कर रहा है) वापस लौट कर सरल किया जा सकता। मूल रूप से फ़ंक्शन में एक एकल लाइन:return getConnectedForm().getResponses().length;
आबिद एच। मुजतबा

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)),"")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.