Hướng dẫn

Huong Dan Nhap Lieu Hang Loat Vao Google Sheets: Import CSV, Excel va API 2026

Tuân HoangTuân Hoang
27 tháng 2, 2026
Cập nhật: 25 tháng 3, 2026
14 phút đọc
Huong Dan Nhap Lieu Hang Loat Vao Google Sheets: Import CSV, Excel va API 2026

Ban dang mat nhieu gio nhap tay tung dong du lieu vao Google Sheets? Co cach nhanh hon nhieu — import hang loat chi trong vai phut.

Huong dan day du 2026: import CSV, Excel, dung ham IMPORTDATA, IMPORTRANGE, Google Sheets API, Apps Script — kem xu ly trung lap, kiem tra du lieu va tu dong hoa lich trinh import.

1. Tai Sao Can Import Du Lieu Hang Loat?

Nhap lieu thu cong la mot trong nhung cong viec ton thoi gian nhat ma cac doanh nghiep Viet Nam dang thuc hien moi ngay. Khao sat tu 200 doanh nghiep vua va nho cho thay:

4.2h

Trung binh nhan vien mat de nhap lieu/ngay

3.5%

Ty le sai sot khi nhap lieu thu cong

-90%

Giam thoi gian khi dung import tu dong

0.1%

Ty le sai sot khi import tu dong

Cac truong hop can import hang loat pho bien nhat:

  • Chuyen he thong: Di chuyen du lieu tu phan mem cu (Excel, KiotViet, Sapo) sang Google Sheets hoac phan mem moi
  • Dong bo hang ngay: Import don hang tu san TMDT (Shopee, Lazada) ve Sheets tong hop
  • Bao cao dinh ky: Import du lieu tu nhieu nguon (ngan hang, van chuyen, CRM) de tong hop bao cao
  • Du lieu san pham: Cap nhat gia, ton kho, mo ta san pham cho hang tram/ngan SKU
  • Du lieu khach hang: Import danh sach khach hang tu CRM, email marketing, form dang ky

2. Import File CSV/TSV Vao Google Sheets

CSV (Comma-Separated Values) la dinh dang pho bien nhat de trao doi du lieu giua cac he thong. Gan nhu moi phan mem quan ly deu co tinh nang xuat CSV. Google Sheets ho tro import CSV theo nhieu cach:

Cach 1: Upload Truc Tiep (Giao Dien Web)

  1. Mo Google Sheets, click File tren menu
  2. Chon Import (hoac "Nhap")
  3. Chon tab Upload va keo tha file CSV vao
  4. Cau hinh tuy chon import:
    • Import location: Replace spreadsheet / Insert new sheet / Replace data at selected cell / Append to current sheet
    • Separator type: Detect automatically / Comma / Semicolon / Tab / Custom
    • Convert text to numbers, dates: Nen bat de Google tu dong nhan dien kieu du lieu
  5. Click Import data

Luu y quan trong khi import CSV:

  • File CSV cua Viet Nam thuong dung encoding UTF-8 hoac ANSI. Neu bi loi tieng Viet, thu doi encoding thanh UTF-8-BOM
  • Dau phan cach (separator) co the la dau phay (,) hoac dau cham phay (;) tuy theo cau hinh he dieu hanh
  • Khi import "Append to current sheet", Google Sheets them vao cuoi — khong kiem tra trung lap tu dong
  • File CSV toi da 5MB khi upload truc tiep — file lon hon can dung API hoac Apps Script

Cach 2: Import CSV Bang Apps Script (Tu Dong Hoa)

// Ham import CSV tu Google Drive vao Sheets
function importCSVFromDrive() {
  // Tim file CSV trong Google Drive theo ten
  const files = DriveApp.getFilesByName('don-hang-hom-nay.csv')

  if (!files.hasNext()) {
    Logger.log('Khong tim thay file CSV')
    return
  }

  const file = files.next()
  const csvContent = file.getBlob().getDataAsString('UTF-8')

  // Parse CSV thu cong (xu ly dau phay trong dau ngoac kep)
  const rows = parseCSV(csvContent)

  // Ghi vao sheet
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Don Hang')
  const lastRow = sheet.getLastRow()

  // Them tu dong vao cuoi (bo dong header - rows[0])
  if (rows.length > 1) {
    const dataRows = rows.slice(1) // Bo header
    sheet.getRange(lastRow + 1, 1, dataRows.length, dataRows[0].length)
         .setValues(dataRows)
    Logger.log('Da import ' + dataRows.length + ' dong')
  }
}

// Ham parse CSV xu ly dau phay trong dau ngoac kep
function parseCSV(csvText) {
  const rows = []
  const lines = csvText.split('
')

  for (const line of lines) {
    if (line.trim() === '') continue
    const row = []
    let current = ''
    let inQuotes = false

    for (let i = 0; i < line.length; i++) {
      const char = line[i]

      if (char === '"') {
        inQuotes = !inQuotes
      } else if (char === ',' && !inQuotes) {
        row.push(current.trim())
        current = ''
      } else {
        current += char
      }
    }
    row.push(current.trim())
    rows.push(row)
  }

  return rows
}

Cach 3: Import CSV Truc Tiep Tu URL

Neu file CSV cua ban duoc host tren URL cong khai (vi du: S3, server rieng), ban co the import truc tiep bang ham =IMPORTDATA() hoac Apps Script:

// Import CSV tu URL bang Apps Script
function importCSVFromURL() {
  const csvUrl = 'https://example.com/exports/inventory-daily.csv'

  const response = UrlFetchApp.fetch(csvUrl, {
    headers: { 'Authorization': 'Bearer ' + getApiToken() }
  })

  const csvContent = response.getContentText('UTF-8')
  const rows = parseCSV(csvContent)

  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Ton Kho')

  // Xoa du lieu cu truoc khi import moi
  const lastRow = sheet.getLastRow()
  if (lastRow > 1) {
    sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()).clearContent()
  }

  // Ghi du lieu moi (bo header)
  if (rows.length > 1) {
    sheet.getRange(2, 1, rows.length - 1, rows[0].length)
         .setValues(rows.slice(1))
  }

  SpreadsheetApp.getActiveSpreadsheet().toast(
    'Import thanh cong ' + (rows.length - 1) + ' san pham',
    'Hoan thanh',
    5
  )
}

3. Import File Excel (.xlsx) Vao Google Sheets

Excel va Google Sheets co nhieu diem tuong dong nhung cung co khac biet quan trong khi chuyen doi. Day la cac cach import Excel hieu qua:

Cach 1: Upload File .xlsx Truc Tiep

Cach don gian nhat: keo tha file .xlsx vao Google Drive. Google Drive tu dong chuyen doi sang Google Sheets. Hoac trong Google Sheets, dung File > Import > Upload va chon file .xlsx.

Nhung thu duoc va khong duoc giu khi chuyen doi Excel sang Sheets:

Duoc giu lai:

  • Du lieu, cong thuc co ban
  • Dinh dang cell (mau, font, border)
  • Nhieu sheet
  • Named ranges
  • Charts co ban

Khong duoc giu:

  • VBA Macros
  • Mot so ham Excel dac trung
  • ActiveX controls
  • Mot so pivot table phuc tap
  • Slicers

Cach 2: Dung Apps Script Import Excel Tu Drive

// Chuyen doi va import file Excel tu Drive
function importExcelFromDrive(excelFileName) {
  // Tim file Excel trong Drive
  const files = DriveApp.getFilesByName(excelFileName || 'bao-cao.xlsx')
  if (!files.hasNext()) {
    throw new Error('Khong tim thay file: ' + excelFileName)
  }

  const excelFile = files.next()

  // Chuyen doi sang Google Sheets tam thoi
  const tempSheets = Drive.Files.copy(
    { title: 'temp_import_' + Date.now(), mimeType: 'application/vnd.google-apps.spreadsheet' },
    excelFile.getId()
  )

  const tempSpreadsheet = SpreadsheetApp.openById(tempSheets.id)
  const sourceSheet = tempSpreadsheet.getSheets()[0]
  const sourceData = sourceSheet.getDataRange().getValues()

  // Copy du lieu sang sheet dich
  const targetSheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Du Lieu Import') ||
    SpreadsheetApp.getActiveSpreadsheet().insertSheet('Du Lieu Import')

  targetSheet.clearContents()
  if (sourceData.length > 0) {
    targetSheet.getRange(1, 1, sourceData.length, sourceData[0].length)
               .setValues(sourceData)
  }

  // Xoa file tam
  DriveApp.getFileById(tempSheets.id).setTrashed(true)

  Logger.log('Da import ' + sourceData.length + ' dong tu ' + excelFileName)
  return sourceData.length
}

4. Ham IMPORTDATA: Lay Du Lieu Tu URL

Ham =IMPORTDATA(url) la cach don gian nhat de import du lieu CSV hoac TSV tu mot URL cong khai vao Google Sheets. Ham nay tu dong lam moi du lieu moi khi ban mo spreadsheet.

Cu Phap Va Vi Du

// Cu phap co ban
=IMPORTDATA("https://example.com/data.csv")

// Import du lieu ty gia ngoai te tu API cong khai
=IMPORTDATA("https://open.er-api.com/v6/latest/USD")

// Import du lieu thoi tiet (neu API tra CSV)
=IMPORTDATA("https://api.weather.com/data?format=csv&city=hanoi")

// Import voi encoding parameter (mot so URL ho tro)
=IMPORTDATA("https://example.com/data.csv?encoding=utf8")

Gioi han cua IMPORTDATA:

  • Chi lam viec voi URL cong khai (khong can authentication)
  • Du lieu tu dong lam moi — khong the lich trinh gio cu the
  • Gioi han 1000 dong du lieu
  • Cham hon so voi import truc tiep
  • Khong xu ly duoc JSON (chi CSV/TSV)

Truong Hop Thuc Te: Import Gia Vang Tu API

// Import gia vang SJC tu nguon cong khai
// (dat o cell A1 cua sheet "Gia Vang")
=IMPORTDATA("https://sjc.com.vn/GoldPrice/Index.aspx?format=csv")

// Import ty gia tu NHNN
=IMPORTDATA("https://www.vietcombank.com.vn/api/exchangerates?format=csv")

// Ket hop voi ham de xu ly du lieu
=INDEX(IMPORTDATA("https://example.com/prices.csv"),2,3)
// Lay gia tri o dong 2, cot 3 cua CSV

5. Ham IMPORTRANGE: Ket Noi Nhieu Spreadsheet

Ham =IMPORTRANGE() cho phep lay du lieu tu mot Google Sheets khac vao spreadsheet hien tai. Day la tinh nang rat manh de tao bao cao tong hop tu nhieu nguon.

Cu Phap

// Cu phap co ban
=IMPORTRANGE("spreadsheet_id_hoac_url", "sheet_name!range")

// Vi du 1: Import toan bo du lieu tu Sheet1
=IMPORTRANGE("1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms", "Sheet1!A:Z")

// Vi du 2: Import vung cu the
=IMPORTRANGE("1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms", "Don Hang!A2:F1000")

// Vi du 3: Import voi URL day du
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1BxiMVs0.../edit", "Ton Kho!A:E")

// Ket hop voi QUERY de loc du lieu truoc khi import
=QUERY(IMPORTRANGE("spreadsheet_id", "Sheet1!A:F"),
       "SELECT Col1, Col2, Col4 WHERE Col3 = 'Ha Noi'")

Use Case: Bao Cao Tong Hop Tu Nhieu Cua Hang

Mot doanh nghiep co 3 cua hang, moi cua hang dung 1 Google Sheets rieng. De tao bao cao tong hop, tao them 1 spreadsheet "Dashboard" va dung IMPORTRANGE:

// Sheet "Dashboard Tong Hop" - lay doanh thu 3 cua hang
// Cot A: Ma don hang, Cot B: Doanh thu, Cot C: Cua hang

// Cua hang 1
=IMPORTRANGE("id_cua_hang_1", "Doanh Thu!A2:C")

// Cua hang 2 - dat o dong tiep theo sau cua hang 1
// Dung OFFSET hoac QUERY de sap xep dong

// Gop 3 cua hang bang QUERY + IMPORTRANGE
=QUERY({
  IMPORTRANGE("id_cua_hang_1", "Doanh Thu!A2:C");
  IMPORTRANGE("id_cua_hang_2", "Doanh Thu!A2:C");
  IMPORTRANGE("id_cua_hang_3", "Doanh Thu!A2:C")
}, "SELECT * ORDER BY Col2 DESC")

Luu y khi dung IMPORTRANGE:

  • Lan dau dung, can cap quyen truy cap bang cach click "Allow access"
  • Nguoi tao ham phai co quyen Edit tren spreadsheet nguon
  • Du lieu cap nhat theo thoi gian thuc khi spreadsheet nguon thay doi
  • Nhieu IMPORTRANGE trong cung mot file co the lam cham spreadsheet
  • Gioi han: 50 ham IMPORTRANGE moi spreadsheet

6. Ham IMPORTHTML va IMPORTFEED

Ngoai IMPORTDATA va IMPORTRANGE, Google Sheets con co hai ham import manh khac:

IMPORTHTML — Lay Du Lieu Tu Bang HTML Tren Web

// Cu phap: =IMPORTHTML(url, query, index)
// query: "table" hoac "list"
// index: vi tri cua bang thu may (bat dau tu 1)

// Import bang ty gia ngoai te tu website ngan hang
=IMPORTHTML("https://www.vietcombank.com.vn/exchangerates", "table", 1)

// Import danh sach (ul/ol) tu trang web
=IMPORTHTML("https://example.com/products", "list", 2)

// Ket hop voi ham de lay du lieu cu the
=INDEX(IMPORTHTML("https://tygia.com/ngoai-te", "table", 1), 3, 2)
// Lay gia tri dong 3, cot 2 tu bang dau tien

IMPORTFEED — Import RSS/Atom Feed

// Import tin tuc tu RSS feed
=IMPORTFEED("https://vnexpress.net/rss/kinh-doanh.rss", "items", TRUE, 10)
// Tham so: url, query, headers, num_items

// Lay chi tieu de cua tin tuc gan nhat
=IMPORTFEED("https://cafef.vn/thi-truong-chung-khoan.rss", "items title", FALSE, 20)

// Lay URL cua tin tuc
=IMPORTFEED("https://cafef.vn/thi-truong-chung-khoan.rss", "items url", FALSE, 10)

7. Google Sheets API: Import Bang Lap Trinh

Khi can import du lieu tu ung dung khac vao Google Sheets theo chuong trinh, Google Sheets API v4 la cong cu chinh. API nay cho phep doc, ghi, cap nhat du lieu bat ky luc nao.

Thiet Lap Google Sheets API

  1. Vao Google Cloud Console (console.cloud.google.com)
  2. Tao project moi hoac chon project hien tai
  3. Kich hoat Google Sheets API va Google Drive API
  4. Tao Service Account (cho server-to-server) hoac OAuth 2.0 (cho ung dung nguoi dung)
  5. Chia se Google Sheets voi email cua Service Account

Import Du Lieu Bang Node.js

// Cai dat: npm install googleapis
import { google } from 'googleapis'
import { JWT } from 'google-auth-library'

// Xac thuc bang Service Account
const auth = new JWT({
  email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\n/g, '
'),
  scopes: ['https://www.googleapis.com/auth/spreadsheets'],
})

const sheets = google.sheets({ version: 'v4', auth })

// Ham append du lieu vao sheets (them vao cuoi)
async function appendDataToSheet(
  spreadsheetId: string,
  sheetName: string,
  data: any[][]
) {
  const range = sheetName + '!A:Z'

  await sheets.spreadsheets.values.append({
    spreadsheetId,
    range,
    valueInputOption: 'USER_ENTERED', // Nhan dien cong thuc va dinh dang
    insertDataOption: 'INSERT_ROWS',
    requestBody: {
      values: data,
    },
  })

  console.log('Da append ' + data.length + ' dong vao ' + sheetName)
}

// Ham ghi de du lieu (replace)
async function writeDataToSheet(
  spreadsheetId: string,
  sheetName: string,
  data: any[][],
  startRow: number = 1
) {
  const range = sheetName + '!A' + startRow

  await sheets.spreadsheets.values.update({
    spreadsheetId,
    range,
    valueInputOption: 'USER_ENTERED',
    requestBody: {
      values: data,
    },
  })
}

// Su dung
const SPREADSHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'

// Import don hang tu database vao Sheets
const orders = await db.orders.findMany({
  where: { createdAt: { gte: startOfDay } },
  orderBy: { createdAt: 'desc' }
})

const rows = orders.map(o => [
  o.id, o.customerName, o.total, o.status,
  o.createdAt.toLocaleDateString('vi-VN')
])

await appendDataToSheet(SPREADSHEET_ID, 'Don Hang', rows)

Batch Update — Import Nhieu Vung Cung Luc

// Batch update: cap nhat nhieu vung trong 1 API call
// Hieu qua hon khi can update nhieu sheet cung luc
async function batchUpdateSheets(
  spreadsheetId: string,
  updates: Array<{ range: string; values: any[][] }>
) {
  const data = updates.map(u => ({
    range: u.range,
    values: u.values,
  }))

  await sheets.spreadsheets.values.batchUpdate({
    spreadsheetId,
    requestBody: {
      valueInputOption: 'USER_ENTERED',
      data,
    },
  })

  console.log('Batch update ' + updates.length + ' vung thanh cong')
}

// Vi du su dung batch update
await batchUpdateSheets(SPREADSHEET_ID, [
  { range: 'Ton Kho!A2:C500', values: inventoryData },
  { range: 'Doanh Thu!A2:E100', values: revenueData },
  { range: 'Khach Hang!A2:G200', values: customerData },
])

8. Apps Script: Import Tu CSV, JSON, Database

Google Apps Script chay truc tiep trong Google Sheets, khong can server rieng. Day la cong cu manh nhat de tu dong hoa import du lieu dinh ky.

Import Du Lieu JSON Tu API

// Import don hang tu API JSON
function importOrdersFromAPI() {
  const apiUrl = 'https://api.myshop.com/orders'
  const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY')

  // Lay don hang trong 24h qua
  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)
  const isoDate = yesterday.toISOString()

  const response = UrlFetchApp.fetch(
    apiUrl + '?since=' + isoDate + '&limit=500',
    {
      headers: {
        'Authorization': 'Bearer ' + apiKey,
        'Content-Type': 'application/json'
      },
      muteHttpExceptions: true
    }
  )

  if (response.getResponseCode() !== 200) {
    Logger.log('Loi API: ' + response.getContentText())
    return
  }

  const data = JSON.parse(response.getContentText())
  const orders = data.orders || data.data || data

  if (!orders || orders.length === 0) {
    Logger.log('Khong co don hang moi')
    return
  }

  // Chuyen JSON sang mang 2 chieu
  const rows = orders.map(order => [
    order.id,
    order.customer_name,
    order.customer_phone,
    order.total_amount,
    order.status,
    order.items?.length || 0,
    new Date(order.created_at).toLocaleDateString('vi-VN'),
    order.payment_method
  ])

  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Don Hang API') ||
    SpreadsheetApp.getActiveSpreadsheet().insertSheet('Don Hang API')

  // Them header neu sheet trong
  if (sheet.getLastRow() === 0) {
    sheet.appendRow(['Ma Don', 'Khach Hang', 'SDT', 'Tong Tien', 'Trang Thai',
                     'So SP', 'Ngay Dat', 'Thanh Toan'])
  }

  // Append du lieu moi
  rows.forEach(row => sheet.appendRow(row))

  Logger.log('Da import ' + rows.length + ' don hang moi')
  SpreadsheetApp.getActiveSpreadsheet().toast(
    'Import ' + rows.length + ' don hang thanh cong!', 'API Import', 5
  )
}

Import Tu Google Form Responses

// Xu ly du lieu khi co submission tu Google Form
// Gan trigger onFormSubmit trong Form editor

function onFormSubmit(e) {
  const responses = e.values // Mang gia tri cac cau tra loi
  const timestamp = responses[0] // Cot dau tien luon la timestamp

  // Lay sheet xu ly don hang
  const sheet = SpreadsheetApp.openById('SPREADSHEET_ID')
    .getSheetByName('Xu Ly')

  // Xu ly va chuyen dinh dang truoc khi luu
  const processedRow = [
    timestamp,
    responses[1], // Ho ten
    responses[2], // SDT
    responses[3], // San pham
    parseInt(responses[4]) || 1, // So luong (default 1)
    parseFloat(responses[5]?.replace(/[.,]/g, '')) || 0, // Gia
    'Moi', // Trang thai mac dinh
    generateOrderId() // Tao ma don tu dong
  ]

  sheet.appendRow(processedRow)

  // Gui email xac nhan cho khach
  GmailApp.sendEmail(
    responses[6], // Email khach hang
    'Xac nhan don hang #' + processedRow[7],
    'Cam on ban da dat hang! Ma don cua ban: ' + processedRow[7]
  )
}

function generateOrderId() {
  const date = new Date()
  const prefix = 'DH'
  const dateStr = date.getFullYear().toString().slice(-2) +
    String(date.getMonth() + 1).padStart(2, '0') +
    String(date.getDate()).padStart(2, '0')
  const random = Math.floor(Math.random() * 9000 + 1000)
  return prefix + dateStr + random
}

9. Xu Ly Trung Lap Va Kiem Tra Du Lieu Sau Import

Mot trong nhung van de lon nhat khi import du lieu la trung lap. Neu ban import moi ngay, cac don hang cu co the bi import nhieu lan. Day la cac cach xu ly:

Cach 1: Kiem Tra Trung Lap Bang Ham Sheets

// Them cot "Trung lap" ben canh du lieu import
// Cot A: Ma don hang, kiem tra trong cot A cua sheet chinh

// Cong thuc kiem tra trung lap (dat o cot kiem tra)
=COUNTIF('Du Lieu Chinh'!$A:$A, A2) > 1

// Loc ra cac dong khong trung lap
=FILTER(A2:F100, COUNTIF(A2:A100, A2:A100) = 1)

// Dung UNIQUE de loai bo trung lap
=UNIQUE(A2:F100)

// Dem so ban ghi trung lap
=SUMPRODUCT((COUNTIF(A2:A100,A2:A100)>1)*1)

Cach 2: Xu Ly Trung Lap Bang Apps Script

// Loai bo trung lap truoc khi append du lieu moi
function appendWithDeduplicate(
  sheet,
  newData,
  keyColumnIndex = 0 // Chi so cot khoa chinh (0 = cot A)
) {
  // Lay tat ca gia tri hien co cua cot khoa chinh
  const lastRow = sheet.getLastRow()
  const existingKeys = new Set()

  if (lastRow > 1) {
    const existingData = sheet.getRange(2, keyColumnIndex + 1, lastRow - 1, 1)
                              .getValues()
    existingData.forEach(row => existingKeys.add(String(row[0])))
  }

  // Loc ra cac dong chua ton tai
  const uniqueRows = newData.filter(row => {
    const key = String(row[keyColumnIndex])
    if (existingKeys.has(key)) return false
    existingKeys.add(key) // Them vao set de tranh trung lap trong batch moi
    return true
  })

  if (uniqueRows.length === 0) {
    Logger.log('Khong co du lieu moi (tat ca da ton tai)')
    return 0
  }

  // Append cac dong unique
  sheet.getRange(sheet.getLastRow() + 1, 1, uniqueRows.length, uniqueRows[0].length)
       .setValues(uniqueRows)

  Logger.log('Da them ' + uniqueRows.length + ' dong moi, bo qua ' +
    (newData.length - uniqueRows.length) + ' ban ghi trung lap')
  return uniqueRows.length
}

Kiem Tra Chat Luong Du Lieu Sau Import

// Kiem tra toan ven du lieu sau import
function validateImportedData(sheet) {
  const data = sheet.getDataRange().getValues()
  const headers = data[0]
  const errors = []

  for (let i = 1; i < data.length; i++) {
    const row = data[i]
    const rowNum = i + 1

    // Kiem tra truong bat buoc
    if (!row[0] || row[0] === '') {
      errors.push('Dong ' + rowNum + ': Thieu ma don hang')
    }

    // Kiem tra so tien hop le
    if (isNaN(row[3]) || row[3] < 0) {
      errors.push('Dong ' + rowNum + ': So tien khong hop le (' + row[3] + ')')
    }

    // Kiem tra dinh dang ngay
    if (row[6] && !(row[6] instanceof Date) && isNaN(Date.parse(row[6]))) {
      errors.push('Dong ' + rowNum + ': Ngay khong hop le (' + row[6] + ')')
    }

    // Kiem tra so dien thoai (Viet Nam)
    if (row[2] && !/^(0[3-9]d{8}|(+84)[3-9]d{8})$/.test(row[2])) {
      errors.push('Dong ' + rowNum + ': SDT khong dung dinh dang (' + row[2] + ')')
    }
  }

  if (errors.length > 0) {
    Logger.log('Phat hien ' + errors.length + ' loi:')
    errors.forEach(e => Logger.log('  - ' + e))
  } else {
    Logger.log('Tat ca du lieu hop le!')
  }

  return errors
}

10. Chien Luoc Hop Nhat (Merge) Du Lieu

Khi import du lieu moi, doi khi ban muon cap nhat record hien co thay vi tao moi. Day la cac chien luoc merge pho bien:

Chien luoc Mo ta Dung khi
Insert Only Chi them moi, bo qua trung lap Log, lich su giao dich
Upsert Them moi neu chua co, cap nhat neu da co Ton kho, thong tin san pham
Replace All Xoa het va ghi lai toan bo Bao cao cuoi ngay, snapshot
Append Only Luon them moi, ke ca trung lap Raw data, audit log
Merge Fields Chi cap nhat mot so cot cu the Cap nhat trang thai, gia
// Upsert: them moi neu chua co, cap nhat neu da co
function upsertData(sheet, newData, keyColumnIndex = 0) {
  const lastRow = sheet.getLastRow()
  const headerRow = 1

  // Tao map: key -> so dong
  const keyToRowMap = {}
  if (lastRow > headerRow) {
    const existingKeys = sheet.getRange(
      headerRow + 1, keyColumnIndex + 1,
      lastRow - headerRow, 1
    ).getValues()

    existingKeys.forEach((row, idx) => {
      keyToRowMap[String(row[0])] = idx + headerRow + 1
    })
  }

  const rowsToInsert = []

  for (const newRow of newData) {
    const key = String(newRow[keyColumnIndex])

    if (keyToRowMap[key]) {
      // Cap nhat dong hien co
      const targetRow = keyToRowMap[key]
      sheet.getRange(targetRow, 1, 1, newRow.length).setValues([newRow])
    } else {
      // Them vao danh sach insert
      rowsToInsert.push(newRow)
      keyToRowMap[key] = lastRow + rowsToInsert.length // Cap nhat map
    }
  }

  // Batch insert cac dong moi
  if (rowsToInsert.length > 0) {
    sheet.getRange(
      sheet.getLastRow() + 1, 1,
      rowsToInsert.length, rowsToInsert[0].length
    ).setValues(rowsToInsert)
  }

  Logger.log('Upsert: cap nhat ' + (newData.length - rowsToInsert.length) +
    ', them moi ' + rowsToInsert.length)
}

11. Import Tu Database: PostgreSQL, MySQL

Nhieu doanh nghiep muon dong bo du lieu tu database cua ho sang Google Sheets de bao cao. Cach pho bien nhat la dung Apps Script voi JDBC connection hoac qua API trung gian.

Cach 1: Dung Apps Script JDBC (Cloud SQL)

// Ket noi toi Cloud SQL (PostgreSQL) tu Apps Script
function importFromCloudSQL() {
  // Apps Script ho tro JDBC cho Cloud SQL, MySQL, Oracle, SQL Server
  const conn = Jdbc.getCloudSqlConnection(
    'jdbc:google:mysql://project-id:region:instance-name/dbname',
    'username',
    PropertiesService.getScriptProperties().getProperty('DB_PASSWORD')
  )

  const stmt = conn.createStatement()
  const results = stmt.executeQuery(
    "SELECT id, customer_name, total, created_at " +
    "FROM orders " +
    "WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) " +
    "ORDER BY created_at DESC"
  )

  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Du Lieu DB')

  sheet.clearContents()
  sheet.appendRow(['Ma Don', 'Khach Hang', 'Tong Tien', 'Ngay Dat'])

  while (results.next()) {
    sheet.appendRow([
      results.getInt(1),
      results.getString(2),
      results.getDouble(3),
      results.getTimestamp(4)
    ])
  }

  results.close()
  stmt.close()
  conn.close()
  Logger.log('Import tu Cloud SQL thanh cong')
}

Cach 2: Qua API Trung Gian (Recommended)

Thay vi ket noi truc tiep tu Apps Script, cach an toan hon la tao mot API endpoint rieng trong ung dung cua ban:

// API endpoint trong ung dung Node.js cua ban
// GET /api/export/orders?since=2026-01-01&format=json

// Trong Apps Script, goi API nay
function importFromCustomAPI() {
  const apiBase = 'https://your-app.com/api'
  const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY')

  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)
  const since = yesterday.toISOString().split('T')[0]

  const response = UrlFetchApp.fetch(
    apiBase + '/export/orders?since=' + since + '&format=json',
    { headers: { 'X-API-Key': apiKey } }
  )

  const { orders } = JSON.parse(response.getContentText())

  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Bao Cao Ngay')

  const rows = orders.map(o => [
    o.id, o.customer_name, o.total,
    o.status, new Date(o.created_at)
  ])

  appendWithDeduplicate(sheet, rows, 0)
}

12. Google Forms: Import Tu Dong Tu Khao Sat

Google Forms tu dong luu ket qua khao sat vao mot Google Sheets lien ket. Nhung doi khi ban can xu ly them truoc khi du lieu co ich:

// Trigger chay moi khi co form submission moi
function setupFormTrigger() {
  const form = FormApp.openById('FORM_ID')
  ScriptApp.newTrigger('processFormSubmission')
    .forForm(form)
    .onFormSubmit()
    .create()
}

// Xu ly va chuyen form response sang sheet xu ly
function processFormSubmission(e) {
  const formResponse = e.response
  const itemResponses = formResponse.getItemResponses()

  // Trich xuat cac truong cu the
  const data = {
    timestamp: formResponse.getTimestamp(),
    fullName: itemResponses[0]?.getResponse(),
    phone: itemResponses[1]?.getResponse(),
    product: itemResponses[2]?.getResponse(),
    quantity: parseInt(itemResponses[3]?.getResponse()) || 1,
    address: itemResponses[4]?.getResponse(),
    note: itemResponses[5]?.getResponse() || '',
  }

  // Ghi vao sheet xu ly voi dinh dang chuan hoa
  const targetSheet = SpreadsheetApp.openById('SPREADSHEET_ID')
    .getSheetByName('Don Hang Forms')

  targetSheet.appendRow([
    data.timestamp,
    data.fullName?.trim(),
    data.phone?.trim().replace(/s+/g, ''),
    data.product,
    data.quantity,
    data.address?.trim(),
    data.note,
    'Moi', // Trang thai
    generateOrderId()
  ])

  // Gui thong bao Telegram cho chu shop
  sendTelegramNotification(
    'Don hang moi tu Form:
' +
    data.fullName + ' - ' + data.phone + '
' +
    data.product + ' x' + data.quantity
  )
}

13. Lich Trinh Tu Dong Hoa Import Dinh Ky

Sau khi da viet ham import, buoc tiep theo la lich trinh chay tu dong. Apps Script ho tro time-based triggers:

// Thiet lap tat ca triggers can thiet
function setupAllTriggers() {
  // Xoa triggers cu truoc
  ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t))

  // Import don hang moi moi gio
  ScriptApp.newTrigger('importOrdersFromAPI')
    .timeBased()
    .everyHours(1)
    .create()

  // Import ton kho moi 30 phut
  ScriptApp.newTrigger('importInventoryFromAPI')
    .timeBased()
    .everyMinutes(30)
    .create()

  // Bao cao tong ket moi ngay luc 23:00
  ScriptApp.newTrigger('generateDailyReport')
    .timeBased()
    .everyDays(1)
    .atHour(23)
    .create()

  // Import tu file CSV moi sang thu (du lieu tuan)
  ScriptApp.newTrigger('importWeeklyCSV')
    .timeBased()
    .onWeekDay(ScriptApp.WeekDay.MONDAY)
    .atHour(7)
    .create()

  Logger.log('Da thiet lap 4 triggers tu dong')
}

// Ham kiem tra trang thai import (chay hang ngay)
function checkImportHealth() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Import Log')

  if (!sheet) return

  const lastRow = sheet.getLastRow()
  if (lastRow < 2) return

  const lastImport = sheet.getRange(lastRow, 1).getValue()
  const now = new Date()
  const hoursSinceLastImport = (now - lastImport) / (1000 * 60 * 60)

  if (hoursSinceLastImport > 3) {
    // Canh bao neu qua 3 gio khong co import
    sendTelegramNotification(
      'CANH BAO: Import du lieu bi gian doan! ' +
      Math.round(hoursSinceLastImport) + ' gio khong co du lieu moi.'
    )
  }
}

14. Use Cases Thuc Te Cho Doanh Nghiep Viet Nam

Use Case 1: Cua Hang Ban Le — Import Don Hang Shopee/Lazada

Quy trinh pho bien: Shopee/Lazada xuat file CSV don hang -> import vao Google Sheets hang ngay -> tong hop bao cao doanh thu.

Buoc Cong viec Cong cu
1 Xuat CSV tu Shopee Seller Center (lich trinh auto download) Shopee API / thu cong
2 Import CSV vao Google Sheets (tu dong moi sang) Apps Script + Drive
3 Loai bo trung lap, kiem tra du lieu Apps Script upsert
4 IMPORTRANGE vao sheet bao cao tong hop Ham IMPORTRANGE
5 Dashboard tu dong cap nhat so lieu QUERY + Charts

Use Case 2: Cong Ty Dich Vu — Import Lich Lam Viec Nhan Vien

HR dung Google Forms de nhan vien dang ky lich. Apps Script tu dong xu ly va tong hop vao Sheets luong/timesheet.

Use Case 3: Nha Hang/F&B — Import Du Lieu POS Cuoi Ngay

He thong POS xuat file CSV cuoi ngay. Apps Script tu dong import, tinh tong doanh thu theo mon, theo ca lam viec, gui bao cao cho chu nha hang qua Telegram.

FAQ — Cau Hoi Thuong Gap

Google Sheets co import duoc file CSV lon khong (>10MB)?

File lon hon 5MB khong the upload truc tiep qua giao dien. Giai phap: chia file thanh nhieu phan nho, hoac dung Apps Script voi UrlFetchApp (ho tro file lon hon) hoac Sheets API (khong gioi han file size thuc te, gioi han theo so cell ~5 trieu cell).

Lam sao giu dinh dang khi import CSV tieng Viet?

Dam bao file CSV luu o encoding UTF-8. Trong Excel, khi luu CSV hay chon "CSV UTF-8 (Comma delimited)". Khi import vao Sheets, chon "Detect automatically" cho separator va tat "Convert text to numbers" neu ban muon giu nguyen van ban.

IMPORTRANGE bi loi "You don't have permission" phai lam gi?

Nguoi dung dang xem spreadsheet chua cap quyen truy cap spreadsheet nguon. Click vao cell co ham IMPORTRANGE, se xuat hien nut "Allow access". Click vao do de cap quyen. Quyen nay gan voi tai khoan Google cua nguoi dung.

Apps Script trigger co chay duoc khi khong mo Sheets khong?

Co. Time-based triggers chay tren server cua Google, hoan toan tu dong du ban co mo spreadsheet hay khong. Tuy nhien, moi script chi duoc chay toi da 6 phut (free account) hoac 30 phut (Workspace Business). Neu import lon, hay chia thanh nhieu batch nho.

SheetStore co ho tro import hang loat khong?

Co. SheetStore cung cap tinh nang import hang hoa, khach hang va lich su don hang tu CSV hoac Excel. Ngoai ra, vi SheetStore chay tren Google Sheets, ban co the dung tat ca cac ky thuat tren de import du lieu tu bat ky nguon nao. Xem demo de hieu ro hon.

Quan Ly Kho Hang va Don Hang Hieu Qua Voi SheetStore

SheetStore tich hop san cac tinh nang import hang loat — tu CSV, Excel den API — tren nen tang Google Sheets quen thuoc.

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