是否可以在单个触发器上运行连续函数(即 "On Form Submit" ) 在谷歌应用脚本中?



我知道每个项目只能运行一个doGet((或doPost((,我正试图在自定义表单提交上做两件事。使用谷歌表单是不可能的,因为表单太复杂了。

首先,我想将表单数据发送到谷歌表单,并将其输入到新行中。其次,我想给某人发一封电子邮件,以读者友好的方式显示提交的数据。

我曾尝试使用承诺链来实现这一点,但我在道具和访问参数方面遇到了问题。在这个键盘上,我真的很头疼。

顺便说一句,我知道应用程序脚本不支持承诺,所以我使用了一个有人好心设置的polyfill。

我想我只需要正确地传递属性/参数?或者可能整件事都错了?

以下是我目前所拥有的:


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());
}

编辑:在@TheMaster的评论之后,这是我更新的代码:

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());
}

是的,可以运行"连续函数";在单触发中

超级简单的例子:

/**
* Function to be called by a trigger
*
* @param {Object} event Event object
*/
function myTrigger(event){
myFirstFunction(event); // This could be the function that send the form data to an spreadsheet assumin that event holds the form data
mySecondFunction(event); // This could be the function that send an email
myThirdFunction(); // This could be another function
}

最新更新