// ====================================================================
// ส่วนตั้งค่าระบบ (สำหรับแก้ไขเมื่อเริ่มรอบใหม่ / ใช้งานครั้งถัดไป)
// ====================================================================
var TEMPLATE_ID = '1HIgP173D6_MjkLAkfiTbbugLj-FngsYkgnNOOAyVL1w'; // id google slide เกียรติบัตร 29.7*21
var TOTAL_SCORE = 10; // คะแนนเต็ม กรณีสร้างแบบทดสอบ
var PASS_PERCENT = 60; // กำหนดเกณฑ์ผ่าน กรณีสร้างแบบทดสอบ
var SAVE_FOLDER_ID = '1fPArqT0wZBne3VYMkWwbLjFjpU6oH4Mn';
// [แก้ไขจุดที่ 1]: กำหนดเลขเริ่มต้นและปี พ.ศ. (สำหรับการใช้งานครั้งถัดไป ให้มาแก้ไขที่ 2 บรรทัดนี้)
var START_NUMBER = 6339; // <<-- แก้ไขเลขเริ่มต้นที่นี่ (ครั้งนี้เริ่มที่ 6339)
var YEAR_TEXT = '2569'; // <<-- แก้ไขปี พ.ศ. ที่นี่ (ครั้งนี้ใช้ 2569)
//--------------------------------จบส่วนตั้งค่า-------------------------------------------
var date = new Date();
var YEAR = date.getFullYear();
function createPdf(event) {
if (TEMPLATE_ID === '') {
throw new Error('TEMPLATE_ID needs to be defined in Code.gs');
}
// [แก้ไขจุดที่ 2]: เพิ่ม LockService ป้องกันปัญหาคนส่งฟอร์มพร้อมกันแล้วได้เลขซ้ำ
var lock = LockService.getScriptLock();
try {
lock.waitLock(30000); // รอคิวสูงสุด 30 วินาที
} catch (e) {
Logger.log('ไม่สามารถดึง Lock ได้เนื่องจากคิวเต็ม: ' + e.message);
return;
}
try {
var activeSheet;
var activeRowIndex;
var range;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var certify_sheet = sheets[1]; // ใช้งาน sheet ที่ 2 (index 1) สำหรับเก็บประวัติการออกเกียรติบัตร
if (typeof event === 'undefined') {
activeSheet = SpreadsheetApp.getActiveSheet();
if (activeSheet === null) {
throw new Error('Select a cell in the row that you want to use');
}
range = activeSheet.getActiveRange();
if (activeSheet === null) {
throw new Error('Select a cell in the row that you want to use');
}
activeRowIndex = range.getRowIndex();
} else {
range = event.range;
activeSheet = range.getSheet();
activeRowIndex = range.getRowIndex();
}
var numberOfColumns = 6;
var activeRow = activeSheet.getRange(activeRowIndex, 1, 1, numberOfColumns).getValues();
var user_email = activeRow[0][1];
var user_score = 10; // activeRow[0][2] กรณีสร้างแบบทดสอบ ลบ 10 และ // ออก
var user_name = activeRow[0][2];
var user_position = activeRow[0][3];
var school_name = activeRow[0][4];
var percentage = (user_score / TOTAL_SCORE) * 100;
Logger.log(user_name + " | " + school_name + " | คะแนน: " + percentage + "%");
// ตรวจสอบเกณฑ์การผ่าน
if (percentage >= PASS_PERCENT) {
// [แก้ไขจุดที่ 3]: ย้ายการคำนวณเลขรันนิ่งและสร้างไฟล์เข้ามาไว้ในบล็อกสอบผ่านเท่านั้น
var last_row = certify_sheet.getLastRow();
// คำนวณจำนวนเกียรติบัตรที่ออกไปแล้วในชีต 2 (ถ้ามีแค่หัวตาราง last_row <= 1 ถือว่าออกไป 0 ใบ)
var issued_count = (last_row <= 1) ? 0 : (last_row - 1);
// เลขรันนิ่ง = เลขเริ่มต้น + จำนวนที่เคยออกไปแล้ว
var running_number = START_NUMBER + issued_count;
// รวมเป็นรูปแบบ running_id (เช่น 6339/2569)
var running_id = running_number + "/" + YEAR_TEXT;
// สำเนารายงานและสร้างไฟล์
var slide_file = DriveApp.getFileById(TEMPLATE_ID).makeCopy();
var copyFile = slide_file.makeCopy(running_id + ' เกียรติบัตรผ่านการอบรมของ ' + user_name);
var copyId = copyFile.getId();
var copyDoc = SlidesApp.openById(copyId);
var slides = copyDoc.getSlides();
var templateSlide = slides[0];
var shapes = templateSlide.getShapes();
var save_pdf_folder = DriveApp.getFolderById(SAVE_FOLDER_ID);
// แทนที่ข้อความใน Slide (เลข running_id จะถูกแปลงเป็นเลขไทยอัตโนมัติด้วย thaiNumber)
shapes.forEach(function (shape) {
shape.getText().replaceAllText("{{name}}", user_name);
shape.getText().replaceAllText("{{position}}", user_position);
shape.getText().replaceAllText('{{school}}', school_name);
shape.getText().replaceAllText("{{email}}", user_email);
shape.getText().replaceAllText("{{score}}", thaiNumber(percentage));
shape.getText().replaceAllText("{{id}}", thaiNumber(running_id));
shape.getText().replaceAllText("{{date}}", getThaiDate());
shape.getText().replaceAllText('{{month}}', getThaiMonth());
shape.getText().replaceAllText('{{year}}', getThaiYear());
});
copyDoc.saveAndClose();
var pdf_file = DriveApp.createFile(copyFile.getAs("application/pdf"));
var pdf_download_url = pdf_file.getDownloadUrl();
// บันทึกประวัติลง Sheet ที่ 2 (จะเพิ่มขึ้นทีละ 1 แถวเฉพาะคนที่สอบผ่าน)
certify_sheet.appendRow([user_email, user_name, school_name, pdf_download_url]);
save_pdf_folder.addFile(pdf_file);
DriveApp.removeFile(pdf_file);
// ส่งอีเมล (เฉพาะคนที่สอบผ่านเท่านั้น)
GmailApp.sendEmail(user_email, "แจ้งรับเกียรติบัตรเรื่อง yyyyyy", "โดยกลุ่ม yyyyyyyy ท่านสามารถ Download ไฟล์ที่แนบมานี้", {
attachments: [pdf_file],
name: 'สพป.หนองบัวลำภู เขต 2 '
});
// ลบไฟล์ Slide ชั่วคราว
slide_file.setTrashed(true);
copyFile.setTrashed(true);
} else {
Logger.log("ขอแสดงความเสียใจ คุณสอบไม่ผ่าน");
}
} finally {
// [แก้ไขจุดที่ 2]: ปลดล็อกเพื่อประมวลผลคิวถัดไป
lock.releaseLock();
}
}
function getThaiDate() {
var date = new Date();
var DATE = date.getDate();
return thaiNumber(DATE);
}
function getThaiMonth() {
var date = new Date();
var MONTH = ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"];
var THAI_MONTH = MONTH[date.getMonth()];
return THAI_MONTH;
}
function getThaiYear() {
var date = new Date();
var YEAR = date.getFullYear();
var THAI_YEAR = YEAR + 543;
return thaiNumber(THAI_YEAR);
}
function thaiNumber(num){
var array = {"1":"๑", "2":"๒", "3":"๓", "4" : "๔", "5" : "๕", "6" : "๖", "7" : "๗", "8" : "๘", "9" : "๙", "0" : "๐"};
var str = num.toString();
for (var val in array) {
str = str.split(val).join(array[val]);
}
return str;
}
สอบถามได้ที่ Line id : daivdjiam