我在 Google 表格中有一個系結的 AppScript,它將 HTML 表單中的一些資料寫入電子表格,并將他們提交的資料通過電子郵件發送給用戶。
里面的所有東西都doPost()被包裹在一個 中try{} catch(){return},所以總是有一個成功的 HTTP 回應,即使它是我向用戶顯示的錯誤訊息。
我有一個用于除錯目的的doGet(e)函式。doPost(e)
我還有一個簡單的函式,可以記錄到作業表(因為當doPost被發布資料觸發時,它不會記錄任何內容Logger.log())。作為參考(盡管我認為這無關緊要),我已經包含了我的 logToSheet 代碼。
我正在嘗試包裝MailApp.sendMail()一個 try catch(return),以便我可以向用戶報告寫入作業表是成功的,只是電子郵件發送失敗(而不僅僅是在提交程序中失敗了,他們應該繼續嘗試提交) .
該腳本適用于有效資料。
奇怪的是,當我從 AppScript IDE 執行 doPost() 或使用帶有無效電子郵件地址的測驗資料發出 GET 請求時,它按預期作業 - 腳本停止在嵌套的 catch 中,正如執行日志陳述句所證實的那樣。但是,當我通過 POST 資料觸發腳本時(即使丟棄 POST 資料并使用與從 GET 或 IDE 運行時相同的測驗資料),腳本從外部捕獲回傳,并且日志未正確寫入作業表.
我的部署是最新的,并且我將發布到正確的部署 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 塊中的錯誤變數,所以這不是一個奇怪的變數范圍問題。
我有一種預感,這可能是由于異步行為...
uj5u.com熱心網友回復:
我是個白癡。我正在編輯我的 scripts.js 檔案,卻忘記了我已切換我的站點以加載縮小檔案——它沒有更新,因為我沒有啟用保存時縮小。
經驗教訓 - 記錄部署,并在測驗時存檔舊部署。
像往常一樣,當計算機不可重復時,你要么在做一些非常愚蠢的事情,要么是一些真正的邊緣案例,需要非常低層次的理解。
99.9% 的時間里,你在做一些非常愚蠢的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/486526.html
標籤:javascript 谷歌应用脚本 谷歌表格 http-post 试着抓
上一篇:如何*反轉*逗號分隔的輸出,組合來自2個特定單元格的資料?
下一篇:Vue3/Javascript:GoogleSheetsApi-403Forbidden/PERMISSION_DENIED
