2025年9月17日 星期三

「Google Sheets Apps Script」填完表單,寄送 PDF 報名表

想不到只要這一段  Google Sheets 的 Apps Script 就能達到填完表單,
將報名表轉成 PDF 寄到使用者信箱。
真是太棒了!


🎯範本下載:
  


💡 簡單的比喻
想像你是一個製作活動證書的工讀生:
1. 接單:有人遞給你一張報名表(onFormSubmit)。
2. 拿母片:你去櫃子拿出唯一的「證書母片」(docTemplateId)。
3. 影印:你拿到影印機印了一張新的,並在檔案夾上寫上對方的名字(makeCopy)。
4. 填寫:你用立可白和原子筆,把母片上寫著「{{姓名}}」的地方塗掉,改寫成對方的名字(replaceText)。
5. 護貝:為了怕弄髒或被改字,你把證書拿去護貝變成不可修改的樣子(轉成 PDF)。
6. 寄信:最後把護貝好的證書裝進信封,貼上郵票寄出去(GmailApp.sendEmail)。
這段程式碼就是把這個工讀生變成了光速機器人,一秒鐘就能完成這些事!


1. 在表單回覆 - 新增試算表 -  Apps Script 程式碼


// 這個函式會在表單提交時自動執行
function onFormSubmit(e) {

  // TODO: 將這些變數設定為你自己的ID
  var docTemplateId = 'Google文件範本的ID'; // Google文件範本的ID
  var folderId = '資料夾ID'; // 儲存新生成PDF的資料夾ID

  // 從事件物件e中取得最新提交的資料
  var formData = e.namedValues;

  // 取得收件人的電子郵件地址,假設表單中有一個名為 "電子郵件地址" 的欄位
  // TODO: 將 "電子郵件" 替換成你表單中對應的欄位標題
  var recipientEmail = formData['Email Address'][0];

  // 檢查是否有收件人的電子郵件,如果沒有則終止腳本
  if (!recipientEmail) {
    Logger.log('沒有找到收件人電子郵件地址,腳本終止。');
    return;
  }

  // 取得範本文件
  var templateFile = DriveApp.getFileById(docTemplateId);
 
  // 取得目標資料夾
  var destinationFolder = DriveApp.getFolderById(folderId);

  // 複製範本文件到新檔案
  // var newDocName = '填寫者名稱 - 你的文件標題 ' + new Date().toLocaleDateString(); // TODO: 修改文件名
  var schoolName = formData['研習名稱'][0];
  var chineseName = formData['姓名'][0];
  var newDocName = schoolName + ' - ' + chineseName + ' - ' + '研習證明 ' + new Date().toLocaleDateString();
  var newDocFile = templateFile.makeCopy(newDocName, destinationFolder);

  // 打開新複製的文件
  var newDoc = DocumentApp.openById(newDocFile.getId());
  var body = newDoc.getBody();

  // 替換文件中的標記
  // 遍歷表單中的每個欄位
  for (var key in formData) {
    if (formData.hasOwnProperty(key)) {
      // 獲取表單欄位的值
      var value = formData[key][0];
      // 替換文件中的 {{欄位名稱}} 標記
      body.replaceText('{{' + key + '}}', value);
    }
  }

  // 儲存並關閉文件,以確保所有更改都已應用
  newDoc.saveAndClose();

  // 將新文件轉換為PDF並儲存到目標資料夾
  var pdfFile = newDocFile.getAs('application/pdf');

  // 將PDF文件寄送給收件人
  var subject = '您的報名文件已完成 - ' + newDocName; // TODO: 修改郵件主旨
  var emailBody = '您好,您的報名文件已備妥,請查收附件。'; // TODO: 修改郵件內文

  GmailApp.sendEmail(recipientEmail, subject, emailBody, {
    attachments: [pdfFile.setName(newDocName + '.pdf')]
  });

  Logger.log('已成功寄送文件給 ' + recipientEmail);
}


2.設定 觸發條件 


3. appsscript.json (選用 )
👉👉這也是研習直播時翻車的主要原因,因為少了 https://www.googleapis.com/auth/documents 


點選 左側 ⚙️ 專案設定 - ✅在編輯器中顯示「appsscript.json」資訊清單檔案
再回到 < > 編輯器中 將程式貼到 appsscript.json 中即可。


{
  "timeZone": "Asia/Taipei",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/presentations",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/gmail.send",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/forms",
    "https://www.googleapis.com/auth/documents"
  ]
}


或是 appsscript.json 直接使用預設值也是沒問題的。


{
  "timeZone": "Asia/Taipei",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}




快來試試吧~





沒有留言:

張貼留言

歡迎大家一起留言討論!