الوصول إلى البيانات التي أدخلها المستخدم عند الإرسال في نماذج جوجل

StackOverflow https://stackoverflow.com//questions/20037987

سؤال

لدي نموذج جوجل يحتوي على الحقلين التاليين:

  • عنوان البريد الإلكتروني:- مربع نص
  • أداة:- زر الراديو
    • أداة 1
    • أداة 2
    • أداة 3

يقوم المستخدم بإدخال عنوان بريده الإلكتروني وتحديد أداة وانقر فوق إرسال.أود أن تظهر الرسالة التالية:

شكرا على الاستجابة.تم إرسال بريد إلكتروني إليك على عنوان البريد الإلكتروني الذي تم إدخاله للتحميل أداة مختارة.

لدي قطعة التعليمات البرمجية التالية في محرر البرنامج النصي

    function emailFormSubmission() {
        var form = FormApp.getActiveForm();//the current form
        var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
        var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
        var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
        var row = theFormSheet.getLastRow(); //get the last row
        var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
        var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
        form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
    }

لقد قمت أيضا بتعيين triggers ليتم تشغيلها - > emailFormSubmission, الأحداث - > from Form , onFormSubmit.

ما يحدث هو:لنفترض أن المستخدم الأول ('أ') يدخل معلوماته والنقرات تقديم.يتم عرض معلوماته المدخلة بشكل صحيح.عندما يدخل المستخدم الثاني ('ب') معلوماته والنقرات تقديم ، يتم عرض المعلومات ألف.عندما يدخل المستخدم الثالث ('ج') معلوماته وينقر على الإرسال ، يتم عرض معلومات ب.لقد وجدت أن المشكلة مع " جيتلاسترو ()" منذ تحديث جدول البيانات بعد تتم معالجة تقديم البريد الإلكتروني.

ما الخطأ في الكود أعلاه?كيف يمكنني إصلاح هذا?

تحديث

استنادا إلى تعليقات وتشيكيتو ،قمت بتغيير التعليمات البرمجية إلى التالية لجعلها تعمل.

function emailFormSubmission(e) {
    var form = FormApp.getActiveForm();
    //Check this link on how to access form response:
    //https://developers.google.com/apps-script/understanding_events?hl=en

    var responses = e.response;//e is of type formresponse.
    var emailid = responses.getItemResponses()[0].getResponse();
    var tool = responses.getItemResponses()[1].getResponse();
    Logger.log(emailid);
    Logger.log(tool);
    form.setConfirmationMessage('Thanks for responding. An email has been sent to  '+ emailid + '   with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');  
    Logger.log(form.getConfirmationMessage());
}
هل كانت مفيدة؟

المحلول

تذكر أن الحدث On form submit (فهم الأحداث) يتلقى معلمة لها البنية التالية:

  • القيم
  • يتراوح
  • اسمه القيم

ويمكنك القيام بشيء مثل:

function emailFormSubmission(e) {
    ...
    var row = e.range.getRow();
    ...
}

جرب الكود التالي لمراقبة بنية المعلمة e:

function emailFormSubmission(e) {
    ...
    Logger.log(e);
    ...
}

تحديث

أولاً، اعذروني على ارتباكي، لقد أظهرت لكم هيكل أ Spreadsheet form submit event عندما كنت حقا تستخدم Form submit event.

بالتأكيد، أ Form submit event لديه الهيكل التالي:

  • إجابة

إرجاع كائن من النوع FormResponse.

ولذلك تعريف الحدث: On submit form (Form submit event)، يمكنك القيام بشيء مثل ما يلي:

function emailFormSubmission(e) {
  var itemResponses = e.response.getItemResponses();
  for (var i = 0, len = itemResponses.length; i < len; ++i) {
    Logger.log('Response #%s to the question "%s" was "%s"',
               (i + 1).toString(),
               itemResponses[i].getItem().getTitle(),
               itemResponses[i].getResponse());
  }
}

ومع ذلك، فإن رسالة التأكيد التي تم تعيينها وفقًا للبيانات المرسلة كردود على النموذج، لا تبدو واضحة جدًا، يمكنك ضبط الرسالة، ولكن لن يتم عرضها للاستجابة النشطة، إن لم يكن للرد التالي.

نصائح أخرى

تخميني الأول هو هذين الخطين هنا:

var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.

عندما تتصل getLastRow() على ورقة-كنت الحصول على الصف الأخير.بالتأكيد ، ولكن بالنظر إلى ترتيب الأحداث وكيفية معالجة هذه القيم ، فأنت بحاجة إلى +1, ، للحصول على أحدث إرسال.حاليا كنت صف واحد وراء عند تشغيل التعليمات البرمجية لتحديث رسالة تأكيد النموذج.

حتى مجرد تغيير التعليمات البرمجية الخاصة بك إلى ما يلي:

var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();

جداول البيانات هي الأكثر مربكة من خدمات جوجل ، في رأيي.عندما تحصل على قيم في جدول البيانات ، يتم إرجاعها كـ [] أو [][] اعتمادا على ما هو النطاق الخاص بك عند الاتصال getValues().لكن getRange() على sheet يبدأ في الفهرس 1 (لجعله أسهل للقراءة في التعليمات البرمجية أفترض).في كثير من الأحيان أجد أن لدي خطأ واحد تلو الآخر بسبب طريقة تمرير البيانات حولها.فقط ضع ذلك في الاعتبار أثناء العمل مع جداول البيانات :)

إجابة قصيرة: هل تريد أن تتمكن من القيام بأشكال جوجل.

Explanation: Form.SetConfirmationMessage () تعيين رسالة التأكيد للنموذج كما تخزين على الخادم، وليس للنموذج النشط الحالي.نفس الشيء ينطبق على سبيل المثال للنموذج.لل ().لن يتم تعديل النموذج النشط.يتوقع المرء سلوكا مختلفا لرسالة التأكيد، لكن للأسف، هذا ليس هو الحال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top