Google Sheets Nâng Cao Bài 3: IMPORTRANGE Và Kết Nối Dữ Liệu Nhiều Sheets

Google Sheets Nâng Cao Bài 3: IMPORTRANGE Và Kết Nối Dữ Liệu Nhiều Sheets
Trong hai bài trước, chúng ta đã học cách kiểm soát dữ liệu nhập vào (Data Validation) và trực quan hóa dữ liệu (Conditional Formatting). Bài học thứ 3 này sẽ giải quyết một thách thức rất thực tế: làm sao kết nối và tổng hợp dữ liệu từ nhiều spreadsheets khác nhau.
Hàm IMPORTRANGE là công cụ độc đáo của Google Sheets (không có trong Excel) cho phép kéo dữ liệu từ một spreadsheet khác về. Kết hợp với QUERY, FILTER, và các hàm khác, IMPORTRANGE mở ra khả năng xây dựng hệ thống báo cáo tập trung từ nhiều nguồn dữ liệu phân tán.
1. IMPORTRANGE Cơ Bản
Cú pháp
=IMPORTRANGE(spreadsheet_url, range_string)
// spreadsheet_url: URL của file Google Sheets nguồn
// Có thể là URL đầy đủ hoặc chỉ spreadsheet ID
// range_string: Vùng ô cần import, dạng text "SheetName!A1:Z100"
Ví dụ cơ bản nhất
// Import toàn bộ sheet "DonHang" từ file khác
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit",
"DonHang!A1:Z1000")
// Hoặc dùng chỉ Spreadsheet ID (phần sau /d/ và trước /edit)
=IMPORTRANGE("1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
"DonHang!A1:Z1000")
Lưu URL trong ô riêng (best practice)
// Ô A1: Chứa URL file nguồn
// A1 = "https://docs.google.com/spreadsheets/d/1BxiM.../edit"
// Trong ô B1 dùng IMPORTRANGE:
=IMPORTRANGE($A$1, "DonHang!A1:Z1000")
// Lợi ích:
// - Thay URL một lần trong A1 → tất cả IMPORTRANGE cập nhật
// - Dễ quản lý khi có nhiều IMPORTRANGE từ cùng file
IMPORTRANGE cho cả cột (không giới hạn hàng)
// Import toàn bộ cột A đến E, không giới hạn số hàng
=IMPORTRANGE("spreadsheet_id", "Sheet1!A:E")
// Tuy nhiên: import cả cột rất chậm nếu file lớn
// Nên giới hạn hàng: "Sheet1!A1:E5000"
2. Quyền Chia Sẻ Và Xác Thực
IMPORTRANGE yêu cầu tài khoản Google của bạn phải có quyền truy cập vào file nguồn. Đây là điểm quan trọng cần hiểu.
Quy trình xác thực lần đầu
- Nhập công thức IMPORTRANGE vào ô
- Ô hiển thị #REF! error với thông báo "You need to connect these sheets"
- Hover chuột vào ô → Nhấn "Allow access"
- Sau khi xác thực, dữ liệu bắt đầu load (có thể mất vài giây)
- Xác thực chỉ cần làm một lần cho mỗi cặp spreadsheet
Quyền truy cập cần thiết
| Tình huống | Quyền cần thiết trên file nguồn | IMPORTRANGE hoạt động? |
|---|---|---|
| Bạn là chủ file | Owner | Có |
| Được share Edit | Editor | Có |
| Được share View | Viewer | Có |
| File public "Anyone with link" | Public Viewer | Có |
| File private, không được share | Không có | Không (#REF! error) |
Chiến lược chia sẻ dữ liệu an toàn
// Tình huống: Nhiều chi nhánh gửi dữ liệu về báo cáo tổng
// Giải pháp an toàn:
// 1. Mỗi chi nhánh: File riêng, chỉ share với manager + HQ
// 2. File báo cáo tổng: HQ dùng IMPORTRANGE từ các file chi nhánh
// 3. File chi nhánh: Share view-only cho file báo cáo tổng
// Cấu trúc permission:
// Chi nhánh A file: Owner=staff_A, Viewer=hq@company.com
// Chi nhánh B file: Owner=staff_B, Viewer=hq@company.com
// Báo cáo tổng: dùng account hq@company.com → IMPORTRANGE từ A và B
Lỗi #REF! và cách xử lý
// Các nguyên nhân #REF! error:
// 1. Chưa xác thực (Allow access) → Click allow
// 2. Không có quyền truy cập → Xin quyền view
// 3. Sai URL → Kiểm tra lại URL
// 4. Sai tên sheet → Kiểm tra tên sheet có dấu cách/ký tự đặc biệt
// 5. Range ngoài bounds → Kiểm tra vùng import có tồn tại không
// Sai tên sheet có dấu cách:
// SAI: "Đơn Hàng!A1:Z100" → cần dấu nháy đơn
// ĐÚNG: "'Đơn Hàng'!A1:Z100"
// Dùng IFERROR để xử lý gracefully:
=IFERROR(IMPORTRANGE("url", "Sheet!A1:Z100"), "Đang tải dữ liệu...")
3. Kết Hợp IMPORTRANGE + QUERY
Sức mạnh thực sự của IMPORTRANGE nằm ở việc kết hợp với QUERY để lọc, sắp xếp và tổng hợp dữ liệu ngay trong quá trình import.
Cú pháp kết hợp
=QUERY(IMPORTRANGE("spreadsheet_url", "Sheet!A:Z"),
"SELECT Col1, Col2, Col5 WHERE Col3 = 'Hoàn thành' ORDER BY Col1 DESC",
1)
// Tham số thứ 3 của QUERY: số hàng header (0 hoặc 1)
// IMPORTRANGE + QUERY: Cột dùng "Col1", "Col2"... (không phải A, B)
Ví dụ 1: Import chỉ đơn hàng hoàn thành
// File nguồn có sheet "DonHang" với cấu trúc:
// Col1=Mã đơn, Col2=Khách hàng, Col3=Trạng thái, Col4=Tổng tiền, Col5=Ngày
=QUERY(
IMPORTRANGE("source_id", "DonHang!A:E"),
"SELECT Col1, Col2, Col4, Col5
WHERE Col3 = 'Hoàn thành'
ORDER BY Col5 DESC
LIMIT 100",
1
)
Ví dụ 2: Tổng hợp doanh số theo nhân viên
// Import và GROUP BY nhân viên
=QUERY(
IMPORTRANGE("source_id", "DonHang!A:F"),
"SELECT Col5, SUM(Col4), COUNT(Col1)
WHERE Col3 = 'Hoàn thành'
GROUP BY Col5
ORDER BY SUM(Col4) DESC
LABEL Col5 'Nhân viên', SUM(Col4) 'Doanh số', COUNT(Col1) 'Số đơn'",
1
)
Ví dụ 3: Lọc theo khoảng ngày
// Import dữ liệu tháng 11/2026
=QUERY(
IMPORTRANGE("source_id", "DonHang!A:E"),
"SELECT * WHERE Col5 >= date '2026-11-01' AND Col5 <= date '2026-11-30'",
1
)
// Lọc theo ngày động (tháng hiện tại):
// Không thể dùng TODAY() trực tiếp trong QUERY string
// Phải nối chuỗi:
=QUERY(
IMPORTRANGE("source_id", "DonHang!A:E"),
"SELECT * WHERE Col5 >= date '" & TEXT(EOMONTH(TODAY(),-1)+1,"yyyy-MM-dd") &
"' AND Col5 <= date '" & TEXT(TODAY(),"yyyy-MM-dd") & "'",
1
)
Ví dụ 4: Kết hợp nhiều điều kiện phức tạp
=QUERY(
IMPORTRANGE("source_id", "Sales!A:H"),
"SELECT Col1, Col2, Col4, Col5, Col7
WHERE Col3 = 'Hoàn thành'
AND Col6 >= 1000000
AND Col8 != 'Online'
AND Col4 CONTAINS 'Hà Nội'
ORDER BY Col5 DESC, Col6 DESC
LIMIT 50
OFFSET 0",
1
)
4. Kết Hợp IMPORTRANGE + FILTER
FILTER linh hoạt hơn QUERY khi cần điều kiện động (tham chiếu đến ô khác trên sheet).
Cú pháp cơ bản
// Lọc dữ liệu import theo giá trị trong ô B1 (dropdown filter)
=FILTER(
IMPORTRANGE("source_id", "Sheet!A:E"),
IMPORTRANGE("source_id", "Sheet!C:C") = B1
)
// Lưu ý: Cần IMPORTRANGE riêng cho điều kiện lọc
// Có thể dùng cùng một lần IMPORTRANGE trong LET:
=LET(
data, IMPORTRANGE("source_id", "Sheet!A:E"),
FILTER(data, INDEX(data,,3) = B1)
)
Ví dụ: Bảng tìm kiếm theo nhân viên
// B1: Dropdown chọn tên nhân viên
// B2 trở xuống: Hiện đơn hàng của nhân viên đó
// Cách 1: FILTER đơn giản
=FILTER(
IMPORTRANGE("source_id", "DonHang!A:F"),
IMPORTRANGE("source_id", "DonHang!E:E") = $B$1
)
// Cách 2: FILTER với nhiều điều kiện
=FILTER(
IMPORTRANGE("source_id", "DonHang!A:F"),
(IMPORTRANGE("source_id", "DonHang!E:E") = $B$1) *
(IMPORTRANGE("source_id", "DonHang!C:C") = "Hoàn thành")
)
// * = AND, + = OR trong FILTER conditions
Ví dụ: Tìm kiếm full-text
// B1: Ô tìm kiếm (người dùng gõ vào)
// Tìm khách hàng chứa chuỗi gõ vào
=IFERROR(
FILTER(
IMPORTRANGE("source_id", "KhachHang!A:D"),
REGEXMATCH(
LOWER(IMPORTRANGE("source_id", "KhachHang!B:B")),
LOWER($B$1)
)
),
"Không tìm thấy kết quả"
)
5. IMPORTRANGE Từ Nhiều Files
Tổng hợp từ nhiều chi nhánh
// Cách 1: Dùng VSTACK (Google Sheets 2022+) để stack dọc
=VSTACK(
IMPORTRANGE("chi_nhanh_A_id", "DonHang!A2:E1000"),
IMPORTRANGE("chi_nhanh_B_id", "DonHang!A2:E1000"),
IMPORTRANGE("chi_nhanh_C_id", "DonHang!A2:E1000")
)
// Cách 2: { } array literal để ghép
={
IMPORTRANGE("chi_nhanh_A_id", "DonHang!A2:E1000");
IMPORTRANGE("chi_nhanh_B_id", "DonHang!A2:E1000");
IMPORTRANGE("chi_nhanh_C_id", "DonHang!A2:E1000")
}
// Dấu ; để ghép theo chiều dọc (stack rows)
// Dấu , để ghép theo chiều ngang (stack columns)
Tổng hợp + QUERY từ nhiều nguồn
// Gộp 3 chi nhánh rồi QUERY tổng hợp
=QUERY(
VSTACK(
IMPORTRANGE("chi_nhanh_A_id", "DonHang!A:F"),
IMPORTRANGE("chi_nhanh_B_id", "DonHang!A:F"),
IMPORTRANGE("chi_nhanh_C_id", "DonHang!A:F")
),
"SELECT Col2, SUM(Col4), COUNT(Col1)
GROUP BY Col2
ORDER BY SUM(Col4) DESC
LABEL SUM(Col4) 'Tổng doanh số', COUNT(Col1) 'Số đơn'",
0
)
// Header = 0 vì VSTACK không có header
Thêm cột nhận dạng nguồn
// Khi gộp nhiều nguồn, cần biết dữ liệu từ đâu
// Thêm cột "Chi nhánh" vào mỗi IMPORTRANGE
=VSTACK(
// Chi nhánh A: thêm cột "A" vào đầu
HSTACK(
ARRAYFORMULA(REPT("Chi nhánh A", ROWS(IMPORTRANGE("id_A","Sheet!A2:A1000")))),
IMPORTRANGE("id_A", "Sheet!A2:E1000")
),
// Chi nhánh B
HSTACK(
ARRAYFORMULA(REPT("Chi nhánh B", ROWS(IMPORTRANGE("id_B","Sheet!A2:A1000")))),
IMPORTRANGE("id_B", "Sheet!A2:E1000")
)
)
6. Giới Hạn Và Cách Khắc Phục
Các giới hạn quan trọng của IMPORTRANGE
| Giới hạn | Ngưỡng | Cách khắc phục |
|---|---|---|
| Số ô tối đa import | 10 triệu ô/spreadsheet | Lọc chỉ lấy dữ liệu cần thiết |
| Tốc độ cập nhật | Cache 30 phút | Dùng Apps Script trigger cho real-time |
| Số IMPORTRANGE đồng thời | ~50 per spreadsheet | Gộp nhiều range vào 1 IMPORTRANGE |
| File nguồn bị xóa/đổi tên | Break ngay lập tức | Backup URL, không đổi tên sheet |
| Không auto-update khi file nguồn thay đổi | Có delay cache | File menu: Refresh / Apps Script trigger |
Tối ưu hiệu suất IMPORTRANGE
// Thay vì import toàn bộ rồi filter local:
// CHẬM: Import 10000 hàng rồi FILTER local
=FILTER(IMPORTRANGE("id", "Sheet!A:E"), ...)
// NHANH hơn: Dùng QUERY với WHERE để filter trước khi import
=QUERY(IMPORTRANGE("id", "Sheet!A:E"),
"SELECT * WHERE Col3 = 'Hoàn thành' LIMIT 500", 1)
// Thay vì nhiều IMPORTRANGE riêng lẻ:
// CHẬM:
=IMPORTRANGE("id","Sheet!A:A") // ô A1
=IMPORTRANGE("id","Sheet!B:B") // ô B1 (riêng biệt)
=IMPORTRANGE("id","Sheet!C:C") // ô C1 (riêng biệt)
// NHANH hơn: Một IMPORTRANGE duy nhất cho toàn bộ range
=IMPORTRANGE("id","Sheet!A:C") // ô A1 (spill tự động)
Giải pháp thay thế khi IMPORTRANGE không đủ
// Apps Script: Copy dữ liệu thay vì link trực tiếp
function syncDuLieuChiNhanh() {
const sourceId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms';
const targetSS = SpreadsheetApp.getActiveSpreadsheet();
const targetSheet = targetSS.getSheetByName('DuLieuChiNhanhA');
const sourceSS = SpreadsheetApp.openById(sourceId);
const sourceSheet = sourceSS.getSheetByName('DonHang');
const data = sourceSheet.getDataRange().getValues();
targetSheet.clearContents();
targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
console.log('Đã sync ' + data.length + ' hàng lúc ' + new Date());
}
// Đặt trigger chạy mỗi giờ:
// Apps Script → Triggers → Add trigger → syncDuLieuChiNhanh → Time-driven → Every hour
7. Thiết Kế Hệ Thống Sync Dữ Liệu
Kiến trúc Hub-and-Spoke
// Mô hình phổ biến nhất cho SME:
// Spoke files (chi nhánh / bộ phận):
// - Chi nhánh A: file riêng, nhập liệu tại đây
// - Chi nhánh B: file riêng, nhập liệu tại đây
// - Kho tổng: file riêng, quản lý tồn kho
// Hub file (báo cáo tổng):
// - Dùng IMPORTRANGE để kéo từ tất cả Spoke
// - Tổng hợp, phân tích, dashboard
// - Chỉ HQ/quản lý xem
// Ưu điểm:
// - Nhân viên chi nhánh không thấy data chi nhánh khác
// - HQ thấy tất cả trong một file
// - Thêm chi nhánh mới: chỉ thêm IMPORTRANGE mới
Pattern: Master Data + Transaction Data
// File Master Data (dùng chung):
// - Danh sách sản phẩm + giá
// - Danh sách khách hàng
// - Danh sách nhân viên
// - Cấu hình hệ thống
// File Transaction Data (theo tháng/chi nhánh):
// - Đơn hàng tháng 11
// - Kế hoạch giao hàng
// - Báo cáo tồn kho hàng ngày
// File Báo cáo:
// - IMPORTRANGE từ Master + Transaction
// - Dashboard tổng hợp
// - Phân tích xu hướng
Bảo vệ dữ liệu trong hệ thống IMPORTRANGE
// Vấn đề: Ai đó xóa/sửa data ở file nguồn → ảnh hưởng tất cả
// Giải pháp: Protect sheets quan trọng
// Trong file nguồn:
// Data → Protect sheets and ranges
// Chọn sheet "DonHang"
// Chỉ cho admin edit, nhân viên chỉ append (thêm hàng mới)
// Dùng Apps Script để lock hàng đã được xác nhận:
function lockDonHangDaGiao() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();
const protection = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
data.forEach((row, i) => {
if (row[4] === 'Đã giao' && i > 0) { // Cột E = Trạng thái
const range = sheet.getRange(i+1, 1, 1, data[0].length);
const p = range.protect().setDescription('Locked: Đã giao - hàng ' + (i+1));
p.removeEditors(p.getEditors());
p.addEditor('admin@company.com');
}
});
}
8. Ứng Dụng Thực Tế: Hệ Thống Báo Cáo Chuỗi Cửa Hàng
Cấu trúc files
// File 1: "SheetStore - Chi Nhánh Hà Nội" (ID: id_hn)
// Sheet "DonHang": Đơn hàng chi nhánh HN
// Sheet "TonKho": Tồn kho HN
// File 2: "SheetStore - Chi Nhánh HCM" (ID: id_hcm)
// Sheet "DonHang": Đơn hàng chi nhánh HCM
// Sheet "TonKho": Tồn kho HCM
// File 3: "SheetStore - Báo Cáo Tổng" (file của bạn đang làm việc)
// Sheet "Raw_HN": IMPORTRANGE từ HN
// Sheet "Raw_HCM": IMPORTRANGE từ HCM
// Sheet "Dashboard": Tổng hợp và phân tích
// Sheet "KPI": Bảng KPI từng chi nhánh
Sheet "Raw_HN" — import thô từ HN
// Ô A1:
=IFERROR(
IMPORTRANGE(SettingsSheet!B2, "DonHang!A:H"),
"Đang kết nối chi nhánh HN..."
)
// SettingsSheet!B2 chứa ID file HN
Sheet "Dashboard" — tổng hợp
// Doanh số tổng hợp 2 chi nhánh
=QUERY(
VSTACK(
QUERY(Raw_HN!A:H, "SELECT A,B,C,D,E,F,G,H WHERE H='Hoàn thành'",1),
QUERY(Raw_HCM!A:H, "SELECT A,B,C,D,E,F,G,H WHERE H='Hoàn thành'",1)
),
"SELECT Col2, SUM(Col5), COUNT(Col1)
GROUP BY Col2
ORDER BY SUM(Col5) DESC
LABEL Col2 'Chi nhánh', SUM(Col5) 'Doanh số', COUNT(Col1) 'Đơn hàng'",
0
)
KPI tự động so sánh tháng này vs tháng trước
// Lấy doanh số tháng hiện tại
=SUMPRODUCT(
(MONTH(Raw_HN!E2:E1000)=MONTH(TODAY())) *
(YEAR(Raw_HN!E2:E1000)=YEAR(TODAY())) *
(Raw_HN!H2:H1000="Hoàn thành") *
(Raw_HN!F2:F1000)
)
// So sánh % tăng trưởng so tháng trước
=IFERROR(
(thang_nay - thang_truoc) / thang_truoc * 100,
"N/A"
) & "%"
Bài Tập Thực Hành
Bài tập: Hệ thống báo cáo 2 chi nhánh
- Tạo 2 file "Chi nhánh A" và "Chi nhánh B", thêm dữ liệu mẫu
- Tạo file "Báo Cáo Tổng", dùng IMPORTRANGE kéo dữ liệu từ cả 2
- QUERY để hiện top 5 sản phẩm bán chạy nhất tổng 2 chi nhánh
- FILTER để tìm đơn hàng theo tên khách hàng nhập vào ô tìm kiếm
- Dashboard so sánh doanh số 2 chi nhánh theo tháng
Kết Luận
IMPORTRANGE là tính năng độc đáo và mạnh mẽ giúp Google Sheets vượt xa Excel trong môi trường cộng tác. Với IMPORTRANGE kết hợp QUERY và FILTER, bạn có thể xây dựng hệ thống báo cáo tập trung chuyên nghiệp mà không cần lập trình hay mua phần mềm BI đắt tiền.
Đây là bài cuối trong series Google Sheets Nâng Cao cơ bản. Các bài tiếp theo sẽ đi vào chủ đề chuyên sâu hơn: Apps Script, Macro automation, và tích hợp với API.
Xem Lại Series
Giải Pháp Quản Lý Bán Hàng Chuyên Nghiệp
Nếu bạn cần giải pháp quản lý bán hàng tích hợp hơn mà không phải tự xây dựng từ đầu, hãy khám phá SheetStore — phần mềm quản lý bán hàng xây dựng trên nền tảng Google Sheets, đã tích hợp sẵn IMPORTRANGE, dashboard và tự động hóa báo cáo.
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.