Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
A Google Form which sends all the data, including attachment to a URL of your choice via webhooks.
* Inspired by
* Please keep the source code updated with this gist at
* There's no way to have a gist owned by an organization
var webhook_url = "https://your.own/webhook/path";
var webhook_key = "r@nd0mSt1ng";
function onFormSubmit(e) {
var data = {
"response": {
"id": e.response.getId(),
"timestamp": e.response.getTimestamp(),
"data": e.response.getItemResponses().map(function(item) { // Maps itemResponses into an array of obj with keys: "key and val"
return {
key: item.getItem().getTitle(),
val: item.getItem().getTitle() == "Receipt" ? getFileBlobsWithFileName(item.getResponse()) : item.getResponse()
}, this).reduce(function(obj,i){ // Squeezes into one single object
obj[i.key] = i.val;
return obj;
}, {"Email": e.response.getRespondentEmail(), "entropy": Utilities.getUuid()}) // Starting with email and randomly generated entropy as keys
var string_data = JSON.stringify(data);
var options = {
method: "post",
headers: {"Authorization": computeDigestString(string_data, webhook_key)},
payload: string_data,
contentType: "application/json; charset=utf-8",
UrlFetchApp.fetch(webhook_url, options);
function getFileBlobsWithFileName(files) {
return {
var file = DriveApp.getFileById(f);
return {
file_name: file.getName(),
mime_type: file.getMimeType(),
base64_blob: Utilities.base64Encode(file.getBlob().getBytes())
}, this);
function computeDigestString(payload, secret) {
var byteSignature = Utilities.computeHmacSha256Signature(payload, secret);
return Utilities.base64Encode(byteSignature);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment