Google Sheets AppScript - doPost 中嵌套的 try catch - 行为取决于调用方法?
Google Sheets AppScript - nested try catch in doPost - behaviour depends on method of invocation?
我在 Google 表格中有一个绑定的 AppScript,它将一些数据从 HTML 表单写入传播sheet 并将他们提交的数据通过电子邮件发送给用户。
doPost()
中的所有内容都包含在 try{} catch(){return}
中,因此始终有成功的 HTTP 响应,即使它是我向用户显示的错误消息。
我有一个 doGet(e)
函数调用 doPost(e)
进行调试。
我还有一个简单的函数,可以记录到 sheet(因为当 doPost
被 post 数据触发时,它不会记录任何来自 Logger.log()
).作为参考(虽然我认为它无关紧要)我已经包含了我的 logToSheet 代码。
我正在尝试将 MailApp.sendMail()
包装在 try catch(return) 中,以便我可以向用户报告写入 sheet 已成功,并且只是通过电子邮件发送失败(而不仅仅是 某事 在提交过程中失败,他们应该继续尝试提交)。
脚本在处理有效数据时运行良好。
奇怪的是,当我从 AppScript IDE 执行 doPost() 或通过使用带有无效电子邮件地址的测试数据发出 GET 请求时,它按预期工作 - 脚本在嵌套捕获中停止,如由执行日志语句确认。但是,当我通过 POSTing 数据触发脚本时(即使丢弃 POSTed 数据并使用与 运行 来自 GET 或 IDE 时相同的测试数据) ,来自外部捕获的脚本 returns,并且日志未正确写入 sheet.
我的部署是最新的,我正在 post 进行正确的部署 URL。
这是我的简化代码:
function doGet(e) { //Treat GET requests same as POST's for debugging/testing
Logger.log('GET request');
Logger.log(e);
doPost(e);
}
doPost(ignorePostData) {
try{
// Some test parameters for debugging.
e = {
parameters: {
uuid: '60e16d53-9ac1-4bb7-9451-0fe09bfa0c82',
mobility___2: 'on',
email: ['oliveil.com'],
transport___1: 'on',
allergens___1: 'Gluten, Peanuts',
meal_type___1: `Children's meal (Under 13)`,
meal_type___2: `No Meal (Infant)`,
dietary___1: '',
rsvp_yesno: 'Yes',
dietary___2: '',
mobility___1: 'on',
guest___1: 'Guest 1 Name',
allergens___2: 'Gluten',
transport___2: 'on',
salt: 'fnw3cz',
guest___2: 'Guest 2 Name',
group_name: 'Group Name Here'
}
};
logToSheet(e.parameters);
//code to write data to sheet here (which works fine)
//And generate the OPTIONS_OBJECT (which works with a valid email address)
try{
MailApp.sendEmail(OPTIONS_OBJECT); //Send the email
}catch (error){
Logger.log('mail error block');
logToSheet('mail error block');
Logger.log(error);
logToSheet(error.toString());
return ContentService
.createTextOutput(JSON.stringify({ "result": "error", "errordetails": error.toString(), "message": "Sorry, something went wrong while sending an email with your RSVP details. Your RSVP has been received successfully though!<br /><br />The error has been logged." }))
.setMimeType(ContentService.MimeType.JSON);
}
} catch (error) { // if error return this
Logger.log('main error block');
Logger.log(error);
logToSheet('main error block');
logToSheet(error.toString());
return ContentService
.createTextOutput(JSON.stringify({ "result": "error", "errordetails": error.toString(), "message": "Sorry, something went wrong while processing your submission. Please try again.<br /><br />The error has been logged." }))
.setMimeType(ContentService.MimeType.JSON);
}
}
//A simple logging function, since we can't get logs of doPOST without more complex setup
function logToSheet(logString) {
const doc = SpreadsheetApp.getActiveSpreadsheet();
const sheet = doc.getSheetByName('logs'); // select the Guest RSVPs sheet
const data = sheet.getDataRange();
const nextRow = sheet.getLastRow() + 1; // get next row
const time = new Date().toUTCString();
sheet.getRange(nextRow, 1, 1, 2).setValues([[time, logString]]);
return;
}
这是从 IDE 或 GET 请求触发时的输出:
以及POST触发的结果:
编辑: 根据要求,添加了我的 logToSheet()
功能。我还尝试重命名两个 catch 块中的错误变量,所以这不是一个奇怪的变量范围问题。
我有预感这可能是由于异步行为...
我是个白痴。我正在编辑我的 scripts.js 文件,忘记了我已经切换我的站点以加载缩小文件 - 它没有更新,因为我没有启用保存时缩小。
经验教训 - 记录部署,并在测试时存档旧部署。
像往常一样,当计算机不可重复时,您要么在做一些非常愚蠢的事情,要么是一些真正的边缘情况,需要非常低水平的理解。
而且 99.9% 的时间里,你做的事情真的很蠢。
我在 Google 表格中有一个绑定的 AppScript,它将一些数据从 HTML 表单写入传播sheet 并将他们提交的数据通过电子邮件发送给用户。
doPost()
中的所有内容都包含在 try{} catch(){return}
中,因此始终有成功的 HTTP 响应,即使它是我向用户显示的错误消息。
我有一个 doGet(e)
函数调用 doPost(e)
进行调试。
我还有一个简单的函数,可以记录到 sheet(因为当 doPost
被 post 数据触发时,它不会记录任何来自 Logger.log()
).作为参考(虽然我认为它无关紧要)我已经包含了我的 logToSheet 代码。
我正在尝试将 MailApp.sendMail()
包装在 try catch(return) 中,以便我可以向用户报告写入 sheet 已成功,并且只是通过电子邮件发送失败(而不仅仅是 某事 在提交过程中失败,他们应该继续尝试提交)。
脚本在处理有效数据时运行良好。
奇怪的是,当我从 AppScript IDE 执行 doPost() 或通过使用带有无效电子邮件地址的测试数据发出 GET 请求时,它按预期工作 - 脚本在嵌套捕获中停止,如由执行日志语句确认。但是,当我通过 POSTing 数据触发脚本时(即使丢弃 POSTed 数据并使用与 运行 来自 GET 或 IDE 时相同的测试数据) ,来自外部捕获的脚本 returns,并且日志未正确写入 sheet.
我的部署是最新的,我正在 post 进行正确的部署 URL。
这是我的简化代码:
function doGet(e) { //Treat GET requests same as POST's for debugging/testing
Logger.log('GET request');
Logger.log(e);
doPost(e);
}
doPost(ignorePostData) {
try{
// Some test parameters for debugging.
e = {
parameters: {
uuid: '60e16d53-9ac1-4bb7-9451-0fe09bfa0c82',
mobility___2: 'on',
email: ['oliveil.com'],
transport___1: 'on',
allergens___1: 'Gluten, Peanuts',
meal_type___1: `Children's meal (Under 13)`,
meal_type___2: `No Meal (Infant)`,
dietary___1: '',
rsvp_yesno: 'Yes',
dietary___2: '',
mobility___1: 'on',
guest___1: 'Guest 1 Name',
allergens___2: 'Gluten',
transport___2: 'on',
salt: 'fnw3cz',
guest___2: 'Guest 2 Name',
group_name: 'Group Name Here'
}
};
logToSheet(e.parameters);
//code to write data to sheet here (which works fine)
//And generate the OPTIONS_OBJECT (which works with a valid email address)
try{
MailApp.sendEmail(OPTIONS_OBJECT); //Send the email
}catch (error){
Logger.log('mail error block');
logToSheet('mail error block');
Logger.log(error);
logToSheet(error.toString());
return ContentService
.createTextOutput(JSON.stringify({ "result": "error", "errordetails": error.toString(), "message": "Sorry, something went wrong while sending an email with your RSVP details. Your RSVP has been received successfully though!<br /><br />The error has been logged." }))
.setMimeType(ContentService.MimeType.JSON);
}
} catch (error) { // if error return this
Logger.log('main error block');
Logger.log(error);
logToSheet('main error block');
logToSheet(error.toString());
return ContentService
.createTextOutput(JSON.stringify({ "result": "error", "errordetails": error.toString(), "message": "Sorry, something went wrong while processing your submission. Please try again.<br /><br />The error has been logged." }))
.setMimeType(ContentService.MimeType.JSON);
}
}
//A simple logging function, since we can't get logs of doPOST without more complex setup
function logToSheet(logString) {
const doc = SpreadsheetApp.getActiveSpreadsheet();
const sheet = doc.getSheetByName('logs'); // select the Guest RSVPs sheet
const data = sheet.getDataRange();
const nextRow = sheet.getLastRow() + 1; // get next row
const time = new Date().toUTCString();
sheet.getRange(nextRow, 1, 1, 2).setValues([[time, logString]]);
return;
}
这是从 IDE 或 GET 请求触发时的输出:
以及POST触发的结果:
编辑: 根据要求,添加了我的 logToSheet()
功能。我还尝试重命名两个 catch 块中的错误变量,所以这不是一个奇怪的变量范围问题。
我有预感这可能是由于异步行为...
我是个白痴。我正在编辑我的 scripts.js 文件,忘记了我已经切换我的站点以加载缩小文件 - 它没有更新,因为我没有启用保存时缩小。
经验教训 - 记录部署,并在测试时存档旧部署。
像往常一样,当计算机不可重复时,您要么在做一些非常愚蠢的事情,要么是一些真正的边缘情况,需要非常低水平的理解。
而且 99.9% 的时间里,你做的事情真的很蠢。