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% 的时间里,你做的事情真的很蠢。