Lấy Spreadsheet & Sheet
Bước đầu tiên trong mọi script làm việc với Sheets là lấy tham chiếu đến spreadsheet và sheet cần thao tác:
// Lấy spreadsheet hiện tại (file đang mở)
const ss = SpreadsheetApp.getActiveSpreadsheet();
// Lấy sheet đang active
const sheet = ss.getActiveSheet();
// Lấy sheet theo tên
const dataSheet = ss.getSheetByName('Data');
const reportSheet = ss.getSheetByName('Báo cáo');
// Lấy spreadsheet khác theo ID
const otherId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms';
const otherSS = SpreadsheetApp.openById(otherId);
// Lấy tất cả sheets
const allSheets = ss.getSheets();
allSheets.forEach(s => Logger.log(s.getName()));Đọc & Ghi Một Ô
// Đọc giá trị một ô
const val = sheet.getRange('A1').getValue();
const val2 = sheet.getRange(1, 1).getValue(); // row, col
// Ghi giá trị
sheet.getRange('B1').setValue('Hello Apps Script');
sheet.getRange(2, 3).setValue(12345); // hàng 2, cột 3
// Ghi ngày tháng
sheet.getRange('C1').setValue(new Date());Đọc/Ghi Hàng Loạt (QUAN TRỌNG)
Nguyên tắc vàng: Luôn đọc/ghi dữ liệu theo batch. Đọc 1000 ô một lần nhanh hơn 100-1000x so với đọc từng ô riêng lẻ trong vòng lặp!
// Đọc vùng dữ liệu — trả về mảng 2 chiều
const values = sheet.getRange('A1:D10').getValues();
// [['A1','B1','C1','D1'], ['A2','B2',...], ...]
// Đọc toàn bộ dữ liệu có nội dung
const allData = sheet.getDataRange().getValues();
// Xử lý dữ liệu trong memory
for (let i = 1; i < allData.length; i++) { // bỏ qua hàng tiêu đề
const [stt, name, qty, price] = allData[i];
const total = qty * price;
allData[i].push(total); // thêm cột total
}
// Ghi kết quả một lần
const outputValues = allData.map(row => [row[4]]); // chỉ lấy cột total
sheet.getRange(1, 5, outputValues.length, 1).setValues(outputValues);Thêm, Xóa, Xóa Nội Dung
// Thêm hàng ở cuối
sheet.appendRow(['Sản phẩm mới', 100, 299000, 'Active']);
// Chèn hàng trống
sheet.insertRowBefore(5); // chèn trước hàng 5
sheet.insertRowsAfter(10, 3); // chèn 3 hàng sau hàng 10
// Xóa hàng
sheet.deleteRow(5);
sheet.deleteRows(5, 3); // xóa 3 hàng từ hàng 5
// Xóa nội dung (giữ định dạng)
sheet.getRange('A2:D100').clearContent();
// Xóa cả nội dung và định dạng
sheet.getRange('A2:D100').clear();
// Lấy số hàng/cột cuối có dữ liệu
const lastRow = sheet.getLastRow();
const lastCol = sheet.getLastColumn();
Logger.log('Dữ liệu đến hàng: ' + lastRow);Định Dạng Bằng Code
// Định dạng tiêu đề
const header = sheet.getRange('A1:E1');
header.setFontWeight('bold');
header.setBackground('#4285F4');
header.setFontColor('#FFFFFF');
header.setHorizontalAlignment('center');
header.setFontSize(12);
// Định dạng số tiền
sheet.getRange('D2:D100').setNumberFormat('#,##0 "đ"');
// Định dạng ngày
sheet.getRange('A2:A100').setNumberFormat('dd/MM/yyyy');
// Freeze hàng đầu
sheet.setFrozenRows(1);Named Ranges
// Tạo named range
ss.setNamedRange('DanhSachSanPham', sheet.getRange('A2:D100'));
// Dùng named range
const products = ss.getRangeByName('DanhSachSanPham').getValues();
// Xóa named range
ss.removeNamedRange('DanhSachSanPham');Thực hành ngay: Tạo một sheet có cột Tên, Số lượng, Đơn giá. Viết script đọc toàn bộ dữ liệu, tính thành tiền (= SL × Đơn giá) và ghi vào cột Thành tiền.