iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0

我們來講doGet程式碼及成果

程式碼解析

var row = parseInt(e.parameter.row);
var action = e.parameter.action;

e:和 onFormSubmit 觸發器一樣,這是一個事件物件,但這次它包含了從 URL 傳來的查詢參數。

e.parameter.row 和 e.parameter.action:這兩行程式碼會從網址中讀取 row 和 action 這兩個參數的值。

舉例來說,如果主管點擊的網址是 .../exec?row=5&action=approve,那麼 row 會是字串 "5",action 會是字串 "approve"。

if (!row || row < 2) {
  return ContentService.createTextOutput("錯誤:row 參數不正確");
}
// ...
var status = (action === "approve") ? "已核准" : "已退回";
var now = new Date();

這段程式碼先進行基本的錯誤檢查,確保 row 參數是有效的數字(至少大於等於 2,因為第一列通常是標題)。如果不正確,則回傳一個錯誤訊息。

接著,它根據 action 的值,將 status 變數設定為「已核准」或「已退回」。

now 變數則儲存了當前的時間。

var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var statusCol = headers.indexOf("狀態") + 1;
var timeCol = headers.indexOf("審核時間") + 1;
// ...
sheet.getRange(row, statusCol).setValue(status);
sheet.getRange(row, timeCol).setValue(now);

程式碼會先讀取試算表的標題列,找到「狀態」、「審核時間」和「Email」欄位的位置。這樣做的好處是,即使欄位順序改變了,程式碼仍能正確找到位置。

接著,它會根據 URL 傳來的 row 參數,精準定位到該筆申請資料所在的列,並將對應的「狀態」欄位更新為「已核准」或「已退回」,同時在「審核時間」欄位寫入當前時間。

var email = sheet.getRange(row, emailCol).getValue();

if (email) {
  MailApp.sendEmail({
    to: email,
    subject: "您的申請結果",
    body: "您的申請已被「" + status + "」。\n審核時間:" + now.toLocaleString()
  });
}

這段程式碼會先讀取該筆申請資料中員工的 Email。

接著,它會判斷是否有取得有效的 Email 地址,如果有的話,就會使用 MailApp.sendEmail 服務,自動發送一封電子郵件給員工,通知他們申請的最新結果。

return ContentService.createTextOutput("已更新狀態:" + status);

最後,doGet 函數會回傳一個簡單的文字頁面,顯示「已更新狀態:...」,讓點擊連結的使用者(主管)知道操作已經成功完成。

成果

當我們填好表單
https://ithelp.ithome.com.tw/upload/images/20250906/20169466yic0PHrzvi.png
我們就會收到
https://ithelp.ithome.com.tw/upload/images/20250906/2016946673xMDhTJEM.png
如果我們點按按鈕,會跳轉到一個網頁並顯示狀態
https://ithelp.ithome.com.tw/upload/images/20250906/201694661NZBLHFyOf.png
而前面員工的gmail就會收到回信
https://ithelp.ithome.com.tw/upload/images/20250906/20169466wnqidkDz1p.png
然後試算表這邊會更新狀態
https://ithelp.ithome.com.tw/upload/images/20250906/20169466jFdthTlvOV.png


上一篇
D22 進階觸發器應用
系列文
Google App Script雲端自動化與動態網頁實戰23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言