Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save AvlSEONinja/b59386a06811f7d29061870195d3ee5a to your computer and use it in GitHub Desktop.
Save AvlSEONinja/b59386a06811f7d29061870195d3ee5a to your computer and use it in GitHub Desktop.
Send Elementor form data directly to a Google Sheet via Webhook
/*
* In order to enable this script, follow these steps:
*** Open the Google Sheet you want to use,
** From the Tools menu select "Script Editor"
* Paste this script into code editor and hit Save.
*
*** Then click:
** "Publish" & select "Deploy as web app...
*** Select:
** Execute the app as: Me (youremail@gmail.com)
** Who has access to the app: Anyone, even anonymous
* - Note, depending on your Google Apps instance, this option may not be available. You will need to contact your Google Apps administrator, or else use a Gmail account.
*
*** Now click Deploy. You may be asked to review permissions now.
* - It will probably give you a warning, click "Advanced" on the bottom left and continue.
*
*** The URL that you get will be the webhook that you can use in your elementor form.
* - You can test this webhook in your browser first by pasting it.
* It will say: "Yepp this is the webhook URL, request received".
*
*** EMAIL NOTIFICATIONS:
* By default, email notifications are turned off in this script.
* To turn them on:
* on line 37 Change "false to "true"
* on line 40 replace "Change_to_your_Email" with, well, whatever your email is, but leave the "quotes"
* re-save the script. collect leades, make that $$$
*/
function doGet(e) {}
function doPost(e) {
var o = e.parameter;
SpreadsheetApp.getActiveSheet().appendRow([ o.name, o.email, o.message, e ]);
}
// Change to true to enable email notifications
var emailNotification = false;
// Enter your email address below (keep the quotation marks!)
var emailAddress = "Change_to_your_Email";
/**
* Google app-script to utilise Elementor Pro Froms webhook
* For Usage see: https://github.com/pojome/elementor/issues/5894
* Origionally found: https://gist.github.com/bainternet/4b539b00a4bd7490ac3809d7ff86bd14
* by bainternet
* Minor tweaks to the directions by AvlSEONinja
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DO NOT EDIT THESE NEXT PARAMS
var isNewSheet = false;
var recivedData = [];
/**
* this is a function that fires when the webapp receives a GET request
* Not used but required.
*/
function doGet( e ) {
return HtmlService.createHtmlOutput( "Yepp this is the webhook URL, request received" );
}
// Webhook Receiver - triggered with form webhook to pusblished App URL.
function doPost( e ) {
var params = JSON.stringify(e.parameter);
params = JSON.parse(params);
insertToSheet(params);
// HTTP Response
return HtmlService.createHtmlOutput( "post request received" );
}
// Flattens a nested object for easier use with a spreadsheet
function flattenObject( ob ) {
var toReturn = {};
for ( var i in ob ) {
if ( ! ob.hasOwnProperty( i ) ) continue;
if ( ( typeof ob[ i ] ) == 'object' ) {
var flatObject = flattenObject( ob[ i ] );
for ( var x in flatObject ) {
if ( ! flatObject.hasOwnProperty( x ) ) continue;
toReturn[ i + '.' + x ] = flatObject[ x ];
}
} else {
toReturn[ i ] = ob[ i ];
}
}
return toReturn;
}
// normalize headers
function getHeaders( formSheet, keys ) {
var headers = [];
// retrieve existing headers
if ( ! isNewSheet ) {
headers = formSheet.getRange( 1, 1, 1, formSheet.getLastColumn() ).getValues()[0];
}
// add any additional headers
var newHeaders = [];
newHeaders = keys.filter( function( k ) {
return headers.indexOf( k ) > -1 ? false : k;
} );
newHeaders.forEach( function( h ) {
headers.push( h );
} );
return headers;
}
// normalize values
function getValues( headers, flat ) {
var values = [];
// push values based on headers
headers.forEach( function( h ){
values.push( flat[ h ] );
});
return values;
}
// Insert headers
function setHeaders( sheet, values ) {
var headerRow = sheet.getRange( 1, 1, 1, values.length )
headerRow.setValues( [ values ] );
headerRow.setFontWeight( "bold" ).setHorizontalAlignment( "center" );
}
// Insert Data into Sheet
function setValues( sheet, values ) {
var lastRow = Math.max( sheet.getLastRow(),1 );
sheet.insertRowAfter( lastRow );
sheet.getRange( lastRow + 1, 1, 1, values.length ).setValues( [ values ] ).setFontWeight( "normal" ).setHorizontalAlignment( "center" );
}
// Find or create sheet for form
function getFormSheet( formName ) {
var formSheet;
var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
// create sheet if needed
if ( activeSheet.getSheetByName( formName ) == null ) {
formSheet = activeSheet.insertSheet();
formSheet.setName( formName );
isNewSheet = true;
}
return activeSheet.getSheetByName( formName );
}
// magic function where it all happens
function insertToSheet( data ){
var flat = flattenObject( data );
var keys = Object.keys( flat );
var formName = data["form_name"];
var formSheet = getFormSheet( formName );
var headers = getHeaders( formSheet, keys );
var values = getValues( headers, flat );
setHeaders( formSheet, headers );
setValues( formSheet, values );
if ( emailNotification ) {
sendNotification( data, getSeetURL() );
}
}
function getSeetURL() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
return spreadsheet.getUrl();
}
function sendNotification( data, url ) {
var subject = "A new Elementor Pro Froms subbmition has been inserted to your sheet";
var message = "A new subbmition has been recived via " + data['form_name'] + " form and inserted into your Google sheet at: " + url;
MailApp.sendEmail( emailAddress, subject, message, {
name: 'Automatic Emailer Script'
} );
}
@kaysenjp
Copy link

kaysenjp commented Jul 8, 2020

Nice. it works. thank you so much
I have a question please: is there a way to connect two or more Elementor forms from 1 website to 1 Google Sheet
For ex: "form fields" from page 1. after redirect to page 2 the information in "form fields" will be gathered in the same Google Sheet by fields order

@AvlSEONinja
Copy link
Author

@kaysenjp
That should work just fine. I've used the same webhook to catch data from multiple forms. I would either keep both Form Names the same, or just use spreadsheet formulas to move and organize the data into another sheet. You could probably use the different URLs to sort alphabetically. Let me know if you find something that works!

@kaysenjp
Copy link

thanks for your answer

honestly, I don't know how to do that properly.
I mean I wanna have the first-page form: name, email, phone, product x => after submission redirects to the 2nd-page form: product y => google sheet all info in one field. like: name+ email+ phone+ product x + product y
it's like a cross-sell/upsell process

hope you can help me with that

@mono-sudo
Copy link

I have a question:
I have a date in my form. However when submitting the date, it doesn't submit the date I picked, but the date of today.
How do I change that?
Thank you so much

@rgindustries
Copy link

This code cannot seem to work for me!

@kamleshgadekar
Copy link

Hi,

I needs to submit contact form leads to multiple Google sheet, Can you please let me know how to do this?

@tizum
Copy link

tizum commented Sep 6, 2021

working perfectly here thanks!
I would like to know if it is possible to delete the form_id, form_name and some other form fields if necessary

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment