📢 Chào mừng các bạn đến với Rcom Dăm Yi blog - Kho tài liệu và giải pháp công nghệ bổ ích! Hệ thống liên tục cập nhật dữ liệu học tập mới.
Bài 16. Tích hợp HTML, Google Sheet & Apps Script (Phần 5)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng iTeach.

Bài 16. Bảng Dữ liệu (Phần 5): Tìm kiếm & Tương tác

1. Kiến thức bài học

Sau khi đã đổ được dữ liệu từ Apps Script ra Bảng HTML (Table), hai tính năng được mong chờ nhất trong các hệ thống quản lý trường học là:

  • Thanh tìm kiếm (Client-side Search): Sử dụng sự kiện onkeyup của JavaScript để bắt từng phím người dùng gõ vào ô tìm kiếm. Thuật toán sẽ duyệt qua các thẻ <tr>, so sánh chuỗi và ẩn (display: none) những hàng không khớp.
  • Nút Hành động (Action Buttons): Chèn một thẻ <button> vào một cột (ví dụ cột Cuối cùng) khi vòng lặp tạo bảng. Gắn mã định danh (như Mã học sinh) vào thuộc tính của nút để gọi google.script.run xử lý tác vụ Xóa, Sửa.

2. Bài tập mẫu

Ví dụ 1: Tìm kiếm trực tiếp trên bảng

Đề bài: Tạo một ô nhập liệu (Input). Bất cứ khi nào giáo viên gõ tên học sinh, bảng danh sách nghiên cứu KHKT bên dưới sẽ tự động lọc ngay lập tức mà không cần tải lại trang.

Code HTML / JavaScript (Thêm vào trên thẻ table):

<input type="text" id="timKiem" onkeyup="locDuLieu()" placeholder="🔍 Nhập tên học sinh để tìm kiếm...">

<script>
  function locDuLieu() {
    // Lấy giá trị đang gõ và chuyển thành chữ in hoa để so sánh
    let input = document.getElementById("timKiem");
    let filter = input.value.toUpperCase();
    
    // Lấy bảng và danh sách các thẻ <tr>
    let table = document.getElementById("bangDanhSach");
    let tr = table.getElementsByTagName("tr");

    // Duyệt qua các hàng (Bỏ qua hàng 0 là tiêu đề)
    for (let i = 1; i < tr.length; i++) {
      let td = tr[i].getElementsByTagName("td")[0]; // Lấy cột Tên (Cột đầu tiên)
      if (td) {
        let txtValue = td.textContent || td.innerText;
        // Nếu tên chứa từ khóa tìm kiếm -> Hiển thị, ngược lại -> Ẩn đi
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
          tr[i].style.display = "";
        } else {
          tr[i].style.display = "none";
        }
      }       
    }
  }
</script>

Ví dụ 2: Thêm nút "Xóa" gọi về Apps Script

Đề bài: Khi vòng lặp JS đắp dữ liệu vào bảng, hãy thêm một cột "Thao tác" chứa nút Xóa. Khi bấm nút, gửi Mã học sinh về Server để xóa dòng trong Google Sheets.

Khúc Code JS lúc tạo Bảng (Client):

  dataArray.forEach(row => {
    html += `
      <tr id="hang-${row[0]}">
        <td>${row[0]}</td>  <!-- Mã HS -->
        <td>${row[1]}</td>  <!-- Tên -->
        <td>
          <button onclick="xoaHocSinh('${row[0]}')">Xóa</button>
        </td>
      </tr>
    `;
  });

  function xoaHocSinh(maHS) {
    if(confirm("Bạn có chắc muốn xóa " + maHS + " không?")) {
      google.script.run.xoaTrenSheet(maHS); // Gọi Apps Script
      document.getElementById("hang-" + maHS).style.display = "none"; // Ẩn trên giao diện tạm thời
    }
  }

Mô phỏng Giao diện: Tìm kiếm và Tương tác Bảng

Danh sách học sinh tham gia dự án KHKT (THPT Phan Chu Trinh):

Mã HS Họ và Tên Dự án KHKT Thao tác
HS01 Kpă Su Điểm danh QR
HS02 Nay Phoan Điểm danh QR
HS03 Trần Văn Bình Phần mềm thi trắc nghiệm
Không tìm thấy học sinh nào!

3. Bài tập tự luyện

Bài tập: Xây dựng hệ thống quản lý mượn trả thiết bị

Đề bài: Là người quản lý thiết bị trường học, hãy tạo một Web App hiển thị danh sách thiết bị đang được mượn.

  1. Thêm thanh tìm kiếm (như Ví dụ 1) để tìm nhanh theo "Tên giáo viên mượn".
  2. Tạo một nút "Đã Trả" thay vì nút "Xóa" cho mỗi hàng.
  3. Khi click nút "Đã Trả", dùng google.script.run gửi Mã thiết bị về Code.gs để hàm Code.gs cập nhật trạng thái trong Sheet thành "Hoàn thành", đồng thời cập nhật hàng đó trên giao diện sang màu xám.
Bài 15. Tích hợp HTML, Google Sheet & Apps Script (Phần 4)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng iTeach.

Bài 15. Hiển thị Bảng dữ liệu (Dynamic Table) lên Web App

1. Kiến thức bài học

Để hiển thị một danh sách học sinh (hoặc bảng điểm) từ Google Sheets lên Web App, chúng ta cần thực hiện 3 bước:

  1. Server (Code.gs): Dùng getValues() đọc toàn bộ dữ liệu thành mảng 2 chiều và return mảng đó.
  2. Client (HTML/JS): Dùng google.script.run để gọi hàm trên Server và nhận mảng dữ liệu trả về.
  3. Render (Tạo giao diện): Dùng vòng lặp for hoặc forEach trong JavaScript duyệt qua mảng, tạo ra các chuỗi thẻ <tr> (hàng) và <td> (cột), sau đó nhúng vào thẻ <tbody> của bảng HTML bằng lệnh innerHTML.

2. Bài tập mẫu

Ví dụ 1: Đổ dữ liệu Bảng điểm cơ bản

Đề bài: Đọc dữ liệu điểm Toán và Tin học của lớp từ Sheets và hiển thị thành một bảng trên trang Web.

Ý tưởng: Server trả về mảng. HTML chuẩn bị sẵn thẻ <table> với ID là bangDiem. JS sẽ nối chuỗi HTML đắp vào bảng.

Code Apps Script (Code.gs):

function layDuLieuDiem() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DiemThi");
  // Bỏ qua hàng 1 (tiêu đề), lấy từ hàng 2 đến hết
  let data = sheet.getRange(2, 1, sheet.getLastRow()-1, 3).getValues();
  return data; // Trả mảng 2 chiều về cho Client
}

Code HTML (Index.html):

<table id="bangDiem" border="1"></table>

<script>
  // Gọi API ngay khi web vừa tải xong
  google.script.run
    .withSuccessHandler(veBang)
    .layDuLieuDiem();

  function veBang(dataArray) {
    let html = "<tr><th>Họ tên</th><th>Điểm Toán</th><th>Điểm Tin</th></tr>";
    
    // Duyệt qua từng hàng dữ liệu
    for (let i = 0; i < dataArray.length; i++) {
      html += "<tr>";
      html += "<td>" + dataArray[i][0] + "</td>";
      html += "<td>" + dataArray[i][1] + "</td>";
      html += "<td>" + dataArray[i][2] + "</td>";
      html += "</tr>";
    }
    
    document.getElementById("bangDiem").innerHTML = html;
  }
</script>

Mô phỏng (Ví dụ 1): Render Bảng Điểm

Ví dụ 2: Ứng dụng vòng lặp forEach kết hợp Template String (ES6)

Đề bài: Cùng bài toán trên, nhưng ta sẽ viết code JavaScript ngắn gọn hơn, dễ đọc hơn bằng cách sử dụng vòng lặp forEach và dấu backtick ( ` ) của ES6.

Code JavaScript (Trong thẻ script HTML):

function veBangHienDai(dataArray) {
  let tbody = document.getElementById("noiDungBang");
  let html = "";

  // Sử dụng forEach và Template String (Dấu ` )
  dataArray.forEach(row => {
    html += `
      <tr>
        <td>${row[0]}</td>
        <td>${row[1]}</td>
        <td>${row[2]}</td>
      </tr>
    `;
  });

  tbody.innerHTML = html;
}

Giải thích: Phương pháp sử dụng ${biến} giúp bạn không cần phải viết nối chuỗi bằng hàng loạt dấu cộng + gây rối mắt. Điều này cực kỳ hữu ích khi bảng HTML của bạn có chứa các nút bấm (Button) hoặc hình ảnh phức tạp bên trong ô.

3. Bài tập tự luyện

Bài tập: Hiển thị nhật ký điểm danh QR Code

Đề bài: Bạn đang phát triển hệ thống Điểm danh qua mã QR cho trường THPT Phan Chu Trinh. Dữ liệu từ Sheet lưu theo cấu trúc: Cột A (Thời gian quét), Cột B (Mã học sinh), Cột C (Họ tên). Hãy viết một trang Web App đọc mảng này và đổ lên một Bảng HTML.

Yêu cầu bổ sung:

  • Nếu thời gian quét lớn hơn 07:15, hãy dùng thẻ <span style="color:red"> bọc tên học sinh lại để đánh dấu "Đi trễ". (Gợi ý: Dùng lệnh if bên trong vòng lặp tạo HTML).
Bài 15. Tích hợp HTML, Google Sheet & Apps Script (Giao tiếp hai chiều)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng iTeach.

Bài 15. Giao tiếp Web & Apps Script với google.script.run

1. Kiến thức bài học: Cơ chế Client - Server

Trong một ứng dụng Web App tạo bằng Apps Script, mã HTML/JS chạy trên trình duyệt của người dùng (Client), trong khi dữ liệu Google Sheets nằm trên máy chủ (Server). Để chúng nói chuyện được với nhau, Google cung cấp API vô cùng mạnh mẽ: google.script.run.

  • Gửi dữ liệu lên Server: google.script.run.TenHam_Trong_CodeGS(duLieu).
  • Nhận kết quả trả về: Sử dụng .withSuccessHandler(hamXuLy) để đón dữ liệu từ Server gửi ngược lại Client một cách bất đồng bộ (không cần tải lại trang).

2. Bài tập mẫu

Ví dụ 1: Form Gửi Dữ liệu (Submit)

Đề bài: Tạo Form HTML cho phép học sinh nhập tên và tên dự án KHKT. Khi bấm "Gửi", dữ liệu được truyền sang hàm luuDuAn() trong Code.gs để lưu vào Sheet, sau đó hiển thị thông báo thành công.

Code Apps Script (Code.gs):

function luuDuAn(tenHS, tenDuAn) {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // Ghi dữ liệu vào dòng cuối cùng
  sheet.appendRow([new Date(), tenHS, tenDuAn]);
  
  // Trả về kết quả cho HTML
  return "Đã lưu thành công dự án của " + tenHS;
}

Code HTML (Index.html):

<input type="text" id="hsName" placeholder="Tên học sinh (VD: Nay Phoan)">
<input type="text" id="prjName" placeholder="Tên dự án">
<button onclick="guiForm()">Gửi Đăng Ký</button>

<script>
  function guiForm() {
    let hs = document.getElementById("hsName").value;
    let prj = document.getElementById("prjName").value;
    
    // Gọi hàm Apps Script và đợi kết quả trả về bằng withSuccessHandler
    google.script.run
      .withSuccessHandler(function(ketQua) {
         alert(ketQua); // Hiển thị chữ "Đã lưu thành công..."
      })
      .luuDuAn(hs, prj);
  }
</script>

Mô phỏng: Form Gửi Dữ Liệu


Ví dụ 2: Tra cứu dữ liệu từ Sheet (Fetch)

Đề bài: Xây dựng công cụ tra cứu điểm. Nhập mã học sinh trên web, Client sẽ yêu cầu Server tìm trong Sheet. Server tìm xong trả về số điểm để Client hiển thị lên màn hình.

Code Apps Script (Code.gs):

function timKiemDiem(maHS) {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let data = sheet.getDataRange().getValues();
  
  // Tìm kiếm trong mảng 2 chiều
  for (let i = 0; i < data.length; i++) {
    if (data[i][0] == maHS) {
      return data[i][1]; // Trả về điểm ở cột B
    }
  }
  return "Không tìm thấy học sinh!";
}

Code HTML (Index.html):

<script>
  function traCuu() {
    let ma = document.getElementById("maHocSinh").value;
    
    google.script.run
      .withSuccessHandler(function(diem) {
         document.getElementById("ketQuaDiem").innerHTML = "Điểm của bạn là: " + diem;
      })
      .timKiemDiem(ma);
  }
</script>

Mô phỏng: Tra cứu điểm trực tuyến

(Mã hợp lệ: HS01, HS02)


3. Bài tập tự luyện

Bài tập: Xử lý lỗi (Error Handling)

Đề bài: Bên cạnh .withSuccessHandler(), hệ thống còn hỗ trợ .withFailureHandler() để bắt các lỗi phát sinh (ví dụ: đứt mạng, lỗi code trên server). Hãy viết lại đoạn mã ở Ví dụ 1, thêm cơ chế thông báo lỗi cho người dùng nếu quá trình lưu dự án thất bại.

Gợi ý:

google.script.run
  .withSuccessHandler(thanhCong)
  .withFailureHandler(function(loi) { alert("Có lỗi xảy ra: " + loi.message); })
  .luuDuAn(hs, prj);
            
Bài 13. Tích hợp HTML, Google Sheet & Apps Script (Phần 1)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng.

Bài 13. Tích hợp HTML & Apps Script: HTML Động (Phần 1)

1. Kiến thức bài học: HtmlTemplate & Scriptlets

Ở các bài trước, chúng ta dùng HtmlService.createHtmlOutputFromFile() để hiển thị file HTML tĩnh (dữ liệu cố định). Để truyền dữ liệu từ biến của Apps Script vào HTML trước khi hiển thị, ta sử dụng HtmlTemplate.

Cú pháp cốt lõi:

  • HtmlService.createTemplateFromFile('TenFile'): Tạo một bản mẫu HTML.
  • Scriptlet In dữ liệu <?= biến ?>: Đoạn mã được nhúng thẳng vào file HTML. Khi web tải, nó sẽ được thay thế bằng giá trị thực của biến từ Apps Script.
  • template.evaluate(): Lệnh dịch các thẻ <?= ?> thành HTML thật để hiển thị cho người dùng.

2. Bài tập mẫu

Ví dụ 1: Truyền biến thời gian từ Apps Script sang Web App

Đề bài: Tạo một trang Web App hiển thị lời chào và thời gian hiện tại được tạo ra từ máy chủ Google (Apps Script).

Code Apps Script (Code.gs):

function doGet() {
  let template = HtmlService.createTemplateFromFile('Index');
  
  // Khai báo biến trực tiếp vào đối tượng template
  template.tenTruong = "THPT Phan Chu Trinh";
  template.thoiGian = new Date().toLocaleTimeString();
  
  // Dịch template và trả về cho trình duyệt
  return template.evaluate();
}

Code HTML (Index.html):

<h1>Chào mừng đến với <?= tenTruong ?></h1>
<p>Trang web được tải lúc: <?= thoiGian ?></p>

Mô phỏng: Render HTML Template

Quá trình evaluate() sẽ thay thế các thẻ Scriptlet thành dữ liệu thực tế.

Ví dụ 2: Lấy dữ liệu ô từ Sheets in lên HTML

Đề bài: File Google Sheets của bạn đang có số liệu "Sĩ số lớp" ở ô B2. Hãy viết Web App lấy con số này và in to lên giữa màn hình trang web.

Code Apps Script (Code.gs):

function doGet() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let siSo = sheet.getRange("B2").getValue();
  
  let template = HtmlService.createTemplateFromFile('Dashboard');
  template.soLuongHS = siSo; // Truyền sĩ số vào template
  
  return template.evaluate();
}

Code HTML (Dashboard.html):

<div class="card">
  <h3>Sĩ số lớp 12A1</h3>
  <h1 style="color: red"><?= soLuongHS ?> Học sinh</h1>
</div>

Mô phỏng luồng dữ liệu: Sheet ➔ Apps Script ➔ Web HTML

A B
2 Sĩ số lớp 12A1:

BÁO CÁO SĨ SỐ LỚP 12A1

...

Cập nhật trực tiếp từ Google Sheets

3. Bài tập tự luyện

Bài tập: Tạo thông báo cá nhân hóa

Đề bài: Trong Sheet, ô A1 chứa "Tiêu đề cuộc thi" (VD: Hội thi Tin học trẻ), ô A2 chứa "Ngày tổ chức" (VD: 20/11/2026). Hãy viết một ứng dụng Web (gồm Code.gs và Index.html) sử dụng 2 biến này truyền qua Template để hiển thị lên một thẻ `div` trong HTML.

Gợi ý:

  1. Code.gs: Đọc A1 và A2, gán vào template.tieuDetemplate.ngayToChuc.
  2. Index.html: Dùng <?= tieuDe ?> nằm trong thẻ <h1>, và <?= ngayToChuc ?> nằm trong thẻ <p>.
Bài 12. Google Sheet & Apps Script Nâng Cao (Phần 12)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng.

Bài 12. Quản lý Drive & Xuất PDF Tự Động

1. Kiến thức bài học: DriveApp & Blob

Để quản lý tệp tin và thư mục ngoài bảng tính hiện tại, Apps Script cung cấp lớp DriveApp. Bạn có thể dùng nó để tạo, di chuyển, xóa hoặc tìm kiếm các tệp trong Google Drive của mình.

  • DriveApp.getFolderById("ID_ThuMuc"): Truy xuất một thư mục cụ thể qua ID của nó.
  • folder.createFile(name, content): Tạo một tệp mới bên trong thư mục.
  • getAs('application/pdf'): Phương thức này dùng để chuyển đổi định dạng của một tệp (Blob) sang file PDF — tính năng cực kỳ mạnh để xuất báo cáo hoặc bảng điểm.

2. Bài tập mẫu

Ví dụ 1: Tạo thư mục và lưu file nhật ký

Đề bài: Viết hàm tự động tạo một thư mục tên "HoSo_KHKT_2026", sau đó tạo một file văn bản nhatky.txt bên trong thư mục này để lưu trữ tiến độ dự án.

Code Apps Script:

function taoThuMucVaFile() {
  // 1. Tạo thư mục mới trên ổ đĩa gốc
  let thuMucMoi = DriveApp.createFolder("HoSo_KHKT_2026");
  
  // 2. Nội dung tệp nhật ký
  let noiDung = "Nhật ký dự án: Điểm danh QR Code.\nHọc sinh thực hiện: Kpă Su, Nay Phoan.";
  
  // 3. Tạo file .txt bên trong thư mục vừa tạo
  let fileMoi = thuMucMoi.createFile("nhatky.txt", noiDung);
  
  Logger.log("Đã tạo thành công! Link file: " + fileMoi.getUrl());
}

Mô phỏng: Quản lý Google Drive

Nhập tên dự án để tạo thư mục lưu trữ tương ứng:

📁 My Drive
📄
nhatky.txt
Vừa mới tạo • 1 KB
✓ Logger: Đã tạo thành công!

Ví dụ 2: Xuất Spreadsheet thành file PDF

Đề bài: Cuối học kỳ, bạn cần xuất Sheet chứa bảng điểm thành một file PDF để gửi cho phụ huynh. Hãy viết hàm lấy định dạng PDF của Sheet hiện tại và lưu vào Drive.

Code Apps Script:

function xuatPDFBangDiem() {
  let sheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
  let fileGoc = DriveApp.getFileById(sheetId);
  
  // 1. Lấy dữ liệu dưới dạng PDF (Blob)
  let pdfBlob = fileGoc.getAs('application/pdf');
  
  // 2. Đổi tên file PDF
  pdfBlob.setName("BangDiem_TongKet_HK2.pdf");
  
  // 3. Lưu file PDF mới vào thư mục gốc của Drive
  let pdfMoi = DriveApp.createFile(pdfBlob);
  
  Logger.log("Đã xuất PDF thành công!");
}

Mô phỏng: Chuyển đổi File sang định dạng PDF

3. Bài tập tự luyện

Bài tập: Quản lý thư mục lớp học động

Đề bài: Cột A chứa danh sách các lớp (VD: 10A1, 10A2, 11A1). Hãy viết một đoạn mã đọc danh sách này, và đối với mỗi lớp, kiểm tra xem thư mục tên lớp đó đã tồn tại chưa. Nếu chưa, tạo một thư mục mới có tên tương ứng trong Google Drive để lưu trữ bài tập thực hành Python của lớp đó.

Gợi ý thuật toán:

  1. Dùng vòng lặp quét qua mảng tên lớp.
  2. Dùng lệnh DriveApp.getFoldersByName(tenLop) để tìm kiếm.
  3. Hàm tìm kiếm trả về một danh sách (Iterator). Hãy dùng .hasNext() để kiểm tra xem có thư mục nào trùng tên không. Nếu hasNext()false, dùng createFolder(tenLop) để tạo.
Bài 9. Google Sheet & Apps Script Nâng Cao (Phần 9)

Thời gian dùng thử đã hết!

Phần mềm đã vượt quá 15 ngày dùng thử miễn phí. Vui lòng nhập mã bản quyền (License Key) để tiếp tục sử dụng.

Bài 9. Trình Kích Hoạt (Installable Triggers) & Tự Động Hóa

1. Kiến thức bài học: Installable Triggers

Ở Bài 5, chúng ta đã học về Simple Triggers (như `onOpen`, `onEdit`). Tuy nhiên, chúng có nhược điểm lớn: không thể gọi các dịch vụ yêu cầu cấp quyền (như gửi Email) và chỉ chạy khi có người dùng thao tác trực tiếp.

Installable Triggers (Trình kích hoạt có thể cài đặt) giải quyết hoàn toàn vấn đề này thông qua đối tượng ScriptApp:

  • Hẹn giờ (Time-driven): Chạy một hàm tự động vào một thời điểm cụ thể (hàng giờ, hàng ngày, hàng tuần) mà không cần mở file tính.
  • Sự kiện nâng cao (Event-driven): Theo dõi chỉnh sửa và có đầy đủ quyền hạn để gửi email, tạo tệp, chỉnh sửa cấu trúc bảng tính.

2. Bài tập mẫu

Ví dụ 1: Hẹn giờ báo cáo điểm danh QR hàng ngày

Đề bài: Bạn có một hàm guiBaoCaoDiemDanh(). Hãy viết một đoạn mã để hệ thống tự động chạy hàm này vào lúc 17:00 (5h chiều) mỗi ngày để báo cáo sĩ số cho Ban giám hiệu.

Code Apps Script (Chạy 1 lần để cài đặt Trigger):

function caiDatHenGioBaoCao() {
  ScriptApp.newTrigger('guiBaoCaoDiemDanh')
           .timeBased()
           .everyDays(1)        // Lặp lại mỗi 1 ngày
           .atHour(17)         // Chạy vào lúc 17h
           .create();
           
  Logger.log("Đã thiết lập hẹn giờ thành công!");
}

// Hàm thực thi chính (sẽ được tự động gọi)
function guiBaoCaoDiemDanh() {
  GmailApp.sendEmail("hieutruong@example.com", "Báo cáo điểm danh", "Dữ liệu quét mã QR hôm nay...");
}

Mô phỏng Trình kích hoạt thời gian (Time-driven)

Bấm nút để thiết lập lịch. Đồng hồ sẽ tua nhanh đến 17:00 để xem sự kiện kích hoạt.


14:00

Ví dụ 2: Đóng dấu thời gian (Timestamp) tự động

Đề bài: Khi nhập tên học sinh tham gia dự án KHKT (vào cột A), hệ thống sẽ tự động bắt sự kiện onEdit và ghi ngày giờ hiện tại vào cột B ngay lập tức.

Code Apps Script:

function onEdit(e) {
  let sheet = e.source.getActiveSheet();
  let range = e.range;
  
  // Kiểm tra nếu sửa ở Cột A (Cột 1) và dòng > 1 (bỏ qua tiêu đề)
  if (range.getColumn() === 1 && range.getRow() > 1) {
    // Lấy dòng vừa chỉnh sửa
    let dongHienTai = range.getRow();
    
    // Ghi thời gian hiện tại vào Cột B (Cột 2) cùng dòng
    sheet.getRange(dongHienTai, 2).setValue(new Date());
  }
}

Mô phỏng sự kiện onEdit (Timestamp)

Hãy gõ tên học sinh vào ô trống ở Cột A (Tên học sinh) rồi click ra ngoài (hoặc nhấn Enter) để xem Cột B tự động nhảy thời gian.

A (Tên học sinh dự án) B (Thời gian ghi nhận)
2 ...
3 ...
4 ...

3. Bài tập tự luyện

Bài tập: Lên lịch trộn đề thi cuối kỳ tự động

Đề bài: Bạn đã viết sẵn một hàm tronDeThiExcel() để tự động đảo câu hỏi và xuất file định dạng chuẩn cho máy chấm. Hãy viết một hàm lenLichTronDe() sử dụng `ScriptApp` để hẹn giờ hệ thống tự chạy hàm trộn đề này vào lúc 22:00 ngày Thứ Sáu hàng tuần.

Gợi ý cú pháp:

ScriptApp.newTrigger('tronDeThiExcel')
         .timeBased()
         .onWeekDay(ScriptApp.WeekDay.FRIDAY)
         .atHour(22)
         .create();