今天我們來用表單連接GAS去自動產生pdf文件
一樣先開一個google 表單,再用表單連結的試算表開GAS。
function onFormSubmit(e) {
var sheet = e.range.getSheet();
var row = e.range.getRow();
var rowData = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
e:這個參數是 Google Apps Script 在觸發時自動傳入的「事件物件」,包含了表單提交的相關資訊。
e.range.getSheet() 和 e.range.getRow():從事件物件中取得觸發表單回應的試算表物件和新資料所在的列號。
sheet.getRange(...).getValues()[0]:讀取該列的所有資料,並將其存入 rowData 這個陣列中。
// 設定欄位對應 (假設表單欄位順序是:時間戳記, 姓名, 部門, 日期, 用途, Email)
var name = rowData[1];
var department = rowData[3];
var date = rowData[4];
var purpose = rowData[6];
var email = rowData[2];
var money= rowData[5];
這段程式碼根據表單欄位的固定索引位置來提取資料。例如,rowData[1] 假設對應的是表單的第二個欄位「姓名」,rowData[3] 則對應第四個欄位「部門」。
// 模板文件 ID
var templateId = "1fvKQ2xdBoMEFAte98LwtTizwoi14vu24nb2duVfs-MI";
var folderId = "1bz1sEXfdobTEd29GsP1u-9Z-B0-ZGtEJ";
// 複製模板
var templateFile = DriveApp.getFileById(templateId);
var newFile = templateFile.makeCopy(name + "_申請單", DriveApp.getFolderById(folderId));
templateId 和 folderId:這兩個變數必須事先設定,分別代表你的 Google Docs 範本文件 ID 和存放新文件的資料夾 ID。
DriveApp.getFileById(templateId):透過 ID 取得範本文件。
.makeCopy(...):複製範本文件。新複製的文件會以「員工姓名_申請單」命名,並存放在指定的資料夾中。
var doc = DocumentApp.openById(newFile.getId());
var body = doc.getBody();
// 替換模板文字
body.replaceText("<<NAME>>", name);
body.replaceText("<<DEPARTMENT>>", department);
body.replaceText("<<DATE>>", date);
body.replaceText("<<PURPOSE>>", purpose);
body.replaceText("<<EMAIL>>",email);
body.replaceText("<<MONEY>>",money);
doc.saveAndClose();
// 轉成 PDF
var pdf = newFile.getAs("application/pdf");
// 寄送 Email (可選)
GmailApp.sendEmail(email, "你的申請單", "請查收附件 PDF", {
attachments: [pdf]
});
}
DocumentApp.openById(...):以 Google Docs 服務開啟剛剛複製出來的新文件。
body.replaceText(...):這是關鍵步驟。程式碼會自動找到文件內所有 <<...>> 格式的占位符,並用表單中提取的實際資料來替換它們。
doc.saveAndClose():完成替換後,儲存並關閉文件。
newFile.getAs("application/pdf"):將剛才編輯好的 Google Docs 文件轉換為 PDF 格式的位元組串流(Blob)。
GmailApp.sendEmail(...):這行程式碼利用 Gmail 服務,向表單提交者的 email 地址寄送一封電子郵件。
attachments: [pdf]:將剛才轉換好的 PDF 檔案,以附件的形式夾帶在信件中。
我們必須設定一個觸發器讓其可以在提交表單時自動產生文件。
觸發器設定如下: