Biến, Hàm & Vòng Lặp

Thời gian đọc: ~30 phút

Biến & Kiểu Dữ Liệu

Apps Script sử dụng JavaScript hiện đại (ES2020+). Khai báo biến với const (không thay đổi) hoặc let (có thể thay đổi). Tránh dùng var trong code mới.

// Khai báo biến
const name = 'SheetStore';  // không thay đổi được
let count = 0;              // có thể gán lại

// Kiểu dữ liệu cơ bản
const num = 42;
const price = 299000.5;
const str = 'Xin chào';
const bool = true;
const nothing = null;

// Mảng
const arr = [1, 2, 3, 'a', 'b'];
const firstItem = arr[0]; // 1

// Object
const product = { name: 'GS Template', price: 299000, active: true };
const productName = product.name; // 'GS Template'

Hàm

Trong Apps Script, mỗi hàm cấp cao nhất (top-level function) đều có thể chạy trực tiếp từ editor. Hãy đặt tên hàm mô tả rõ chức năng.

// Hàm thông thường
function tinhTong(a, b) {
  return a + b;
}

// Arrow function (ngắn gọn hơn)
const nhanDoi = (x) => x * 2;

// Hàm với giá trị mặc định
function chaoHoi(ten, loi = 'Xin chào') {
  Logger.log(loi + ', ' + ten + '!');
}

// Gọi hàm
const ketQua = tinhTong(10, 20);
Logger.log(ketQua); // 30
chaoHoi('Nam'); // Xin chào, Nam!
chaoHoi('Lan', 'Chào buổi sáng'); // Chào buổi sáng, Lan!

Vòng Lặp

Vòng lặp rất quan trọng khi xử lý nhiều hàng dữ liệu trong Sheets. Có nhiều kiểu vòng lặp:

// For loop cổ điển — dùng khi cần index
for (let i = 0; i < 10; i++) {
  Logger.log('Hàng: ' + (i + 1));
}

// For...of — dùng khi lặp qua mảng
const items = ['Áo', 'Quần', 'Giày'];
for (const item of items) {
  Logger.log(item);
}

// forEach — phong cách functional
items.forEach(function(item, index) {
  Logger.log(index + ': ' + item);
});

// While loop
let n = 0;
while (n < 5) {
  Logger.log(n);
  n++;
}

Điều Kiện

const doanThu = 500000000;

if (doanThu > 1000000000) {
  Logger.log('Xuất sắc — trên 1 tỷ');
} else if (doanThu > 500000000) {
  Logger.log('Tốt — trên 500 triệu');
} else {
  Logger.log('Cần cải thiện');
}

// Toán tử ternary
const nhanXet = doanThu > 500000000 ? 'Đạt' : 'Không đạt';

// Switch case
const trangThai = 'Active';
switch (trangThai) {
  case 'Active':
    Logger.log('Đang hoạt động');
    break;
  case 'Inactive':
    Logger.log('Ngừng hoạt động');
    break;
  default:
    Logger.log('Không xác định');
}

Xử Lý Mảng Nâng Cao

Khi làm việc với dữ liệu từ Sheets (luôn là mảng 2 chiều), các hàm mảng này rất hữu ích:

const data = [['Nam', 100], ['Lan', 200], ['Hùng', 150]];

// filter — lọc
const loiNhuan = data.filter(row => row[1] > 100);
// [['Lan', 200], ['Hùng', 150]]

// map — biến đổi
const tenList = data.map(row => row[0]);
// ['Nam', 'Lan', 'Hùng']

// reduce — tính tổng
const tongSo = data.reduce((sum, row) => sum + row[1], 0);
// 450

// find — tìm phần tử đầu tiên
const timThay = data.find(row => row[0] === 'Lan');
// ['Lan', 200]
Mẹo debug: Dùng console.log(JSON.stringify(obj)) để xem nội dung object/mảng. Trong Execution log, JSON giúp bạn thấy cấu trúc dữ liệu rõ hơn.