All Projects → jamiewilson → Form To Google Sheets

jamiewilson / Form To Google Sheets

Licence: apache-2.0
Store HTML form submissions in Google Sheets.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Form To Google Sheets

discord2sheet-bot
Discord bot that stores messages to Google Sheet.
Stars: ✭ 40 (-95.57%)
Mutual labels:  google-sheets
Make Fetch Happen
Get in loser, we're making requests!
Stars: ✭ 381 (-57.76%)
Mutual labels:  fetch-api
Sqlitebiter
A CLI tool to convert CSV / Excel / HTML / JSON / Jupyter Notebook / LDJSON / LTSV / Markdown / SQLite / SSV / TSV / Google-Sheets to a SQLite database file.
Stars: ✭ 601 (-33.37%)
Mutual labels:  google-sheets
re-frame-fetch-fx
js/fetch Effect Handler for re-frame
Stars: ✭ 24 (-97.34%)
Mutual labels:  fetch-api
React Fetch Hook
React hook for conveniently use Fetch API
Stars: ✭ 285 (-68.4%)
Mutual labels:  fetch-api
Build A Bot With Zero Coding
An example of using Google Sheets to create a Viber survey chat bot without a backend server
Stars: ✭ 460 (-49%)
Mutual labels:  google-sheets
google-sheet-to-github-website
This is a working project for operating a data driven website on Github Pages using Google Sheets as a data source.
Stars: ✭ 20 (-97.78%)
Mutual labels:  google-sheets
Node Fetch
A light-weight module that brings the Fetch API to Node.js
Stars: ✭ 7,176 (+695.57%)
Mutual labels:  fetch-api
Firestoregoogleappsscript
A Google Apps Script library for accessing Google Cloud Firestore.
Stars: ✭ 352 (-60.98%)
Mutual labels:  google-sheets
Gspread
Google Sheets Python API
Stars: ✭ 5,676 (+529.27%)
Mutual labels:  google-sheets
wobbuffetch
Reactive wrapper for Fetch API
Stars: ✭ 28 (-96.9%)
Mutual labels:  fetch-api
social crawler
《JavaScript 爬蟲新思路!從零開始帶你用 Node. js 打造 FB&IG 爬蟲專案》書籍範例程式
Stars: ✭ 16 (-98.23%)
Mutual labels:  google-sheets
Fetch Suspense
A React hook compatible with React 16.6's Suspense component.
Stars: ✭ 479 (-46.9%)
Mutual labels:  fetch-api
lifebot
Use Google Sheets to log your life by texting it Emojis and pulling in data from Fitbit automatically.
Stars: ✭ 15 (-98.34%)
Mutual labels:  google-sheets
Apps Script Starter
Setup a local development environment inside Visual Studio Code and build Google Workspace add-ons with Google Apps Script
Stars: ✭ 611 (-32.26%)
Mutual labels:  google-sheets
fetch-wrap
extend WHATWG fetch wrapping it with middlewares
Stars: ✭ 21 (-97.67%)
Mutual labels:  fetch-api
Fetch Examples
A repository of Fetch examples. See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API for the corresponding documentation.
Stars: ✭ 431 (-52.22%)
Mutual labels:  fetch-api
Googlesheets
Google Spreadsheets R API
Stars: ✭ 771 (-14.52%)
Mutual labels:  google-sheets
Stein
Use Google Sheets as your no-setup database
Stars: ✭ 726 (-19.51%)
Mutual labels:  google-sheets
Tosheets
Send your stdin to google sheets
Stars: ✭ 536 (-40.58%)
Mutual labels:  google-sheets

Submit a Form to Google Sheets | Demo

How to create an HTML form that stores the submitted form data in Google Sheets using plain 'ol JavaScript (ES6), Google Apps Script, Fetch and FormData.

1. Create a new Google Sheet

  • First, go to Google Sheets and Start a new spreadsheet with the Blank template.
  • Rename it Email Subscribers. Or whatever, it doesn't matter.
  • Put the following headers into the first row:
A B C ...
1 timestamp email

To learn how to add additional input fields, checkout section 7 below.

2. Create a Google Apps Script

  • Click on Tools > Script Editor… which should open a new tab.
  • Rename it Submit Form to Google Sheets. Make sure to wait for it to actually save and update the title before editing the script.
  • Now, delete the function myFunction() {} block within the Code.gs tab.
  • Paste the following script in it's place and File > Save:
var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()

function intialSetup () {
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  scriptProp.setProperty('key', activeSpreadsheet.getId())
}

function doPost (e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(10000)

  try {
    var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
    var sheet = doc.getSheetByName(sheetName)

    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
    var nextRow = sheet.getLastRow() + 1

    var newRow = headers.map(function(header) {
      return header === 'timestamp' ? new Date() : e.parameter[header]
    })

    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])

    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}

If you want to better understand what this script is doing, checkout the form-script-commented.js file in the repo for a detailed explanation.

3. Run the setup function

  • Next, go to Run > Run Function > initialSetup to run this function.
  • In the Authorization Required dialog, click on Review Permissions.
  • Sign in or pick the Google account associated with this projects.
  • You should see a dialog that says Hi {Your Name}, Submit Form to Google Sheets wants to...
  • Click Allow

4. Add a new project trigger

  • Click on Edit > Current project’s triggers.
  • In the dialog click No triggers set up. Click here to add one now.
  • In the dropdowns select doPost
  • Set the events fields to From spreadsheet and On form submit
  • Then click Save

5. Publish the project as a web app

  • Click on Publish > Deploy as web app….
  • Set Project Version to New and put initial version in the input field below.
  • Leave Execute the app as: set to Me([email protected]).
  • For Who has access to the app: select Anyone, even anonymous.
  • Click Deploy.
  • In the popup, copy the Current web app URL from the dialog.
  • And click OK.

IMPORTANT! If you have a custom domain with Gmail, you might need to click OK, refresh the page, and then go to Publish > Deploy as web app… again to get the proper web app URL. It should look something like https://script.google.com/a/yourdomain.com/macros/s/XXXX….

6. Input your web app URL

Open the file named index.html. On line 12 replace <SCRIPT URL> with your script url:

<form name="submit-to-google-sheet">
  <input name="email" type="email" placeholder="Email" required>
  <button type="submit">Send</button>
</form>

<script>
  const scriptURL = '<SCRIPT URL>'
  const form = document.forms['submit-to-google-sheet']

  form.addEventListener('submit', e => {
    e.preventDefault()
    fetch(scriptURL, { method: 'POST', body: new FormData(form)})
      .then(response => console.log('Success!', response))
      .catch(error => console.error('Error!', error.message))
  })
</script>

As you can see, this script uses the the Fetch API, a fairly new promise-based mechanism for making web requests. It makes a "POST" request to your script URL and uses FormData to pass in our data as URL paramters.

Because Fetch and FormData aren't fully supported, you'll likely want to include their respective polyfills. See section #8.

Fun fact! The <html>, <head>, and body tags are actually among a handful of optional tags, but since the rules around how the browser parses a page are kinda complicated, you'd probably not want to omit them on real websites.

7. Adding additional form data

To capture additional data, you'll just need to create new columns with titles matching exactly the name values from your form inputs. For example, if you want to add first and last name inputs, you'd give them name values like so:

<form name="submit-to-google-sheet">
  <input name="email" type="email" placeholder="Email" required>
  <input name="firstName" type="text" placeholder="First Name">
  <input name="lastName" type="text" placeholder="Last Name">
  <button type="submit">Send</button>
</form>

Then create new headers with the exact, case-sensitive name values:

A B C D ...
1 timestamp email firstName lastName

8. Related Polyfills

Some of this stuff is not yet fully supported by browsers or doesn't work on older ones. Here are some polyfill options to use for better support.

Since the FormData polyfill is published as a Node package and needs to be compiled for browsers to work with, a good option for including these is using Browserify's CDN called wzrd.in. This service compiles, minifies and serves the latest version of these scripts for us.

You'll want to make sure these load before the main script handling the form submission. e.g.:

<script src="https://wzrd.in/standalone/formdata-polyfill"></script>
<script src="https://wzrd.in/standalone/[email protected]"></script>
<script src="https://wzrd.in/standalone/[email protected]"></script>

<script>
  const scriptURL = '<SCRIPT URL>'
  const form = document.forms['submit-to-google-sheet']
  ...
</script>

Have feedback/requests/issues?

Please create a new issue. PRs are definitely welcome, but please run your ideas by me before putting in a lot of work. Thanks!

Related/Inspirational Articles

Documentation

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].