/** * ฟังก์ชันหลักสำหรับแสดงผลหน้าเว็บ */ function doGet() { const htmlTemplate = HtmlService.createTemplateFromFile('index').evaluate(); const template = htmlTemplate .setTitle("Project Kru Chian") .setFaviconUrl("https://wichianp.github.io/web/guruchian_Logo.png") .addMetaTag('viewport', 'width=device-width , initial-scale=1') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) .setSandboxMode(HtmlService.SandboxMode.IFRAME); return template; } /** * 1. บันทึกไฟล์ PDF โดยใช้ Folder ID ที่กำหนด * @param {string} base64Data ข้อมูลไฟล์ Base64 [cite: 130, 139] * @param {string} fileName ชื่อไฟล์ [cite: 131, 141] * @param {Object} metadata ข้อมูลเสริม (จำนวนไฟล์, หน้า, หมวดหมู่) [cite: 132, 140] */ function saveMergedPDF(base64Data, fileName, metadata) { try { // กำหนด Folder ID ตามที่ระบุ const folderId = 'xxxxxxxxxxxxxxxxxxxxx'; // เปลี่ยน Folder ID ของท่าน const folder = DriveApp.getFolderById(folderId); // แปลง Base64 เป็น Blob [cite: 129, 137, 138] const decoded = Utilities.base64Decode(base64Data); const blob = Utilities.newBlob(decoded, 'application/pdf', fileName + '.pdf'); // บันทึกไฟล์ลงในโฟลเดอร์ที่ระบุ const file = folder.createFile(blob); // 2. เรียกฟังก์ชันบันทึกประวัติลง Google Sheets const fileSizeFormatted = formatBytes(file.getSize()); saveHistoryToSheet(fileName, metadata, file.getId(), fileSizeFormatted); return { success: true, fileUrl: file.getUrl(), fileId: file.getId() }; } catch (e) { return { success: false, message: e.toString() }; // [cite: 140] } } /** * 2. ปรับปรุงการบันทึกประวัติให้ลง Google Sheets */ function saveHistoryToSheet(fileName, metadata, fileId, fileSize) { try { // ระบุ ID ของ Spreadsheet ที่คุณต้องการบันทึก (หรือใช้ .getActiveSpreadsheet() ถ้าผูกสคริปต์ไว้) // const ss = SpreadsheetApp.openById('ใส่_ID_ของ_Google_Sheet_ตรงนี้'); const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheets()[0]; // เลือก Sheet แรก sheet.appendRow([ new Date().toLocaleString('th-TH'), // วันที่-เวลา fileName, // ชื่อไฟล์ [cite: 151] metadata.category || 'ทั่วไป', // หมวดหมู่ [cite: 132, 152, 155] metadata.fileCount || 0, // จำนวนไฟล์ที่รวม [cite: 132, 158] metadata.totalPages || 0, // จำนวนหน้าทั้งหมด [cite: 132, 158] fileSize, // ขนาดไฟล์ที่รวมแล้ว [cite: 159] fileId // ID ของไฟล์ใน Drive [cite: 160] ]); } catch (e) { console.error('Error saving to sheet: ' + e.toString()); } } /** * ดึงประวัติจาก Google Sheets มาแสดงผลที่หน้าประวัติ (History Modal) * รองรับโครงสร้างข้อมูลที่ไฟล์ HTML ต้องการ [cite: 153, 156] */ function getMergeHistory() { try { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('Data'); const data = sheet.getDataRange().getDisplayValues(); if (data.length <= 1) return { success: true, data: [] }; // กรณีมีแต่หัวตาราง [cite: 154] // แปลงข้อมูลจาก Sheet เป็น JSON Object ให้ตรงกับที่ UI ต้องการ [cite: 156, 157] const history = data.slice(1).reverse().map(row => { return { timestamp: row[0], filename: row[1], // [cite: 157] category: row[2], // [cite: 157] files_merged: row[3], // [cite: 157, 159] total_pages: row[4], // [cite: 157, 159] file_size: row[5], // [cite: 157, 159] drive_file_id: row[6] // [cite: 157, 160] }; }); return { success: true, data: history }; } catch (e) { return { success: false, message: e.toString() }; //[cite: 154] } } /** * ฟังก์ชันช่วยแปลงขนาดไฟล์ */ function formatBytes(bytes) { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; //[cite: 74] }