Menu

Tự động cập nhật dữ liệu giữa các sheet bằng Google Apps Script - Hướng dẫn chi tiết

Đỗ Tài Chí 10/04/2026 03:46 591 lượt xem 2 trả lời

Chào các bạn, mình là thành viên mới của diễn đàn. Hôm nay mình muốn chia sẻ một chút kinh nghiệm cá nhân về việc tự động hóa trong Google Sheets, cụ thể là cách đồng bộ dữ liệu giữa các sheet khác nhau bằng Google Apps Script. Mình thấy trong chuyên mục đã có bài về sao chép dữ liệu, nhưng bài này sẽ đi sâu hơn vào việc cập nhật liên tục và tự động.

Trong công việc, đôi khi chúng ta cần cập nhật thông tin từ một sheet (ví dụ: danh sách sản phẩm) sang một sheet khác (ví dụ: báo cáo bán hàng) mỗi khi có sự thay đổi. Làm thủ công rất tốn thời gian và dễ sai sót. Với Google Apps Script, việc này trở nên đơn giản hơn nhiều.

Ý tưởng cơ bản:

  • Chúng ta sẽ sử dụng hàm onEdit(e) để kích hoạt script mỗi khi có sự thay đổi trong sheet nguồn.
  • Script sẽ kiểm tra xem sự thay đổi có thuộc phạm vi cần xử lý không.
  • Nếu có, script sẽ lấy dữ liệu mới và cập nhật vào sheet đích.

Ví dụ đơn giản:

Giả sử bạn có Sheet1 chứa danh sách sản phẩm (Cột A: Mã SP, Cột B: Tên SP) và Sheet2 bạn muốn hiển thị danh sách này. Khi bạn thay đổi Tên SP ở Sheet1, Sheet2 sẽ tự động cập nhật.

Bạn vào Extensions > Apps Script, dán đoạn code sau:

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNguon = ss.getSheetByName("Sheet1"); // Tên sheet nguồn
  var sheetDich = ss.getSheetByName("Sheet2"); // Tên sheet đích

  // Kiểm tra xem sự kiện edit có xảy ra ở sheet nguồn không
  if (e.range.getSheet().getName() == "Sheet1") {
    var row = e.range.getRow();
    var col = e.range.getColumn();

    // Chỉ cập nhật khi thay đổi ở cột Tên SP (cột 2)
    if (col == 2 && row > 1) { // Bỏ qua header
      var maSP = sheetNguon.getRange(row, 1).getValue(); // Lấy Mã SP
      var tenSPMoi = e.value; // Lấy Tên SP mới

      // Tìm dòng tương ứng ở sheet đích và cập nhật Tên SP
      var dataDich = sheetDich.getDataRange().getValues();
      for (var i = 1; i < dataDich.length; i++) { // Bắt đầu từ dòng 2 (index 1)
        if (dataDich[i][0] == maSP) { // So sánh Mã SP
          sheetDich.getRange(i + 1, 2).setValue(tenSPMoi);
          break; // Thoát vòng lặp sau khi tìm thấy
        }
      }
    }
  }
}

Lưu ý:

  • Bạn cần thay đổi tên sheet và số cột cho phù hợp với file của mình.
  • Code này chỉ là ví dụ cơ bản. Với dữ liệu lớn hoặc phức tạp hơn, bạn có thể cần tối ưu hóa để script chạy nhanh hơn.

Hy vọng chia sẻ này hữu ích cho mọi người. Nếu có thắc mắc hoặc cách làm hay hơn, mọi người cùng thảo luận nhé!

5

Bài viết này của bạn quá hay, đúng cái mình đang cần luôn! Mình cũng hay gặp tình huống phải cập nhật dữ liệu thủ công giữa các sheet, tốn thời gian lắm.

Mình có một thắc mắc nhỏ, không biết với trường hợp dữ liệu nguồn có thể bị xóa hoặc thêm mới liên tục thì script của bạn có xử lý được không? Hay mình cần thêm điều kiện gì cho script để nó nhận diện đúng sự thay đổi đó nhỉ?

2

Bài viết của bạn rất hữu ích, đặc biệt là với những ai thường xuyên phải làm việc với nhiều sheet và cần đồng bộ dữ liệu. Mình đang tìm hiểu về Apps Script, không biết ngoài việc cập nhật dữ liệu, bạn có thể chia sẻ thêm về các ứng dụng khác của nó trong Google Sheets không? Ví dụ như tự động gửi email báo cáo chẳng hạn?

0

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký