Cách Tạo Hệ Thống Chấm Công & Tính Lương Trên Google Sheets [Template 2026]
![Cách Tạo Hệ Thống Chấm Công & Tính Lương Trên Google Sheets [Template 2026]](/images/blog/he-thong-cham-cong-tinh-luong-google-sheets.png)
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í | 0đ | 0đ |
| 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. Extensions → Apps Script
- 2. Click icon ⏰ "Triggers" bên trái
- 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
Backup data hàng ngày
Dùng Apps Script tự động copy sang file khác hoặc export PDF định kỳ.
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).
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ủ.
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.
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.
📚 Bài Viết Liên Quan
- Template Google Sheets Báo Cáo Bán Hàng Theo Vùng và Đại Lý 2027: Phân Tích Đa Chiều
- Google Sheets Nâng Cao Bài 9: Bảo Mật, Phân Quyền và Chia Sẻ Chuyên Nghiệp
- Google Sheets Nâng Cao Bài 4: Hàm QUERY - Lọc và Phân Tích Dữ Liệu Chuyên Nghiệp
- Template Google Sheets Quản Lý Phòng Khám và Bệnh Viện Nhỏ 2027
Chia sẻ bài viết:
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.