Googlesheet Apps script Webapp | Tạo trang trắc nghiệm online như Quiz
Giaoan.link chia sẻ đến các bạn một project về Googlesheet Apps script Webapp | Tạo trang trắc nghiệm online như Quiz. Với project này, bạn có thể xây dựng các câu hỏi trắc nghiệm các câu hỏi. Với giao diện chọn theo trường khá đẹp mắt. Khi hoàn tất, bạn có sự thông báo kết quả bao nhiêu câu đúng. Dưới đây là video hướng dẫn và code của project này.
||Tìm thêm các project khác tại đây
Các project xuất hiện ngẫu nhiên:
- Google sheet Apps script Webapp | Tạo QR Code động – Tự động load mã QR mới khi nội dung mã hóa đổi
- Googlesheet Apps script Webapp | Tạo trang trắc nghiệm online như Quiz
- Google sheet Apps script | Trang trắc nghiệm Quiz – Cập nhật câu hỏi, trả lời, thời gian đếm ngược
- Google sheets | Number to text, Hàm đọc số thành chữ Ứng dụng taoh hóa đơn, phiếu chi.
- Googlesheet Apps script Webapp | Tạo mã QR Code từ nội dung nhập vào – QR Code Generator
- Google sheet apps script | Dropdown đơn giản lấy dữ liệu từ google sheet – Simple dropdown
- Apps script Webapp CSS – HTML – JS | Tạo ứng dụng Ghi chú trên nền tảng webapp – website
- Google sheet Apps script | Hàm setTimeout định thời gian xóa các trường Input khi click Button
- Apps script Webapp | Sử dụng CSS tạo hiệu ứng sóng nước – Trang trí đẹp mắt cho web và blog.
- Google sheet Apps script Tiện ích tạo mã vạch (barcode) trên webapp
Code apps script trên trang “Code.gs”
function doGet() {
return HtmlService.createTemplateFromFile('index')
.evaluate()
.addMetaTag('viewport', 'width=device-width, initial-scale=1')
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename).getContent();
}
Mã apps script trên trang “index.html”
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!= include('css'); ?>
</head>
<body>
<div class="app">
<h1>Trắc Nghiệm Lịch Sử Việt Nam</h1>
<div class="quiz">
<h2 id="question">Question goes here</h2>
<div id="answer-buttons">
<button class="btn"> Answer 1</button>
<button class="btn"> Answer 2</button>
<button class="btn"> Answer 3</button>
</div>
<button id="next-btn">Next</button>
</div>
</div>
<?!= include('Javascript'); ?>
</body>
</html>
Mã apps script trên trang “css.html”
<style>
*{
margin: 0;
padding: 0;
font-family: 'Poppins', sans-serif;
box-sizing: border-box;
}
body{
background: #2fc0fc;
}
.app{
background: #fff;
width: 90%;
max-width: 600px;
margin: 100px auto 0;
border-radius: 15px;
padding: 30px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
.app h1{
font-weight: 25px;
color: red;
text-align: center;
font-weight: bold;
border-bottom: 1px solid blue;
padding-bottom: 30px;
}
.quiz {
padding: 20px 0;
}
.quiz h2{
font-size: 18px;
color: #001e4d;
font-wieght: 600;
}
.btn{
background: #fff;
color: #222;
font-weight: 500;
width: 100%;
border: 1px solid #222;
padding: 10px;
margin: 10px 0;
text-align: left;
border-radius: 5px;
cursor: pointer;
transition: all 0.3s;
}
.btn:hover:not([disabled]){
background: #222;
color: #fff;
}
.btn:disabled{
cursor: no-drop;
}
#next-btn{
background: #001e4d;
color: #fff;
font-weight: 500;
width: 150px;
border: 0;
padding: 10px;
margin: 20px auto 0;
border-radius: 5px;
cursor: pointer;
display: block;
}
.correct{
background: #9aeabc;
}
.incorrect{
background: #ff9393;
}
</style>
Mã apps script trên “Javascript.html”
<script>
const questions=[
{
question: "Nhà nước đầu tiên của nước ta là gì?",
answers:[
{text: "Văn lang", correct: true},
{text: "Âu lạc", correct: false},
{text: "Việt Nam", correct: false},
]
},
{
question: "Vị vua đầu tiên của nước ta là ai?",
answers:[
{text: "An Dương Vương", correct: false},
{text: "Vua Hùng Vương", correct: true},
{text: "Bảo Đại", correct: false},
]
},
{
question: "Thành tựu đặc sắc về phong trào của người dân Âu Lạc là gì?",
answers:[
{text: "Chế tạo loại nỏ bắn một lần được nhiều mũi tên", correct: false},
{text: "Xây dựng thành Cổ Loa", correct: false},
{text: "Cả hai đều đúng", correct: true},
]
},
{
question: 'Câu "Triệu Đà đã hoãn binh, cho con trai làm rể An Dương Vương" gợi cho ta nhớ đến câu chuyện nào?',
answers:[
{text: "Mị Châu- Trọng thủy", correct: true},
{text: "Sơn tinh- Thủy Tinh", correct: false},
{text: "Thạch Sanh", correct: false},
]
},
{
question: "Chiến thắng vang dội nhất của nhân dân ta trước các triều đại phương Bắc là:",
answers:[
{text: "Chiến thắng của Hai Bà Trưng", correct: false},
{text: "Chiến thắng Bạch Đằng", correct: true},
{text: "Chiến thắng Lí Bí", correct: false},
]
}
];
const questionElement = document.getElementById("question");
const answerButtons = document.getElementById("answer-buttons");
const nextButton = document.getElementById("next-btn");
let currentQuestionIndex = 0;
let score = 0;
function startQuiz(){
currentQuestionIndex = 0;
score = 0;
nextButton.innerHTML = "Câu tiếp theo";
showQuestion();
}
function showQuestion(){
resetState();
let currentQuestion = questions[currentQuestionIndex];
let questionNo = currentQuestionIndex + 1;
questionElement.innerHTML = questionNo + ". " + currentQuestion.question;
currentQuestion.answers.forEach(answer => {
const button = document.createElement("button");
button.innerHTML = answer.text;
button.classList.add("btn");
answerButtons.appendChild(button);
if(answer.correct){
button.dataset.correct = answer.correct;
}
button.addEventListener("click", selectAnswer);
});
}
function resetState(){
nextButton.style.display = "none";
while(answerButtons.firstChild){
answerButtons.removeChild(answerButtons.firstChild);
}
}
function selectAnswer(e){
const selectedBtn = e.target;
const isCorrect = selectedBtn.dataset.correct === "true";
if(isCorrect){
selectedBtn.classList.add("correct");
score++;
}else{
selectedBtn.classList.add("incorrect");
}
Array.from(answerButtons.children).forEach(button => {
if(button.dataset.correct === "true"){
button.classList.add("correct");
}
button.disabled = true;
});
nextButton.style.display = "block";
}
function showScore(){
resetState();
questionElement.innerHTML = `Bạn trả lời đúng ${score} / ${questions.length} câu hỏi!`;
nextButton.innerHTML = "Làm lại";
nextButton.style.display = "block"
}
function handleNextButton(){
currentQuestionIndex++;
if(currentQuestionIndex < questions.length){
showQuestion();
}else{
showScore();
}
}
nextButton.addEventListener("click", ()=> {
if(currentQuestionIndex < questions.length){
handleNextButton();
}else{
startQuiz();
}
});
startQuiz();
</script>