Hướng dẫn

Cách Tạo Hệ Thống Chấm Công & Tính Lương Trên Google Sheets [Template 2026]

Tuân HoangTuân Hoang
27 tháng 2, 2026
Cập nhật: 25 tháng 3, 2026
15 phút đọc
Cách Tạo Hệ Thống Chấm Công & Tính Lương Trên Google Sheets [Template 2026]

Tại sao cần hệ thống chấm công tự động?

Theo khảo sát của Vietnam HR Summit 2026, 78% doanh nghiệp Việt Nam vẫn dùng Excel/Google Sheets cho quản lý nhân sự, trong đó 65% gặp sai sót khi tính lương do nhập tay thủ công.

Vấn đề thường gặp

  • • Nhân viên quên chấm công hoặc chấm giùm đồng nghiệp
  • • Tính sai giờ OT (không phân biệt OT ngày thường, cuối tuần, lễ)
  • • Không rõ nhân viên đi nghỉ phép hay nghỉ không phép
  • Thuế TNCN & BHXH tính không chính xác
  • • Mất nhiều thời gian đối soát & giải trình phiếu lương

So sánh: Manual vs Google Sheets

Tiêu chí Tính lương thủ công Google Sheets tự động
Chi phí
Thời gian tính lương 8-12 giờ/tháng 2 giờ/tháng
Tỷ lệ sai sót 15-20% ~0%
Báo cáo Phải tự tạo Tự động realtime
Theo dõi ngày công Kiểm tra thủ công Highlight đỏ/vàng tự động
Mở rộng Khó khi > 20 người Dễ scale đến 100 người

Cấu trúc 4 Sheets

Hệ thống chấm công gồm 4 sheet chính, liên kết với nhau qua công thức:

📋 Sheet 1: Thông tin nhân viên

Master data: Mã NV, Lương cơ bản, Phụ cấp, Hệ số, Ngày vào làm

⏰ Sheet 2: Bảng chấm công

Giờ vào/ra, Tổng giờ, OT, Nghỉ phép/không phép

💰 Sheet 3: Bảng tính lương

Lương ngày công, OT, BHXH, Thuế, Thực lĩnh

📊 Sheet 4: Dashboard

KPI: Tổng quỹ lương, Vắng mặt, OT, Charts

Sheet 1: Thông tin nhân viên

Sheet master data chứa thông tin gốc của tất cả nhân viên.

Cột Tên trường Mô tả Ví dụ
A Mã NV Mã định danh duy nhất NV001
B Họ tên Họ tên đầy đủ Nguyễn Văn A
C Phòng ban Dropdown Kinh doanh
D Chức vụ Dropdown Nhân viên
E Lương cơ bản Lương tháng theo hợp đồng 12,000,000
F Phụ cấp Xăng xe, điện thoại, ăn trưa 1,500,000
G Hệ số lương Dùng khi tính lương theo hệ số 1.0
H Số tài khoản STK ngân hàng 0123456789
I CCCD Căn cước công dân 079123456789
J Ngày vào làm Date format 01/01/2024

Sheet 2: Bảng chấm công

Sheet ghi nhận giờ vào/ra hàng ngày, tự động tính OT và phân loại nghỉ.

Cột Tên trường Công thức / Validation
A Ngày Date format (dd/mm/yyyy)
B Mã NV Dropdown từ sheet Nhân viên
C Giờ vào Time format (08:30)
D Giờ ra Time format (17:30)
E Tổng giờ =IF(C2="","",D2-C2)*24
F Giờ OT =MAX(0,E2-8)
G Loại nghỉ Dropdown: Phép / Không phép / Ốm
H Ghi chú Text tự do

Setup Data Validation cho Loại nghỉ

// Chọn cột G → Data → Data validation
// Criteria: List of items
// Items: Phép,Không phép,Ốm
// ✓ Show dropdown list in cell
// ✓ Reject input when invalid

Sheet 3: Bảng tính lương

Sheet quan trọng nhất - tính toán lương thực lĩnh tự động từ ngày công, OT, BHXH, thuế.

Cột Tên trường Công thức
A Mã NV Copy từ sheet Nhân viên
B Họ tên =VLOOKUP(A2,'Nhân viên'!A:B,2,0)
C Lương cơ bản =VLOOKUP(A2,'Nhân viên'!A:E,5,0)
D Số ngày công =COUNTIFS('Chấm công'!B:B,A2,'Chấm công'!C:C,"<>")
E Lương ngày công =C2/26*D2
F Số giờ OT =SUMIFS('Chấm công'!F:F,'Chấm công'!B:B,A2)
G Lương OT =F2*(C2/26/8)*1.5
H Tổng phụ cấp =VLOOKUP(A2,'Nhân viên'!A:F,6,0)
I Bảo hiểm (10.5%) =C2*10.5%
J Thuế TNCN Công thức phức tạp (xem bên dưới)
K Trừ khác Nhập thủ công (phạt, tạm ứng...)
L Thực lĩnh =E2+G2+H2-I2-J2-K2

Công thức quan trọng

1. NETWORKDAYS - Tính ngày công thực tế

Công thức này tính số ngày làm việc trong tháng, tự động trừ cuối tuần và ngày lễ Việt Nam.

// Tính ngày công trong tháng (trừ T7, CN và ngày lễ)
// Ô D2 trong sheet "Tính lương"
=NETWORKDAYS(
  DATE(2026,2,1),  // Ngày đầu tháng
  DATE(2026,2,28), // Ngày cuối tháng
  NgayLe!A2:A10    // Range chứa danh sách ngày lễ Việt Nam
)

// Tạo sheet "NgayLe" với các ngày lễ 2026:
// A2: 01/01/2026 - Tết Dương lịch
// A3: 29/01/2026 - Tết Âm lịch (30 Tết)
// A4: 30/01/2026 - Mùng 1 Tết
// A5: 31/01/2026 - Mùng 2 Tết
// A6: 01/02/2026 - Mùng 3 Tết
// A7: 02/02/2026 - Mùng 4 Tết
// A8: 10/04/2026 - Giỗ Tổ Hùng Vương
// A9: 30/04/2026 - 30 tháng 4
// A10: 01/05/2026 - Quốc tế Lao động
// A11: 02/09/2026 - Quốc khánh

2. Tính giờ OT theo loại ngày

// OT ngày thường: x 1.5
// OT đêm (22h-6h): x 1.5
// OT cuối tuần: x 2.0
// OT ngày lễ: x 3.0

// Cột F trong sheet "Chấm công" - phân loại OT
=IF(WEEKDAY(A2)=1,"Chủ nhật",
  IF(WEEKDAY(A2)=7,"Thứ 7",
    IF(COUNTIF(NgayLe!A:A,A2)>0,"Ngày lễ","Ngày thường")))

// Cột G - Tính hệ số OT
=IF(F2="Ngày lễ",3,
  IF(OR(F2="Chủ nhật",F2="Thứ 7"),2,1.5))

// Lương OT trong sheet "Tính lương"
=SUMPRODUCT((ChấmCông!B:B=A2)*(ChấmCông!F:F)*(ChấmCông!G:G))
 *(C2/26/8)

3. Lương gross (trước thuế & BHXH)

// Lương gross = Lương ngày công + Lương OT + Phụ cấp
=E2 + G2 + H2

// Trong đó:
// E2 = Lương cơ bản / 26 * Số ngày công
// G2 = Giờ OT * (Lương cơ bản / 26 / 8) * Hệ số OT
// H2 = Tổng phụ cấp (xăng xe, điện thoại, ăn trưa...)

4. BHXH 10.5% (8% BHXH + 1.5% BHYT + 1% BHTN)

// Cột I - Bảo hiểm
=C2 * 10.5%

// Hoặc tính chi tiết:
// BHXH (8%): =C2*8%
// BHYT (1.5%): =C2*1.5%
// BHTN (1%): =C2*1%
// Tổng: =C2*10.5%

5. Thuế TNCN lũy tiến từng phần

Thuế thu nhập cá nhân theo biểu thuế lũy tiến từng phần 2026:

Bậc Thu nhập tính thuế/tháng Thuế suất
1 Đến 5 triệu 5%
2 Trên 5 - 10 triệu 10%
3 Trên 10 - 18 triệu 15%
4 Trên 18 - 32 triệu 20%
5 Trên 32 - 52 triệu 25%
6 Trên 52 - 80 triệu 30%
7 Trên 80 triệu 35%
// Cột J - Thuế TNCN
// Thu nhập tính thuế = Gross - BHXH - Giảm trừ bản thân (11 triệu)
// Giả sử không có người phụ thuộc

// Công thức IF lồng nhau:
=LET(
  gross, E2+G2+H2,
  bhxh, I2,
  giamTru, 11000000,
  thuNhapTinhThue, MAX(0, gross - bhxh - giamTru),

  IF(thuNhapTinhThue <= 0, 0,
    IF(thuNhapTinhThue <= 5000000, thuNhapTinhThue * 5%,
      IF(thuNhapTinhThue <= 10000000, 5000000*5% + (thuNhapTinhThue-5000000)*10%,
        IF(thuNhapTinhThue <= 18000000, 5000000*5% + 5000000*10% + (thuNhapTinhThue-10000000)*15%,
          IF(thuNhapTinhThue <= 32000000, 5000000*5% + 5000000*10% + 8000000*15% + (thuNhapTinhThue-18000000)*20%,
            IF(thuNhapTinhThue <= 52000000, 5000000*5% + 5000000*10% + 8000000*15% + 14000000*20% + (thuNhapTinhThue-32000000)*25%,
              5000000*5% + 5000000*10% + 8000000*15% + 14000000*20% + 20000000*25% + (thuNhapTinhThue-52000000)*30%
            )
          )
        )
      )
    )
  )
)

// Đơn giản hóa (chỉ tính đến bậc 5):
=LET(t,MAX(0,E2+G2+H2-I2-11000000),
  IF(t<=0,0,IF(t<=5000000,t*5%,
  IF(t<=10000000,250000+(t-5000000)*10%,
  IF(t<=18000000,750000+(t-10000000)*15%,
  IF(t<=32000000,1950000+(t-18000000)*20%,
  4750000+(t-32000000)*25%))))))

6. Lương thực lĩnh (Net salary)

// Cột L - Thực lĩnh
=E2 + G2 + H2 - I2 - J2 - K2

// Trong đó:
// E2: Lương ngày công
// G2: Lương OT
// H2: Phụ cấp
// I2: BHXH 10.5%
// J2: Thuế TNCN
// K2: Trừ khác (phạt, tạm ứng...)

7. SPARKLINE - Progress bar ngày công

// Thêm cột hiển thị % hoàn thành ngày công bằng thanh tiến trình
// Cột M trong sheet "Tính lương"
=SPARKLINE(D2/26,{"charttype","bar";"color1","green";"max",26})

Conditional Formatting

Tô màu bảng chấm công

Thiết lập tô màu tự động cho sheet "Chấm công":

1. Đi muộn (Late) - Màu cam

  • • Chọn cột C (Giờ vào) → Format → Conditional formatting
  • • Condition: Custom formula is
  • • Formula: =C2>TIME(8,30,0)
  • • Format: Background #FFA500 (orange)

2. Về sớm (Early leave) - Màu đỏ

  • • Chọn cột D (Giờ ra) → Conditional formatting
  • • Formula: =D2
  • • Format: Background #FF6B6B (red)

3. Cuối tuần - Màu xanh dương

  • • Chọn cột A (Ngày) → Conditional formatting
  • • Formula: =OR(WEEKDAY(A2)=1,WEEKDAY(A2)=7)
  • • Format: Background #4ECDC4 (cyan)

Tô màu bảng tính lương

Highlight lương & khấu trừ:

1. Lương cao (>20 triệu) - Xanh lá

  • • Chọn cột L (Thực lĩnh) → Conditional formatting
  • • Condition: Greater than 20000000
  • • Format: Background #10B981 + Bold

2. Lương thấp (<5 triệu) - Vàng

  • • Condition: Less than 5000000
  • • Format: Background #FBBF24

3. BHXH/Thuế cao (>3 triệu) - Đỏ nhạt

  • • Chọn cột I:J → Conditional formatting
  • • Condition: Greater than 3000000
  • • Format: Background #FEE2E2 + Text đỏ

Sheet 4: Dashboard

Tổng hợp các KPI quan trọng về nhân sự & quỹ lương.

KPI Cards

// 1. Tổng quỹ lương tháng này
=SUM('Tính lương'!L:L)

// 2. Trung bình lương/người
=AVERAGE('Tính lương'!L:L)

// 3. Tỷ lệ vắng mặt (%)
=COUNTBLANK('Chấm công'!C:C) / COUNTA('Chấm công'!A:A) * 100

// 4. Tỷ lệ OT (%)
=COUNTIF('Chấm công'!F:F,">0") / COUNTA('Chấm công'!A:A) * 100

// 5. Tổng giờ OT trong tháng
=SUM('Chấm công'!F:F)

// 6. Số nhân viên đi muộn
=COUNTIF('Chấm công'!C:C,">TIME(8,30,0)")

Charts

📊 Bar Chart: Lương theo phòng ban

QUERY lấy tổng lương theo phòng ban, sắp xếp giảm dần

🏆 Column Chart: Top 5 NV lương cao

SORT + LIMIT 5 nhân viên có lương thực lĩnh cao nhất

📈 Line Chart: Quỹ lương theo tháng

Tổng lương tháng 1, 2, 3... để thấy xu hướng

🥧 Pie Chart: % Lương/Phòng ban

Tỷ lệ quỹ lương phân bổ cho từng phòng ban

Apps Script tự động hóa

Script 1: Gửi phiếu lương qua email

/**
 * Gửi phiếu lương tháng cho tất cả nhân viên qua email
 * Chạy trigger vào ngày 1 hàng tháng
 */
function sendSalarySlipEmail() {
  try {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const nvSheet = ss.getSheetByName("Nhân viên");
    const salarySheet = ss.getSheetByName("Tính lương");

    const nvData = nvSheet.getDataRange().getValues();
    const salaryData = salarySheet.getDataRange().getValues();

    const month = Utilities.formatDate(new Date(), "Asia/Ho_Chi_Minh", "MM/yyyy");

    // Bỏ header row
    for (let i = 1; i < salaryData.length; i++) {
      const maNV = salaryData[i][0];
      const hoTen = salaryData[i][1];
      const luongCoBan = salaryData[i][2];
      const ngayCong = salaryData[i][3];
      const luongNgayCong = salaryData[i][4];
      const gioOT = salaryData[i][5];
      const luongOT = salaryData[i][6];
      const phuCap = salaryData[i][7];
      const bhxh = salaryData[i][8];
      const thue = salaryData[i][9];
      const truKhac = salaryData[i][10];
      const thucLinh = salaryData[i][11];

      // Tìm email nhân viên
      let email = "";
      for (let j = 1; j < nvData.length; j++) {
        if (nvData[j][0] === maNV) {
          // Giả sử email ở cột K (index 10)
          email = nvData[j][10] || "";
          break;
        }
      }

      if (!email) {
        Logger.log(`Không tìm thấy email cho ${maNV}`);
        continue;
      }

      // HTML email template
      const html = `
        

PHIẾU LƯƠNG THÁNG ${month}

Kính gửi: ${hoTen}

Phiếu lương tháng ${month} của bạn đã được tính như sau:

MỤC SỐ TIỀN
Lương cơ bản ${formatVND(luongCoBan)}
Số ngày công: ${ngayCong}/26 ${formatVND(luongNgayCong)}
Lương OT (${gioOT}h) ${formatVND(luongOT)}
Phụ cấp ${formatVND(phuCap)}
TỔNG THU NHẬP ${formatVND(luongNgayCong+luongOT+phuCap)}
Bảo hiểm (10.5%) -${formatVND(bhxh)}
Thuế TNCN -${formatVND(thue)}
Trừ khác -${formatVND(truKhac)}
THỰC LĨNH ${formatVND(thucLinh)}

Nếu có thắc mắc, vui lòng liên hệ Phòng Nhân sự.

© 2026 Công ty ABC. Email tự động - vui lòng không reply.

`; // Gửi email GmailApp.sendEmail( email, `Phiếu lương tháng ${month} - ${hoTen}`, `Phiếu lương tháng ${month}`, { htmlBody: html, name: "Phòng Nhân sự" } ); Logger.log(`✅ Đã gửi phiếu lương cho ${hoTen} (${email})`); Utilities.sleep(500); // Tránh rate limit } SpreadsheetApp.getUi().alert(`Đã gửi phiếu lương cho ${salaryData.length - 1} nhân viên!`); } catch (error) { Logger.log(`❌ Lỗi: ${error.toString()}`); SpreadsheetApp.getUi().alert(`Lỗi: ${error.toString()}`); } } function formatVND(amount) { return new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' }).format(amount || 0); }

Script 2: Cảnh báo đi muộn qua Telegram

/**
 * Gửi cảnh báo qua Telegram khi nhân viên chấm công muộn
 * Trigger: onEdit khi sửa cột C (Giờ vào)
 */
function checkLateAttendance(e) {
  try {
    if (!e) return;

    const sheet = e.source.getActiveSheet();
    if (sheet.getName() !== "Chấm công") return;

    const range = e.range;
    const col = range.getColumn();

    // Chỉ xử lý khi sửa cột C (Giờ vào)
    if (col !== 3) return;

    const row = range.getRow();
    if (row === 1) return; // Skip header

    const gioVao = range.getValue();
    if (!gioVao) return;

    // Kiểm tra đi muộn (sau 8:30)
    const timeLimit = new Date();
    timeLimit.setHours(8, 30, 0, 0);

    if (gioVao > timeLimit) {
      const maNV = sheet.getRange(row, 2).getValue();
      const ngay = sheet.getRange(row, 1).getValue();

      // Lấy tên nhân viên
      const nvSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Nhân viên");
      const hoTen = nvSheet.getRange(1, 1, nvSheet.getLastRow(), 2)
        .getValues()
        .find(r => r[0] === maNV)?.[1] || "Unknown";

      const minutes = Math.round((gioVao - timeLimit) / 60000);

      // Gửi Telegram
      const botToken = "YOUR_BOT_TOKEN";
      const chatId = "YOUR_CHAT_ID";
      const message = `⚠️ ĐI MUỘN

` +
        `👤 ${hoTen} (${maNV})
` +
        `📅 Ngày: ${Utilities.formatDate(ngay, "Asia/Ho_Chi_Minh", "dd/MM/yyyy")}
` +
        `⏰ Giờ vào: ${Utilities.formatDate(gioVao, "Asia/Ho_Chi_Minh", "HH:mm")}
` +
        `⏱️ Muộn: ${minutes} phút`;

      const url = `https://api.telegram.org/bot${botToken}/sendMessage`;
      const options = {
        method: "post",
        contentType: "application/json",
        payload: JSON.stringify({
          chat_id: chatId,
          text: message,
          parse_mode: "HTML"
        })
      };

      UrlFetchApp.fetch(url, options);
      Logger.log(`Đã gửi cảnh báo đi muộn: ${hoTen}`);
    }

  } catch (error) {
    Logger.log(`Lỗi checkLateAttendance: ${error.toString()}`);
  }
}

Script 3: Báo cáo lương hàng tháng

/**
 * Tạo báo cáo lương tháng dạng PDF và lưu vào Google Drive
 * Trigger: Time-driven, ngày 1 hàng tháng lúc 9AM
 */
function generateMonthlyReport() {
  try {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const salarySheet = ss.getSheetByName("Tính lương");

    const month = Utilities.formatDate(new Date(), "Asia/Ho_Chi_Minh", "MM-yyyy");
    const fileName = `Bao-cao-luong-${month}.pdf`;

    // Export sheet thành PDF
    const url = `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?` +
      `format=pdf&gid=${salarySheet.getSheetId()}&size=A4&portrait=false`;

    const token = ScriptApp.getOAuthToken();
    const response = UrlFetchApp.fetch(url, {
      headers: { Authorization: `Bearer ${token}` }
    });

    // Lưu vào Drive
    const folder = DriveApp.getFoldersByName("Báo cáo lương").hasNext()
      ? DriveApp.getFoldersByName("Báo cáo lương").next()
      : DriveApp.createFolder("Báo cáo lương");

    const pdfFile = folder.createFile(response.getBlob()).setName(fileName);

    Logger.log(`✅ Đã tạo báo cáo: ${pdfFile.getUrl()}`);

    // Gửi email cho quản lý
    GmailApp.sendEmail(
      "manager@company.com",
      `Báo cáo lương tháng ${month}`,
      `Báo cáo lương tháng ${month} đã được tạo tự động.

Xem tại: ${pdfFile.getUrl()}`,
      {
        attachments: [pdfFile.getAs(MimeType.PDF)]
      }
    );

  } catch (error) {
    Logger.log(`❌ Lỗi generateMonthlyReport: ${error.toString()}`);
  }
}

Script 4: Custom menu

/**
 * Tạo menu "Nhân sự" tùy chỉnh
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('⚙️ Nhân sự')
    .addItem('📧 Gửi phiếu lương', 'sendSalarySlipEmail')
    .addItem('📊 Báo cáo tháng', 'generateMonthlyReport')
    .addSeparator()
    .addItem('🗑️ Xóa log cũ', 'cleanOldLogs')
    .addToUi();
}

/**
 * Xóa dữ liệu chấm công cũ hơn 12 tháng
 */
function cleanOldLogs() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.alert(
    'Xóa dữ liệu cũ',
    'Xóa chấm công cũ hơn 12 tháng?',
    ui.ButtonSet.YES_NO
  );

  if (response !== ui.Button.YES) return;

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Chấm công");
  const data = sheet.getDataRange().getValues();

  const cutoffDate = new Date();
  cutoffDate.setMonth(cutoffDate.getMonth() - 12);

  let deletedCount = 0;

  // Đi từ dưới lên để tránh lỗi index khi xóa
  for (let i = data.length - 1; i >= 1; i--) {
    const rowDate = data[i][0];
    if (rowDate && rowDate < cutoffDate) {
      sheet.deleteRow(i + 1);
      deletedCount++;
    }
  }

  ui.alert(`Đã xóa ${deletedCount} dòng dữ liệu cũ!`);
}

Setup Triggers

Thiết lập trigger tự động:

  1. 1. Extensions → Apps Script
  2. 2. Click icon ⏰ "Triggers" bên trái
  3. 3. Add Trigger:
    • checkLateAttendance → Event: On edit
    • generateMonthlyReport → Time-driven → Month timer → 1st day → 9AM-10AM
    • sendSalarySlipEmail → Chạy thủ công hoặc schedule vào ngày trả lương

Ví dụ thực tế: Công ty TNHH ABC

Công ty ABC có 30 nhân viên, trước đây tính lương bằng Excel thủ công, giờ chuyển sang Google Sheets tự động.

Sample data (5 nhân viên)

Mã NV Họ tên Phòng ban Lương CB Ngày công OT (h) Thực lĩnh
NV001 Nguyễn Văn A Kinh doanh 15,000,000 24/26 12 14,850,000
NV002 Trần Thị B Kế toán 12,000,000 26/26 8 12,180,000
NV003 Lê Văn C IT 18,000,000 26/26 20 17,950,000
NV004 Phạm Thị D Marketing 10,000,000 22/26 4 8,920,000
NV005 Hoàng Văn E Kinh doanh 13,000,000 26/26 16 13,420,000

So sánh: Trước vs Sau khi dùng Google Sheets

Tiêu chí Trước (Excel thủ công) Sau (Google Sheets)
Thời gian tính lương 12 giờ/tháng 2 giờ/tháng
Tỷ lệ sai sót 15% (4-5 lỗi/tháng) ~0%
Breakdown lương Không rõ ràng Chi tiết từng khoản
Gửi phiếu lương In giấy, phát tay Tự động qua email
Báo cáo quản lý Phải tự tổng hợp Dashboard realtime

Lưu ý quan trọng

1

Backup data hàng ngày

Dùng Apps Script tự động copy sang file khác hoặc export PDF định kỳ.

2

Protect ranges

Chỉ HR được sửa sheet "Nhân viên" (lương cơ bản). Lock sheet "Tính lương" (chỉ công thức).

3

Cập nhật ngày lễ đầu năm

Sheet "NgayLe" cần update hàng năm theo lịch nghỉ chính thức của Chính phủ.

4

Log history 12 tháng

Giữ dữ liệu chấm công tối thiểu 12 tháng để đối chiếu và kiểm tra lại khi cần.

5

Test với sample data

Trước khi rollout cho toàn công ty, test với 5-10 nhân viên mẫu trong 1 tháng.

Câu hỏi thường gặp (FAQ)

1. Có thể chấm công bằng QR code hoặc NFC không?

Có. Dùng Google Forms kết hợp QR code (mỗi nhân viên 1 mã riêng). Nhân viên quét mã → submit form → dữ liệu tự động vào sheet "Chấm công" qua form responses. Hoặc dùng app di động như "QR Check-in for Google Sheets".

2. Tính lương theo giờ (parttime) thay vì theo tháng?

Có. Thay vì lương cơ bản tháng, nhập "Lương theo giờ" (VD: 50,000đ/h). Công thức tính lương: =Tổng giờ làm * Lương theo giờ. Không cần tính ngày công 26.

3. Làm tròn lương đến 1000đ hay tính chính xác?

Tùy công ty. Nếu làm tròn, dùng công thức: =ROUND(L2,-3) (làm tròn đến hàng nghìn). VD: 12,345,678 → 12,346,000. Nếu tính chính xác, giữ nguyên công thức.

4. Bảo mật thông tin lương (mỗi người chỉ xem lương mình)?

Dùng FILTER + Google Apps Script. Tạo sheet riêng cho từng nhân viên với công thức =FILTER('Tính lương'!A:L, 'Tính lương'!A:A=A1). Hoặc dùng script tạo file PDF riêng cho từng người và gửi email.

5. Quản lý nhiều chi nhánh khác nhau?

Cách 1: Thêm cột "Chi nhánh" vào tất cả sheet, dùng FILTER/QUERY lọc theo chi nhánh. Cách 2: Tạo file riêng cho mỗi chi nhánh, dùng IMPORTRANGE tổng hợp vào file master.

Tổng kết

Với 4 sheet + Apps Script tự động hóa, bạn đã có một hệ thống chấm công & tính lương hoàn chỉnh trên Google Sheets, tiết kiệm 80% thời gian so với tính lương thủ công.

  • Chấm công tự động: Tính giờ OT, highlight đi muộn/về sớm

  • Tính lương chính xác: BHXH 10.5%, Thuế TNCN lũy tiến, NETWORKDAYS

  • Gửi phiếu lương email: HTML template đẹp, PDF attachment tự động

  • Dashboard KPI: Tổng quỹ lương, vắng mặt, OT realtime

  • Hoàn toàn miễn phí và dễ tùy chỉnh theo nhu cầu công ty

Cần hệ thống HR chuyên nghiệp hơn?

SheetStore cung cấp phần mềm quản lý nhân sự tích hợp chấm công vân tay, face ID, tính lương tự động & tích hợp ngân hàng.

Truy cập sheet.com.vn để dùng thử miễn phí 30 ngày.

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Bạn thấy bài viết hữu ích?

Đăng ký nhận thông báo khi có bài viết mới.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận