1. สร้างตารางข้อมูลผู้ใช้
2. สร้างไฟล์ code.gs
function doGet() { return HtmlService.createTemplateFromFile('index').evaluate() .setTitle("Project Kru Chian") .setFaviconUrl("https://semicon.github.io/img/logo2small.png") .addMetaTag('viewport', 'width=device-width , initial-scale=1') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) .setSandboxMode(HtmlService.SandboxMode.IFRAME) } /********* login ********* */ function checkLoginCredentials(username, password) { const sheet = SpreadsheetApp.openById("YOUR_SHEET_ID").getSheetByName("Responses"); //ชีต แบบสอบถาม
const data = sheet.getDataRange().getDisplayValues(); // ดึงข้อมูลทั้งหมดจากชีต const shared = checkSheetSharing(); for (let i = 1; i < data.length; i++) { // ข้ามแถวแรก (หัวตาราง) const storedUsername = data[i][1]; // สมมติว่าชื่อผู้ใช้เก็บในคอลัมน์ที่ 2 (index 1) const storedPassword = data[i][3]; // สมมติว่าเก็บรหัสผ่านในคอลัมน์ที่ 4 (index 3) Logger.log(storedUsername + "/" + username); Logger.log(storedPassword + "/" + password); if (String(username) === String(storedUsername) && String(password) === String(storedPassword)) { if (!shared) { return { success: false, msg: 'ยังไม่เปิดให้ดาวน์โหลด!' }; } else { return { success: true, link: 'https://docs.google.com/spreadsheets/d/' + fileSharingID + '/edit?usp=sharing' }; // ลิงก์ Google sheets แชร์ไฟล์ } } } return { success: false, msg: 'รหัสไม่ถูกต้อง!' }; // ต้องย้ายมานอกลูป } /******** Sharing ********** */ const fileSharingID = "YOUR_SHEET_ID"; // ใส่ ID ของไฟล์ Google ชีตที่แชร์
// เปิดแชร์ function enableSharingById() { const file = DriveApp.getFileById(fileSharingID); // ตั้งค่าให้ทุกคนที่มีลิงก์สามารถดูได้ file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW); Logger.log("แชร์เอกสารสำเร็จ!"); } //ปิดแชร์ function disableSharingById() { const file = DriveApp.getFileById(fileSharingID); // ปิดการแชร์ให้กลับเป็นส่วนตัว file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE); Logger.log("ปิดการแชร์เอกสารสำเร็จ!"); } /******** เช็คสถานะการแชร์ ******** */ function checkSheetSharing() { var file = DriveApp.getFileById(fileSharingID); var access = file.getSharingAccess(); var isShared = access !== DriveApp.Access.PRIVATE; Logger.log(isShared) Logger.log(isShared ? "This sheet is shared publicly." : "This sheet is private."); return isShared; }
3. สร้างไฟล์ index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <style> body { background: url(https://semicon.github.io/img/web/ghost-rider.jpg) no-repeat center center fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; } .login-container { max-width: 400px; margin: 100px auto; padding: 20px; background: white; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } .img_center { display: block; margin-left: auto; margin-right: auto; } </style> </head> <body> <div class="container"> <div class="login-container"> <img class="img_center mb-3" src="https://semicon.github.io/img/LOGOKRUCHIANgrow.png" alt="GuruChian" width="165"> <form id="loginForm" onsubmit="loginUser(event)"> <div class="mb-3"> <label for="username" class="form-label">Username</label> <input type="text" class="form-control" id="username" required> </div> <div class="mb-3"> <label for="password" class="form-label">Password</label> <input type="password" class="form-control" id="password" required> </div> <button type="submit" class="btn btn-primary w-100">Login</button> </form> <div id="loginMessage" class="mt-3 text-center"></div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> <script> function loginUser(event) { event.preventDefault(); const loginMessage = document.getElementById('loginMessage'); const username = document.getElementById('username').value; const password = document.getElementById('password').value; loginMessage.innerHTML = `<div class="spinner-border text-danger" role="status"> <span class="visually-hidden">Loading...</span> </div>`; google.script.run.withSuccessHandler(handleLoginResponse).checkLoginCredentials(username, password); } function handleLoginResponse(response) { //console.log(response) const loginMessage = document.getElementById('loginMessage'); loginMessage.innerHTML = ''; if (response.success) { loginMessage.innerHTML = `<div class="alert alert-success">Login successful!</div>`; setTimeout(() => { window.location.href = response.link; }, 1500); } else { loginMessage.innerHTML = '<div class="alert alert-danger">'+response.msg+'</div>'; } } </script> </body> </html>
⏰ เพิ่ม Trigger สำหรับตั้งเวลาเปิด/ปิดการแชร์อัตโนมัติ
https://guruchian.blogspot.com/2025/04/appscript.html