botchat.gs
/** ฟังก์ชั่นสำหรับรับข้อมูลแผนกจาก Google Sheets */
function getDepartments() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Department');
const data = sheet.getDataRange().getValues();
const departments = [];
for (let i = 1; i < data.length; i++) {
departments.push({
department: data[i][0],
phone: data[i][1]
});
}
return departments;
}
/** ฟังก์ชั่นสำหรับรับข้อมูลคำถามของผู้ใช้จาก Google Sheets */
function getBotResponse(department, userMessage) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BotData');
const data = sheet.getDataRange().getValues();
const lowerCaseUserMessage = userMessage.toLowerCase();
let exactAnswer = null;
const relatedQuestions = [];
for (let i = 1; i < data.length; i++) {
if (data[i][0] === department) {
const question = data[i][1].toLowerCase();
if (question === lowerCaseUserMessage) {
exactAnswer = data[i][2];
break;
} else if (question.includes(lowerCaseUserMessage)) {
relatedQuestions.push(data[i][1]);
}
}
}
return {
exactAnswer: exactAnswer,
relatedQuestions: relatedQuestions
};
}
/** ฟังก์ชั่นสำหรับรับข้อมูลคำถามจาก Google Sheets จากการเลือกคำถามของผู้ใช้ */
function getResponseForSelectedQuestion(department, selectedQuestion) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BotData');
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
if (data[i][0] === department && data[i][1] === selectedQuestion) {
return data[i][2];
}
}
return "ฉันไม่พบข้อมูลใดๆ ที่เกี่ยวข้องกับคำถามของคุณ";
}
index.html
<!DOCTYPE html>
<html>
<head>
<?!= include("botchat_css") ?>
</head>
<body>
<div class="chat-popup" id="chatPopup" style="display:none;">
<div class="chat-popup-header">
<span class="header-title">
<img src="https://cdn-icons-png.flaticon.com/128/17115/17115944.png" alt="icon" class="icon">
ChatBot
</span>
<span class="btn-close btn-close-white" onclick="closeChat()"></span>
</div>
<div class="chat-popup-content" id="content">
<div id="chatContent">
<p class="chat-welcom bot"><span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot">สวัสดีค่ะ <br>กรุณาเลือกหน่วยงานที่ต้องการติดต่อ</span>
</p>
<div id="departmentButtons"></div>
</div>
<div id="chatRoom" style="display:none;">
<div id="chatMessages"></div>
<div class="sublist" id="questionList" style="display:none;">
<div class="chat-welcom bot">
<span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot">
<ol id="questions"></ol>
เลือกรายการที่ให้มา หรือ ป้อนคำถามใหม่
</span>
</div>
</div>
</div>
</div>
<div class="chat-popup-foot" id="footer" style="display:none;">
<div class="input-group p-2">
<input type="text" class="form-control" id="userMessage" placeholder="Type a message..." />
<button class="input-group-text btn btn-primary" onclick="searchQuestions()">
<i class="fa-regular fa-paper-plane"></i>
</button>
</div>
</div>
</div>
<div id="chatbutton">
<button class="btn-chat" onclick="openChat()">
<img src="https://cdn-icons-png.flaticon.com/128/17115/17115944.png" alt="icon" style="width:45px; height: 45px;">
</button>
</div>
<?!= include("botchat_js") ?>
</body>
</html>
botchat_css.html
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" rel="stylesheet">
<style>
.chat-popup {
position: fixed;
bottom: 50px;
right: 15px;
border: 3px solid #f1f1f1;
z-index: 9;
max-width: 350px;
height: 450px; /* ความสูงของ chat popup */
background-color: white;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 10px;
display: flex;
flex-direction: column; /* จัดวางคอลัมน์ head, body, foot */
}
.chat-popup-header {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #007bff;
color: white;
font-size: 1.5rem;
padding: 5px 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
.header-title {
flex-grow: 1;
}
.icon {
width: 35px;
height: 35px;
margin-right: 5px;
margin-lef: 5px;
vertical-align: middle;
}
.chat-popup-content {
padding: 10px;
height: 350px;
overflow-y: auto;
}
.chat-popup-content {
padding: 10px;
height: 350px;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.chat-message{
margin-bottom: 10px;
display: inline-block;
max-width: 95%;
word-wrap: break-word;
}
.chat-welcom{
margin-bottom: 10px;
padding: 8px 12px;
border-radius: 10px;
display: inline-block;
word-wrap: break-word;
width: 100%;
}
.chat-welcom.bot {
display: flex;
flex-direction: row;
align-items: flex-start;
width: 100%;
float: left;
}
.chat-message span{
display: flex-start;
}
.bot i {
font-size: 1.25rem;
color: #ef03de;
}
.user i {
font-size: 1.5rem;
color: #007bff;
}
.sublist{
display: flex;
float: left;
}
.chat-message.bot {
display: flex;
float: left;
}
.chat-message.user {
display: flex;
float: right;
}
.msg_bot{
background-color: #f1f1f1;
padding: 8px 12px;
border-radius: 10px;
word-wrap: break-word;
}
.msg_user{
background-color: #d1ecf1;
padding: 8px 12px;
border-radius: 10px;
word-wrap: break-word;
}
.chat-popup-foot {
background-color: #f8f9fa;
border-top: 1px solid #dee2e6;
}
.btn-close {
cursor: pointer;
font-size: 1.25rem;
}
.btn-chat {
position: fixed;
bottom: 20px;
right: 20px;
z-index: 9999;
color: #fff;
padding: 10px;
border-radius: 50%;
border: none;
}
</style>
botchat_js.html
<script>
let currentDepartment = '';
let currentPhone = '';
let relatedQuestions = [];
/** ฟังก์ชั่นเปิดป๊อบอัพห้องสนทนา */
function openChat() {
document.getElementById('chatbutton').style.display = 'none';
document.getElementById('chatContent').style.display = 'block';
document.getElementById('chatPopup').style.display = 'block';
google.script.run.withSuccessHandler(displayDepartments).getDepartments();
}
/** ฟังก์ชั่นปิดป๊อบอัพห้องสนทนา */
function closeChat() {
document.getElementById('chatbutton').style.display = 'block';
document.getElementById('chatPopup').style.display = 'none';
document.getElementById('chatMessages').innerHTML = '';
document.getElementById('questionList').style.display = 'none';
document.getElementById('footer').style.display = 'none';
}
/** ฟังก์ชั่นแสดงปุ่มเข้าห้องสนทนาของสำนักงาน */
function displayDepartments(departments) {
const container = document.getElementById('departmentButtons');
container.innerHTML = '';
departments.forEach(dept => {
const button = document.createElement('button');
button.className = 'btn btn-primary btn-block mb-2 w-100';
button.textContent = dept.department;
button.onclick = function() {
enterChatRoom({department:dept.department,phone:dept.phone});
};
container.appendChild(button);
});
}
/** ฟังก์ชั่นเข้าห้องสนทนาตามที่เลือก */
function enterChatRoom(department) {
currentDepartment = department.department;
currentPhone = department.phone;
document.getElementById('chatContent').style.display = 'none';
document.getElementById('chatRoom').style.display = 'block';
document.getElementById('footer').style.display = 'block';
document.getElementById('chatMessages').innerHTML += `
<p class="chat-welcom bot"><span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot">${department.department} ยินดีต้อนรับค่ะ</span></p>`;
}
/** ฟังก์ชั่นส่งคำถามและรับการตอบกลับจาก Apps Script */
function searchQuestions() {
const userMessage = document.getElementById('userMessage').value;
if (!userMessage) return;
const messagesContainer = document.getElementById('chatMessages');
const userMsgElement = document.createElement('p');
userMsgElement.className = 'chat-message user';
userMsgElement.innerHTML = `
<span><i class="fa-regular fa-circle-user"></i></span> 
<span class="msg_user"> ${userMessage}</span>`;
messagesContainer.innerHTML += userMsgElement.outerHTML;
scrollToBottom();
// รับการตอบกลับจาก Apps Script
google.script.run.withSuccessHandler(function(response) {
const questionList = document.getElementById('questionList');
const questionsContainer = document.getElementById('questions');
questionsContainer.innerHTML = '';
if (response.exactAnswer) { // แสดงคำตอบที่ตรงกับคำถาม
const botMsgElement = document.createElement('p');
botMsgElement.className = 'chat-message bot';
botMsgElement.innerHTML = `<span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot"> ${response.exactAnswer}</span>`;
messagesContainer.innerHTML += botMsgElement.outerHTML;
questionList.style.display = 'none';
} else if (response.relatedQuestions.length > 0) { // ไม่พบคำถามแต่มีคำถามที่เกี่ยวข้องบางส่วน
const botMsgElement = document.createElement('p');
botMsgElement.className = 'chat-message bot';
botMsgElement.innerHTML = `<span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot"> ขออภัยค่ะ<br>ฉันหาคำตอบที่แน่ชัดไม่ได้ แต่มีข้อมูลบางส่วนที่เกี่ยวข้องกับคำถามของท่านดังนี้</span>`;
messagesContainer.innerHTML += botMsgElement.outerHTML;
// แสดงรายการคำถามที่เกี่ยวข้อง
response.relatedQuestions.forEach(function(question) {
const questionItem = document.createElement('li');
questionItem.textContent = question;
questionItem.style.cursor = 'pointer';
questionItem.onclick = function() {
selectQuestion(question);
};
questionsContainer.appendChild(questionItem);
});
questionList.style.display = 'block';
} else { // ไม่พบคำถามและไม่มีคำถามที่เกี่ยวข้อง
const botMsgElement = document.createElement('p');
botMsgElement.className = 'chat-message bot';
botMsgElement.innerHTML = `<span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot"> ขออภัยค่ะ <br>ฉันไม่พบข้อมูลใดๆ ที่เกี่ยวข้องกับคำถามของคุณ
โปรดป้อนคำถามใหม่อีกครั้ง หรือติดต่อเจ้าหน้าที่ <br> โทร.  ${currentPhone}</span>`;
messagesContainer.innerHTML += botMsgElement.outerHTML;
questionList.style.display = 'none';
}
scrollToBottom();
}).getBotResponse(currentDepartment, userMessage);
document.getElementById('userMessage').value = '';
}
/** ฟังก์ชั่นเลื่อนสกอร์บาร์ไว้ล่างสุด */
function scrollToBottom() {
const chatMessages = document.getElementById('content');
chatMessages.scrollTop = chatMessages.scrollHeight-20;
}
/** ฟังก์ชั่นส่งคำถามและรับการตอบกลับจาก Apps Script เมื่อเลือกคำถามในรายการ */
function selectQuestion(selectedQuestion) {
// แสดงคำถามที่เลือกเป็นข้อความของผู้ใช้
const messagesContainer = document.getElementById('chatMessages');
const userMsgElement = document.createElement('p');
userMsgElement.className = 'chat-message user';
userMsgElement.innerHTML = `<span><i class="fa-regular fa-circle-user"></i></span> 
<span class="msg_user"> ${selectedQuestion}</span>`;
messagesContainer.innerHTML += userMsgElement.outerHTML;
document.getElementById('questionList').style.display = 'none';
// รับการตอบกลับจาก Apps Script
google.script.run.withSuccessHandler(function(response) {
const botMsgElement = document.createElement('p');
botMsgElement.className = 'chat-message bot';
botMsgElement.innerHTML = `<span><i class="fa-solid fa-robot"></i></span> 
<span class="msg_bot"> ${response}</span>`;
messagesContainer.innerHTML += botMsgElement.outerHTML;
scrollToBottom();
}).getResponseForSelectedQuestion(currentDepartment, selectedQuestion);
}
</script>