I know you can only run one doGet() or doPost() per project and I am trying to do 2 things on a custom form submit. It is not possible to use google forms as the form is far too complex.
Firstly I want to send the form data to google sheets and enter it into a new row. Secondly I want to send an email to someone that displays the data the submission in a reader friendly way.
I have tried to use a promise chain for this but I am having trouble with my props and accessing parameters. I am really bashing my head into the keyboard on this one.
As a side note I am aware that apps script doesn't support promises so I have used a polyfill that someone has kindly set up.
I think I just need to pass the properties/parameters through properly? or maybe the whole thing is just wrong?
Here is what I have so far:
var SHEET_NAME = "Sheet1";
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
function doPost(e) {
(function () {
// this loads the es6-promises polyfill to make promise syntax available in Apps Script
// copyright notice - https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
var Promise,
setTimeout = setTimeout || function (func,ms) {
Utilities.sleep(ms);
func();
};
// get the polyfill and eval
if (!Promise) {
var result = UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/es6-promise/3.2.1/es6-
promise.min.js');
eval (result.getContentText());
// add done for compatibility with other promise systems
// Promise.prototype.done = Promise.prototype.done || Promise.prototype.then ;
}
}());
var p1 = handleResponse(e);
var p2 = sendEmail(e);
Promise.all ([p1,p2,], 3000).then (
function (results) {
Logger.log("success");
},
function (errors) {
Logger.log("Something went wrong: " + errors);
}
);
}
function handleResponse(e) {
return new Promise (function ( resolve, reject ) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
// next set where to write the data
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
//var headRow = e.parameter.header_row || 1;
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow()+1; // get next row
var row = [];
// loop through the header columns
for (var i in headers){
if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
row.push(new Date());
} else { // else use header name to get data
row.push(e.parameter[headers[i]]);
}
}
resolve(sheet.getRange(nextRow, 1, 1, row.length).setValues([row]));
// return json success results
return ContentService
.createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
.setMimeType(ContentService.MimeType.JSON);
} catch(error){
// if error return this
reject(error);
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": error}))
.setMimeType(ContentService.MimeType.JSON);
} finally {
return lock.releaseLock();
}
})
}
function sendEmail(e) {
return new Promise (function ( resolve, reject ) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
// fetching the data
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
//var headRow = e.parameter.header_row || 1;
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow()+1; // get next row
var lastRow = sheet.getLastRow(); // get last row
var formValues = sheet.getRange(36, 1, 1, sheet.getLastColumn()).getValues()[0];
let emailValues = new Map();
for (var i in formValues){
if (formvalues[i] !== '') {
emailValues.set(headers[i], formvalues[i]);
}
}
Logger.log(emailValues);
var htmlTemplate = HtmlService.createTemplateFromFile("message.html");
htmlTemplate.row = emailValues;
var message = htmlTemplate.evaluate().getContent();
var email = "insert-email@here.com";
var subject = "Test";
var body = "";
resolve(MailApp.sendEmail(email, subject, body, {
htmlBody: message,
name: "Send Mail Test"
}));
Logger.log("mikesteeletaylor@gmail.com");
Logger.log(MailApp.getRemainingDailyQuota());
} catch(error) {
Logger.log("There is a problem sending the email: " + error);
reject(error);
} finally {
return lock.releaseLock();
}
})
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
SCRIPT_PROP.setProperty("key", doc.getId());
}
edit: After @TheMaster 's comments, this is my updated code:
var SHEET_NAME = "Sheet1";
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
function doPost(e) {
handleResponse(e);
sendEmail(e);
}
function handleResponse(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
// next set where to write the data
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
var headRow = e.parameter.header_row || 1;
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow()+1; // get next row
var row = [];
// loop through the header columns
for (var i in headers){
if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
row.push(new Date());
} else { // else use header name to get data
row.push(e.parameter[headers[i]]);
}
}
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
// return json success results
return ContentService
.createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
.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);
} finally {
return lock.releaseLock();
}
}
function sendEmail(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
// fetch the data
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
var headRow = e.parameter.header_row || 1;
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow()+1; // get next row
var lastRow = sheet.getLastRow(); // get last row
var formValues = sheet.getRange(36, 1, 1, sheet.getLastColumn()).getValues()[0];
let emailValues = new Map();
for (var i in formValues){
if (formvalues[i] !== '') {
emailValues.set(headers[i], formvalues[i]);
}
}
Logger.log(emailValues);
var htmlTemplate = HtmlService.createTemplateFromFile("message.html");
htmlTemplate.row = emailValues;
var message = htmlTemplate.evaluate().getContent();
var email = "insert-email@here.com";
var subject = "Test";
var body = "";
MailApp.sendEmail(email, subject, body, {
htmlBody: message,
name: "Send Mail Test"
});
Logger.log("mikesteeletaylor@gmail.com");
Logger.log(MailApp.getRemainingDailyQuota());
} catch(error) {
Logger.log("There is a problem sending the email: " + error);
} finally {
return lock.releaseLock();
}
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
SCRIPT_PROP.setProperty("key", doc.getId());
}