SpreadsheetApp — Đọc/Ghi Dữ Liệu

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

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.