为什么联系表单电子邮件在某些字段中发送“值”而不是“名称”?

时间:2018-08-04 09:01:47

标签: javascript jquery html

我正在为使用Google脚本的联系表使用预制代码。它成功发送了电子邮件并将其格式化到我的收件箱,但是仍然存在问题。最后,我有一个问题列表。

代码如下:

表单处理程序Javascript:

(function() {
  function validEmail(email) { // see:
    var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    return re.test(email);
  }

  function validateHuman(honeypot) {
    if (honeypot) {  //if hidden form filled up
      console.log("Robot Detected!");
      return true;
    } else {
      console.log("Welcome Human!");
    }
  }

  // get all data in form and return object
  function getFormData() {
    var form = document.getElementById("gform");
    var elements = form.elements;

    var fields = Object.keys(elements).filter(function(k) {
          return (elements[k].name !== "honeypot");
    }).map(function(k) {

      if(elements[k].name !== undefined) {
        return elements[k].name;
      // special case for Edge's html collection
      }else if(elements[k].length > 0){
        return elements[k].item(0).name;
      }

    }).filter(function(item, pos, self) {
      return self.indexOf(item) == pos && item;
    });

    var formData = {};
    fields.forEach(function(name){
      var element = elements[name];

      // singular form elements just have one value

      formData[name] = element.value;                     

      // when our element has multiple items, get their values         


      if (element.length) {
        var data = [];
        for (var i = 0; i < element.length; i++) {
          var item = element.item(i);
          if (item.checked || item.selected) {
            data.push(item.value);
          }
        }
        formData[name] = data.join(', ');
      } 


    });

    // add form-specific values into the data
    formData.formDataNameOrder = JSON.stringify(fields);
    formData.formGoogleSheetName = form.dataset.sheet || "responses"; // default sheet name
    formData.formGoogleSendEmail = form.dataset.email || ""; // no email by default

    console.log(formData);
    return formData;
  }

  function handleFormSubmit(event) {  // handles form submit without any jquery
    event.preventDefault();           // we are submitting via xhr below
    var data = getFormData();         // get the values submitted in the form

    /* OPTION: Remove this comment to enable SPAM prevention, see README.md
    if (validateHuman(data.honeypot)) {  //if form is filled, form will not be submitted
      return false;
    }
    */

    if( data.email && !validEmail(data.email) ) {   // if email is not valid show error
      var invalidEmail = document.getElementById("email-invalid");
      if (invalidEmail) {
        invalidEmail.style.display = "block";
        return false;
      }
    } else {
      disableAllButtons(event.target);
      var url = event.target.action;  //
      var xhr = new XMLHttpRequest();
      xhr.open('POST', url);
      // xhr.withCredentials = true;
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.onreadystatechange = function() {
          console.log( xhr.status, xhr.statusText )
          console.log(xhr.responseText);


          //document.getElementById("gform").style.display = "none"; // hide form

          /*
          var thankYouMessage = document.getElementById("thankyou_message");
          if (thankYouMessage) {
            thankYouMessage.style.display = "block";
          }
          */



          return;
      };
      // url encode form data for sending as post data
      var encoded = Object.keys(data).map(function(k) {
          return encodeURIComponent(k) + "=" + encodeURIComponent(data[k])
      }).join('&')
      xhr.send(encoded);
    }
  }
  function loaded() {
    console.log("Contact form submission handler loaded successfully.");
    // bind to the submit event of our form
    var form = document.getElementById("gform");
    form.addEventListener("submit", handleFormSubmit, false);
  };
  document.addEventListener("DOMContentLoaded", loaded, false);

  function disableAllButtons(form) {
    var buttons = form.querySelectorAll("button");
    for (var i = 0; i < buttons.length; i++) {
      buttons[i].disabled = true;
    }
  }
})();

联系表HTML:

<section id="contact-form">

            <div class="content-wrap">
                <h4 class="form-heading">To send your general questions or comments, please use the contact form below.</h4>
            </div>


            <form id="gform"
                  class="contact-form" method="post" 
                  action="(Google Scripts URL)"
                  enctype="text/plain">

                <p>
                    <label for="name">Your Name <font face="Arial" color="red">*</font></label>
                    <input type="text" style="height:35px;" class="heighttext required" name="name" id="name" class="required" title="* Please provide your name">
                </p>

                <p>
                    <label for="email">Your Email <font face="Arial" color="red">*</font></label>
                    <input type="text" style="height:35px;" class="heighttext required" name="email" id="email" class="email required" title="* Please provide an email address">
                </p>

                <p>

<label>Your Location <font face="Arial" color="red">*</font></label>


<select name="Location" id="column_select" style="height:35px;" class="required" title=" * Please provide your location">
    <option selected value="col00">-- State --</option>       
    <option value="Alabama">Alabama</option>
    <option value="California">California</option>
    <option value="Florida">Florida</option>  
</select>

<select name="City" id="layout_select" style="height:35px;">     
    <option disabled selected value="Florida">-- City --</option> 
    <option name="Alachua" value="Florida_Alachua">Alachua</option>   
    <option name="Alford" value="Florida_Alford">Alford</option>     
</select>

     </p>           


                <p>
                    <label for="subject">I am interested in the following... <font face="Arial" color="red">*</font> </label>

                    <select style="height:35px;" class="required" title=" * Please provide a subject">
                        <option disabled selected value>-- select an option --</option>
                        <option value="volvo">Your position on...</option>
                        <option name="How to Donate" value="saab">How to donate</option>
                        <option name="How can I join your team or help?" value="mercedes">How can I join your team or help?</option>
                        <option name="Other" value="audi">Other</option>
                    </select>
                </p>



                <p>
                    <label for="comment">Your Message <font face="Arial" color="red">*</font></label>
                    <textarea name="message" id="comment" class="required" title="* Please provide your message"></textarea>
                </p>


                <p>
                    <div class="responsereqdiv">
                        <label for="comment">Response Requested? <font face="Arial" color="red" class="required" title="Please indicate whether you wish to be contacted.">*</font></label>

                        <label class="responsereqdiv1" for="YesResponse"> <input  type="radio" id="YesResponse" name="drone" />   Yes</label>

                        <label class="responsereqdiv2"  for="NoResponse"> <input type="radio" id="NoResponse" name="drone" /> No </label>

                    </div>    
                </p>



                <p>

                    <input type="submit" value="Send Message" id="submit" class="pp-btn special">
                    <img src="images/ajax-loader.gif" id="contact-loader" alt="Loading...">
                    <input type="hidden" name="action" value="send_message">
                    <!--<input type="hidden" name="target" value="">-->

                </p>




            </form>

            <div class="error-container"></div>
            <div id="message-sent2">Thank you! Your message has been sent.</div>

        </section><!-- #contact-form -->

Google脚本代码:

/******************************************************************************
 * This tutorial is based on the work of Martin Hawksey twitter.com/mhawksey  *
 * But has been simplified and cleaned up to make it more beginner friendly   *
 * All credit still goes to Martin and any issues/complaints/questions to me. *
 ******************************************************************************/

// if you want to store your email server-side (hidden), uncomment the next line
var TO_ADDRESS = "myemail@email.com";

// spit out all the keys/values from the form in HTML for email
// uses an array of keys if provided or the object to determine field order
function formatMailBody(obj, order) {
  var result = "";
  if (!order) {
    order = Object.keys(obj);
  }

  // loop over all keys in the ordered form data
  for (var idx in order) {
    var key = order[idx];
    result += "<h4 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h4><div>" + sanitizeInput(obj[key]) + "</div>";
    // for every key, concatenate an `<h4 />`/`<div />` pairing of the key name and its value, 
    // and append it to the `result` string created at the start.
  }
  return result; // once the looping is done, `result` will be one long string to put in the email body
}

// sanitize content from the user - trust no one 
// ref: https://developers.google.com/apps-script/reference/html/html-output#appendUntrusted(String)
function sanitizeInput(rawInput) {
   var placeholder = HtmlService.createHtmlOutput(" ");
   placeholder.appendUntrusted(rawInput);

   return placeholder.getContent();
 }

function doPost(e) {

  try {
    Logger.log(e); // the Google Script version of console.log see: Class Logger
    record_data(e);

    // shorter name for form data
    var mailData = e.parameters;

    // names and order of form elements (if set)
    var orderParameter = e.parameters.formDataNameOrder;
    var dataOrder;
    if (orderParameter) {
      dataOrder = JSON.parse(orderParameter);
    }

    // determine recepient of the email
    // if you have your email uncommented above, it uses that `TO_ADDRESS`
    // otherwise, it defaults to the email provided by the form's data attribute
    var sendEmailTo = (typeof TO_ADDRESS !== "undefined") ? TO_ADDRESS : mailData.formGoogleSendEmail;

    // send email if to address is set
    if (sendEmailTo) {
      MailApp.sendEmail({
        to: String(sendEmailTo),
        subject: "Contact form submitted",
        // replyTo: String(mailData.email), // This is optional and reliant on your form actually collecting a field named `email`
        htmlBody: formatMailBody(mailData, dataOrder)
      });
    }

    return ContentService    // return json success results
          .createTextOutput(
            JSON.stringify({"result":"success",
                            "data": JSON.stringify(e.parameters) }))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(error) { // if error return this
    Logger.log(error);
    return ContentService
          .createTextOutput(JSON.stringify({"result":"error", "error": error}))
          .setMimeType(ContentService.MimeType.JSON);
  }
}


/**
 * record_data inserts the data received from the html form submission
 * e is the data received from the POST
 */
function record_data(e) {
  var lock = LockService.getDocumentLock();
  lock.waitLock(30000); // hold off up to 30 sec to avoid concurrent writing

  try {
    Logger.log(JSON.stringify(e)); // log the POST data in case we need to debug it

    // select the 'responses' sheet by default
    var doc = SpreadsheetApp.getActiveSpreadsheet();
    var sheetName = e.parameters.formGoogleSheetName || "responses";
    var sheet = doc.getSheetByName(sheetName);

    var oldHeader = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var newHeader = oldHeader.slice();
    var fieldsFromForm = getDataColumns(e.parameters);
    var row = [new Date()]; // first element in the row should always be a timestamp

    // loop through the header columns
    for (var i = 1; i < oldHeader.length; i++) { // start at 1 to avoid Timestamp column
      var field = oldHeader[i];
      var output = getFieldFromData(field, e.parameters);
      row.push(output);

      // mark as stored by removing from form fields
      var formIndex = fieldsFromForm.indexOf(field);
      if (formIndex > -1) {
        fieldsFromForm.splice(formIndex, 1);
      }
    }

    // set any new fields in our form
    for (var i = 0; i < fieldsFromForm.length; i++) {
      var field = fieldsFromForm[i];
      var output = getFieldFromData(field, e.parameters);
      row.push(output);
      newHeader.push(field);
    }

    // more efficient to set values as [][] array than individually
    var nextRow = sheet.getLastRow() + 1; // get next row
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);

    // update header row with any new data
    if (newHeader.length > oldHeader.length) {
      sheet.getRange(1, 1, 1, newHeader.length).setValues([newHeader]);
    }
  }
  catch(error) {
    Logger.log(error);
  }
  finally {
    lock.releaseLock();
    return;
  }

}

function getDataColumns(data) {
  return Object.keys(data).filter(function(column) {
    return !(column === 'formDataNameOrder' || column === 'formGoogleSheetName' || column === 'formGoogleSendEmail' || column === 'honeypot');
  });
}

function getFieldFromData(field, data) {
  var values = data[field] || '';
  var output = values.join ? values.join(', ') : values;
  return output;
}

例如,如果您选择佛罗里达州的阿拉恰(Alachua)作为您的位置,这是当前结果电子邮件的显示方式:

Name
TestName

Action
send_message

City
Florida_Alachua

Message
TestMessage

Email
test@test.com

Drone
on

Location
Florida

问题:

-如何在City(而不是Florida_Alachua)下说“ Alachua”?

-为什么所选的“我对...感兴趣”选项没有出现在电子邮件中?

-如何使“操作send_message”部分不出现在电子邮件中?

-如何将“ Drone:on”更改为“ Response Requested”?然后根据用户选择的内容选择“是”还是“否”?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 要获取Alachu,您需要将HTML中的值设置为您要发送的值,选项没有名称属性。

  2. 您的“我有兴趣”选择没有名称属性,因此脚本将忽略它。

  3. 要摆脱电子邮件中的操作,请进行以下更改:

      for (var idx in order) {
        var key = order[idx];
        //Skip this entry into the email output if it is the Action
        if( key === 'Action') {continue}
        result += "<h4 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h4><div>" + sanitizeInput(obj[key]) + "</div>";
        // for every key, concatenate an `<h4 />`/`<div />` pairing of the key name and its value, 
        // and append it to the `result` string created at the start.
      }

  1. 您需要向单选按钮添加值,就像3一样,它使用标签的单选按钮名称。要修复电子邮件用于响应的内容,请执行以下操作:

    <label class="responsereqdiv1" for="YesResponse">
      <input  type="radio" id="YesResponse" name="drone" value="yes" />   Yes</label>
    
    <label class="responsereqdiv2"  for="NoResponse">
      <input type="radio" id="NoResponse" name="drone" value="no" /> No </label>

更难解决命名问题,因为他们是如何执行循环以生成HTML的。我个人只是将单选按钮的名称更改为“ Response_Requested”,并在电子邮件中使用下划线。