{"id":18080,"date":"2026-01-07T18:11:02","date_gmt":"2026-01-07T11:11:02","guid":{"rendered":"https:\/\/www.ivecr5.ac.th\/web2020\/?page_id=18080"},"modified":"2026-09-30T14:51:19","modified_gmt":"2026-09-30T07:51:19","slug":"%e0%b8%87%e0%b8%9a%e0%b8%97%e0%b8%94%e0%b8%a5%e0%b8%ad%e0%b8%87%e0%b8%aa%e0%b8%ad%e0%b8%815","status":"publish","type":"page","link":"https:\/\/www.ivecr5.ac.th\/web2020\/%e0%b8%87%e0%b8%9a%e0%b8%97%e0%b8%94%e0%b8%a5%e0%b8%ad%e0%b8%87%e0%b8%aa%e0%b8%ad%e0%b8%815\/","title":{"rendered":"\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07\u0e2a\u0e2d\u0e015"},"content":{"rendered":"<div class=\"vce-row-container\" data-vce-boxed-width=\"true\"><div class=\"vce-row vce-row--col-gap-30 vce-row-equal-height vce-row-content--top\" id=\"el-547f48c8\" data-vce-do-apply=\"all el-547f48c8\"><div class=\"vce-row-content\" data-vce-element-content=\"true\"><div class=\"vce-col vce-col--md-auto vce-col--xs-1 vce-col--xs-last vce-col--xs-first vce-col--sm-last vce-col--sm-first vce-col--md-last vce-col--lg-last vce-col--xl-last vce-col--md-first vce-col--lg-first vce-col--xl-first\" id=\"el-3930ecd2\"><div class=\"vce-col-inner\" data-vce-do-apply=\"border margin background  el-3930ecd2\"><div class=\"vce-col-content\" data-vce-element-content=\"true\" data-vce-do-apply=\"padding el-3930ecd2\"><div class=\"vcv-row-control-wrapper\"><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"vce-row-container\" data-vce-boxed-width=\"true\"><div class=\"vce-row vce-row--col-gap-30 vce-row-equal-height vce-row-content--top\" id=\"el-3f9074df\" data-vce-do-apply=\"all el-3f9074df\"><div class=\"vce-row-content\" data-vce-element-content=\"true\"><div class=\"vce-col vce-col--md-auto vce-col--xs-1 vce-col--xs-last vce-col--xs-first vce-col--sm-last vce-col--sm-first vce-col--md-last vce-col--lg-last vce-col--xl-last vce-col--md-first vce-col--lg-first vce-col--xl-first\" id=\"el-a5f62bf5\"><div class=\"vce-col-inner\" data-vce-do-apply=\"border margin background  el-a5f62bf5\"><div class=\"vce-col-content\" data-vce-element-content=\"true\" data-vce-do-apply=\"padding el-a5f62bf5\"><div class=\"vce-raw-html\"><div class=\"vce-raw-html-wrapper\" id=\"el-9902d603\" data-vce-do-apply=\"all el-9902d603\">\n\n\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07 \u0e2a\u0e2d\u0e01.5<\/title>\n    <!-- Tailwind CSS CDN -->\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <!-- Google Fonts: Prompt -->\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Prompt:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&amp;display=swap\" rel=\"stylesheet\">\n    <!-- FontAwesome Icons -->\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n    \n    <script>\n        tailwind.config = {\n            theme: {\n                extend: {\n                    fontFamily: {\n                        sans: ['Prompt', 'sans-serif'],\n                    }\n                }\n            }\n        }\n    <\/script>\n    \n    <style>\n        body {\n            font-family: 'Prompt', sans-serif;\n            background-color: #f8fafc;\n        }\n\n        \/* Custom scrollbar *\/\n        ::-webkit-scrollbar {\n            width: 8px;\n            height: 8px;\n        }\n        ::-webkit-scrollbar-track {\n            background: #f1f5f9;\n        }\n        ::-webkit-scrollbar-thumb {\n            background: #cbd5e1;\n            border-radius: 4px;\n        }\n        ::-webkit-scrollbar-thumb:hover {\n            background: #94a3b8;\n        }\n\n        .card-shadow {\n            box-shadow: 0 10px 25px -5px rgba(15, 23, 42, 0.08), 0 8px 10px -6px rgba(15, 23, 42, 0.04);\n        }\n\n        .month-btn {\n            transition: all 0.15s ease-in-out;\n        }\n        \n        .month-btn:hover {\n            transform: translateY(-1px);\n            background-color: #f1f5f9;\n            border-color: #cbd5e1;\n        }\n\n        .annual-btn {\n            transition: all 0.15s ease-in-out;\n        }\n\n        .annual-btn:hover {\n            transform: translateY(-1px);\n            background-color: #fef3c7;\n        }\n    <\/style>\n\n\n\n    <!-- Top Header -->\n    <header class=\"bg-white border-b border-slate-200 sticky top-0 z-30 shadow-sm\">\n        <div class=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-5 text-center sm:text-left\">\n            <h1 class=\"text-2xl sm:text-3xl font-bold text-slate-800 tracking-tight\">\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07 \u0e2a\u0e2d\u0e01.5<\/h1>\n        <\/div>\n    <\/header>\n\n    <!-- Main Content Area -->\n    <main class=\"flex-grow max-w-[1600px] w-full mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n        \n        <!-- Subtle Loading Indicator -->\n        <div id=\"loadingIndicator\" class=\"hidden my-8 text-center py-12\">\n            <div class=\"inline-flex items-center px-4 py-2 font-medium text-sm text-blue-600 bg-white border border-blue-100 rounded-full shadow-sm\">\n                <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-blue-600\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n                    <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"><\/circle>\n                    <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"><\/path>\n                <\/svg>\n                \u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07...\n            <\/div>\n        <\/div>\n\n        <!-- Dynamic Fiscal Years Grid -->\n        <div id=\"yearsGrid\" class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 lg:gap-8\">\n            <!-- Fiscal Year Cards will be dynamically rendered here from Google Sheet -->\n        <\/div>\n\n    <\/main>\n\n    <!-- Footer -->\n    <footer class=\"bg-white border-t border-slate-200 mt-auto py-5 text-center text-xs text-slate-500\">\n        <div class=\"max-w-7xl mx-auto px-4\">\n            <p>\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07 \u0e2a\u0e2d\u0e01.5 \u00a9 <span id=\"currentYear\"><\/span> - \u0e23\u0e30\u0e1a\u0e1a\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2a\u0e2b\u0e01\u0e23\u0e13\u0e4c<\/p>\n        <\/div>\n    <\/footer>\n\n    <!-- Document Viewer Modal -->\n    <div id=\"docModal\" class=\"fixed inset-0 bg-slate-900\/60 backdrop-blur-sm z-50 hidden flex items-center justify-center p-3 sm:p-6\">\n        <div class=\"bg-white rounded-2xl w-full max-w-5xl h-[90vh] flex flex-col shadow-2xl overflow-hidden border border-slate-200\">\n            <!-- Modal Header -->\n            <div class=\"px-6 py-4 bg-slate-800 text-white flex items-center justify-between\">\n                <div class=\"flex items-center space-x-3 overflow-hidden\">\n                    <i class=\"fa-solid fa-file-pdf text-red-400 text-xl flex-shrink-0\"><\/i>\n                    <h3 id=\"modalTitle\" class=\"font-semibold text-lg truncate\">\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19<\/h3>\n                <\/div>\n                <div class=\"flex items-center space-x-2\">\n                    <a id=\"downloadBtn\" href=\"#\" target=\"_blank\" class=\"px-3 py-1.5 bg-slate-700 hover:bg-slate-600 text-white rounded-lg text-sm font-medium transition duration-150 flex items-center gap-1.5\">\n                        <i class=\"fa-solid fa-arrow-up-right-from-square\"><\/i>\n                        <span>\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e43\u0e2b\u0e21\u0e48<\/span>\n                    <\/a>\n                    <button onclick=\"closeModal()\" class=\"w-9 h-9 rounded-lg hover:bg-slate-700 flex items-center justify-center text-slate-300 hover:text-white transition duration-150\">\n                        <i class=\"fa-solid fa-xmark text-xl\"><\/i>\n                    <\/button>\n                <\/div>\n            <\/div>\n            <!-- Modal Body \/ Iframe -->\n            <div class=\"flex-grow bg-slate-100 relative\">\n                <iframe id=\"docIframe\" class=\"w-full h-full border-0\" src=\"about:blank\"><\/iframe>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/**\n         * APPS_SCRIPT_URL: \u0e43\u0e2a\u0e48 URL \u0e02\u0e2d\u0e07 Google Apps Script \u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23 Deploy Web App\n         *\/\n        const APPS_SCRIPT_URL = \"https:\/\/script.google.com\/macros\/s\/AKfycbyyP5RJJThlyYUaitb0eLCVCIbSMaDR-ze-9D68Lu-Iz_LkG9GJZGvfJL0U5v09_Co\/exec\";\n\n        \/\/ Set current year in footer\n        document.getElementById('currentYear').textContent = new Date().getFullYear() + 543;\n\n        \/\/ Default layout preview (matches user's screenshot format)\n        const DEFAULT_DATA = [\n            {\n                year: \"2569\",\n                months: [\n                    { name: '\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 2568', link: '#' },\n                    { name: '\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 2569', link: '#' },\n                    { name: '\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c 2569', link: '#' },\n                    { name: '\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 2569', link: '#' },\n                    { name: '\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569', link: '#' },\n                    { name: '\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 2569', link: '#' },\n                    { name: '\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 2569', link: '#' },\n                    { name: '\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 2569', link: '#' },\n                    { name: '\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2569', link: '#' }\n                ],\n                annualReport: '#'\n            },\n            {\n                year: \"2568\",\n                months: [\n                    { name: '\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 2567', link: '#' },\n                    { name: '\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c 2568', link: '#' },\n                    { name: '\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2568', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 2568', link: '#' },\n                    { name: '\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 2568', link: '#' },\n                    { name: '\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2568', link: '#' }\n                ],\n                annualReport: '#'\n            },\n            {\n                year: \"2567\",\n                months: [\n                    { name: '\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 2566', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19 2566', link: '#' },\n                    { name: '\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21 2566', link: '#' },\n                    { name: '\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c 2567', link: '#' },\n                    { name: '\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2567', link: '#' },\n                    { name: '\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19 2567', link: '#' },\n                    { name: '\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21 2567', link: '#' },\n                    { name: '\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2567', link: '#' }\n                ],\n                annualReport: '#'\n            }\n        ];\n\n        function renderFiscalYears(dataList) {\n            const container = document.getElementById('yearsGrid');\n            container.innerHTML = '';\n\n            if (!dataList || dataList.length === 0) {\n                container.innerHTML = `\n                    <div class=\"col-span-full text-center py-12 text-slate-400\">\n                        <i class=\"fa-regular fa-folder-open text-4xl mb-3 text-slate-300\"><\/i>\n                        <p class=\"text-sm font-medium\">\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07<\/p>\n                    <\/div>\n                `;\n                return;\n            }\n\n            dataList.forEach(item => {\n                const card = document.createElement('div');\n                card.className = 'bg-white rounded-2xl border border-slate-200\/90 card-shadow overflow-hidden flex flex-col';\n\n                \/\/ Blue Gradient Header matching reference screenshot\n                const headerHtml = `\n                    <div class=\"bg-gradient-to-r from-blue-700 via-blue-600 to-indigo-600 py-4 px-6 text-center\">\n                        <h2 class=\"text-xl sm:text-2xl font-bold text-white tracking-wide\">\n                            \u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13 ${item.year}\n                        <\/h2>\n                    <\/div>\n                `;\n\n                \/\/ 2-Column x 6-Row Grid for Months\n                let monthButtonsHtml = '<div class=\"grid grid-cols-2 gap-2.5 sm:gap-3 p-4 sm:p-5 flex-grow bg-white\">';\n                \n                item.months.forEach(m => {\n                    const hasLink = m.link && m.link !== '#' && m.link.trim() !== '';\n                    const linkAttr = hasLink \n                        ? `onclick=\"openDocument('${m.name}', '${m.link}')\"` \n                        : `onclick=\"showInfoNotice('${m.name}')\"`;\n                    \n                    monthButtonsHtml += `\n                        <button ${linkAttr} class=\"month-btn bg-slate-50\/80 hover:bg-slate-100 border border-slate-200 text-slate-700 font-medium py-2.5 px-3 rounded-xl text-xs sm:text-sm text-center flex items-center justify-center\">\n                            <span>${m.name}<\/span>\n                        <\/button>\n                    `;\n                });\n\n                monthButtonsHtml += '<\/div>';\n\n                \/\/ Bottom Highlighted Annual Report Button\n                const annualHasLink = item.annualReport && item.annualReport !== '#' && item.annualReport.trim() !== '';\n                const annualClick = annualHasLink \n                    ? `onclick=\"openDocument('\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35 ${item.year}', '${item.annualReport}')\"` \n                    : `onclick=\"showInfoNotice('\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35 ${item.year}')\"`;\n\n                const bottomButtonHtml = `\n                    <div class=\"p-4 sm:p-5 pt-0 bg-white\">\n                        <button ${annualClick} class=\"annual-btn w-full bg-amber-50\/80 hover:bg-amber-100\/90 border border-dashed border-amber-300 text-amber-800 font-semibold py-3 px-4 rounded-xl text-xs sm:text-sm text-center transition duration-150 flex items-center justify-center space-x-2\">\n                            <span>\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35 ${item.year}<\/span>\n                        <\/button>\n                    <\/div>\n                `;\n\n                card.innerHTML = headerHtml + monthButtonsHtml + bottomButtonHtml;\n                container.appendChild(card);\n            });\n        }\n\n        async function fetchAppsScriptData() {\n            if (!APPS_SCRIPT_URL || APPS_SCRIPT_URL.includes(\"YOUR_SCRIPT_ID_HERE\")) {\n                renderFiscalYears(DEFAULT_DATA);\n                return;\n            }\n\n            const loader = document.getElementById('loadingIndicator');\n            loader.classList.remove('hidden');\n\n            try {\n                const response = await fetch(APPS_SCRIPT_URL);\n                if (!response.ok) throw new Error('Network response was not ok');\n                \n                const rawData = await response.json();\n                \n                if (Array.isArray(rawData) && rawData.length > 0) {\n                    const formattedData = transformVerticalSheetData(rawData);\n                    renderFiscalYears(formattedData);\n                } else {\n                    renderFiscalYears(DEFAULT_DATA);\n                }\n            } catch (error) {\n                console.error(\"Error fetching Apps Script data:\", error);\n                renderFiscalYears(DEFAULT_DATA);\n            } finally {\n                loader.classList.add('hidden');\n            }\n        }\n\n        \/**\n         * \u0e41\u0e1b\u0e25\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e41\u0e1a\u0e1a\u0e15\u0e32\u0e23\u0e32\u0e07\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07\u0e43\u0e19 Google Sheet (\u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49):\n         * \u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c A: \u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13 (\u0e40\u0e0a\u0e48\u0e19 2569)\n         * \u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c B: \u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 (\u0e40\u0e14\u0e37\u0e2d\u0e19 \/ \u0e23\u0e32\u0e22\u0e07\u0e32\u0e19) (\u0e40\u0e0a\u0e48\u0e19 \"\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21 2568\", \"\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35 2569\")\n         * \u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c C: \u0e25\u0e34\u0e07\u0e01\u0e4c Google Drive (PDF)\n         * \u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c D: \u0e2a\u0e16\u0e32\u0e19\u0e30 (\u0e40\u0e0a\u0e48\u0e19 \"\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\")\n         *\/\n        function transformVerticalSheetData(sheetRows) {\n            const yearMap = {};\n\n            sheetRows.forEach(row => {\n                \/\/ \u0e14\u0e36\u0e07\u0e04\u0e48\u0e32\u0e15\u0e32\u0e21\u0e0a\u0e37\u0e48\u0e2d\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c\u0e43\u0e19 Sheet\n                const yearVal = String(row['\u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13'] || row['Year'] || row['year'] || row['col0'] || '').trim();\n                const itemVal = String(row['\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 (\u0e40\u0e14\u0e37\u0e2d\u0e19 \/ \u0e23\u0e32\u0e22\u0e07\u0e32\u0e19)'] || row['\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23'] || row['Item'] || row['item'] || row['col1'] || '').trim();\n                const linkVal = String(row['\u0e25\u0e34\u0e07\u0e01\u0e4c Google Drive (PDF)'] || row['\u0e25\u0e34\u0e07\u0e01\u0e4c'] || row['Link'] || row['link'] || row['col2'] || '').trim();\n\n                \/\/ \u0e2a\u0e01\u0e31\u0e14\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e1b\u0e35 \u0e1e.\u0e28. 4 \u0e2b\u0e25\u0e31\u0e01 (\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e02\u0e49\u0e32\u0e21\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e2b\u0e31\u0e27\u0e02\u0e49\u0e2d \u0e40\u0e0a\u0e48\u0e19 \"\ud83d\ude80 \u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13 2569\")\n                const cleanYear = yearVal.replace(\/[^0-9]\/g, '');\n                if (!cleanYear || cleanYear.length !== 4) return;\n\n                if (!yearMap[cleanYear]) {\n                    yearMap[cleanYear] = {\n                        year: cleanYear,\n                        months: [],\n                        annualReport: ''\n                    };\n                }\n\n                \/\/ \u0e41\u0e22\u0e01\u0e01\u0e23\u0e13\u0e35\u0e40\u0e1b\u0e47\u0e19 \"\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35\" \u0e2b\u0e23\u0e37\u0e2d \"\u0e40\u0e14\u0e37\u0e2d\u0e19\"\n                if (itemVal.includes('\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35') || itemVal.includes('\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35') || itemVal.includes('\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35')) {\n                    yearMap[cleanYear].annualReport = linkVal;\n                } else if (itemVal !== '') {\n                    yearMap[cleanYear].months.push({\n                        name: itemVal,\n                        link: linkVal\n                    });\n                }\n            });\n\n            \/\/ \u0e40\u0e23\u0e35\u0e22\u0e07\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e1b\u0e35\u0e08\u0e32\u0e01\u0e21\u0e32\u0e01\u0e44\u0e1b\u0e19\u0e49\u0e2d\u0e22 (\u0e1b\u0e35\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e02\u0e36\u0e49\u0e19\u0e01\u0e48\u0e2d\u0e19)\n            const sortedYears = Object.keys(yearMap).sort((a, b) => b - a);\n\n            const thaiMonthsOrder = [\n                '\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21', '\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19', '\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21',\n                '\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21', '\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c', '\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21',\n                '\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19', '\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21', '\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19',\n                '\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21', '\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21', '\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19'\n            ];\n\n            return sortedYears.map(yKey => {\n                const yearGroup = yearMap[yKey];\n                const prevYearNum = parseInt(yKey) - 1;\n\n                \/\/ \u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e43\u0e2b\u0e49\u0e04\u0e23\u0e1a 12 \u0e40\u0e14\u0e37\u0e2d\u0e19\u0e15\u0e32\u0e21\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13\n                const structuredMonths = thaiMonthsOrder.map((mName, idx) => {\n                    const defaultYear = idx < 3 ? prevYearNum : yKey;\n                    const defaultName = `${mName} ${defaultYear}`;\n\n                    const found = yearGroup.months.find(m => m.name.includes(mName));\n\n                    return {\n                        name: found ? found.name : defaultName,\n                        link: found ? found.link : ''\n                    };\n                });\n\n                return {\n                    year: yKey,\n                    months: structuredMonths,\n                    annualReport: yearGroup.annualReport\n                };\n            });\n        }\n\n        function openDocument(title, url) {\n            const modal = document.getElementById('docModal');\n            const iframe = document.getElementById('docIframe');\n            const modalTitle = document.getElementById('modalTitle');\n            const downloadBtn = document.getElementById('downloadBtn');\n\n            modalTitle.textContent = title;\n            downloadBtn.href = url;\n\n            \/\/ \u0e41\u0e1b\u0e25\u0e07\u0e25\u0e34\u0e07\u0e01\u0e4c Google Drive View \u0e40\u0e1b\u0e47\u0e19 Preview \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19 iframe\n            let embedUrl = url;\n            if (url.includes('drive.google.com\/file\/d\/')) {\n                embedUrl = url.replace(\/\\\/view.*$\/, '\/preview');\n            }\n\n            iframe.src = embedUrl;\n            modal.classList.remove('hidden');\n            document.body.style.overflow = 'hidden';\n        }\n\n        function closeModal() {\n            const modal = document.getElementById('docModal');\n            const iframe = document.getElementById('docIframe');\n            iframe.src = 'about:blank';\n            modal.classList.add('hidden');\n            document.body.style.overflow = 'auto';\n        }\n\n        function showInfoNotice(title) {\n            const alertBox = document.createElement('div');\n            alertBox.className = 'fixed bottom-6 right-6 bg-slate-800 text-white px-5 py-3 rounded-xl shadow-2xl z-50 text-xs sm:text-sm flex items-center space-x-3 border border-slate-700 animate-bounce';\n            alertBox.innerHTML = `\n                <i class=\"fa-solid fa-circle-info text-amber-400 text-lg\"><\/i>\n                <span>\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e44\u0e1f\u0e25\u0e4c\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a <strong>${title}<\/strong><\/span>\n            `;\n            document.body.appendChild(alertBox);\n\n            setTimeout(() => {\n                alertBox.classList.add('opacity-0', 'transition', 'duration-300');\n                setTimeout(() => alertBox.remove(), 300);\n            }, 3000);\n        }\n\n        \/\/ Initialize on page load\n        window.addEventListener('DOMContentLoaded', () => {\n            fetchAppsScriptData();\n        });\n    <\/script>\n\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><p>Views: 17<\/p>","protected":false},"excerpt":{"rendered":"<p>\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07 \u0e2a\u0e2d\u0e01.5 \u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07 \u0e2a\u0e2d\u0e01.5 \u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e07\u0e1a\u0e17\u0e14\u0e25\u0e2d\u0e07&#8230; \u0e23 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-18080","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/pages\/18080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/comments?post=18080"}],"version-history":[{"count":67,"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/pages\/18080\/revisions"}],"predecessor-version":[{"id":22717,"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/pages\/18080\/revisions\/22717"}],"wp:attachment":[{"href":"https:\/\/www.ivecr5.ac.th\/web2020\/wp-json\/wp\/v2\/media?parent=18080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}