Sửa lỗi IMPORTDATA Google Sheets "Could not fetch url"

beginner📗 Google Sheets2026-03-22| Google Sheets (trình duyệt web), mọi hệ điều hành

Error Message

Could not fetch url: [URL]
#google-sheets#importdata#url#fetch

Vấn đề

Bạn có một công thức như thế này trong Google Sheets:

=IMPORTDATA("https://example.com/data.csv")

Thay vì tải dữ liệu, ô hiển thị:

Could not fetch url: https://example.com/data.csv

Google Sheets đã cố truy cập URL đó — và thất bại. Nguyên nhân có thể là URL không thể truy cập được từ máy chủ của Google, tài nguyên không tồn tại, hoặc máy chủ từ chối yêu cầu hoàn toàn.

Tại sao lỗi này xảy ra

Đây là điều khiến nhiều người bối rối: Google Sheets tải URL bằng máy chủ của chính Google, không phải trình duyệt của bạn. Một URL có thể hoạt động hoàn hảo trên Chrome nhưng vẫn thất bại trong Sheets. Nguyên nhân rơi vào một số nhóm sau:

  • URL yêu cầu xác thực — các API endpoint riêng tư, tài nguyên được bảo vệ bằng token, hoặc các trang yêu cầu đăng nhập đều thất bại âm thầm.
  • Máy chủ chặn dải IP của Google — một số máy chủ có quy tắc chặn bot từ chối các yêu cầu xuất phát từ dải IP datacenter của Google (ví dụ: 66.249.x.x).
  • Sai loại nội dung — IMPORTDATA chỉ xử lý CSV hoặc TSV thuần túy. Trỏ đến JSON, XML, hoặc trang HTML sẽ luôn báo lỗi.
  • URL không còn tồn tại hoặc đã hết hạn — lỗi gõ, liên kết hỏng, hoặc pre-signed URL hết hạn sau 15 phút đều trông giống nhau đối với Sheets.
  • Chuỗi redirect — quá nhiều bước chuyển hướng, hoặc redirect từ HTTP sang HTTPS mà Sheets không thể theo.
  • Máy chủ chặn bot — một số dịch vụ từ chối rõ ràng các chuỗi User-Agent không phải trình duyệt.

Kiểm tra nhanh trước tiên

1. Xác minh URL thực sự công khai

Mở trong cửa sổ ẩn danh — không cookie, không phiên đăng nhập. Nếu trang yêu cầu đăng nhập hoặc trả về lỗi 403, đó chính là nguyên nhân. Google Sheets thấy chính xác những gì một khách truy cập ẩn danh thấy.

2. Mô phỏng yêu cầu không phải trình duyệt bằng curl

curl -I "https://example.com/data.csv"

Kết quả 403 Forbidden hoặc 401 Unauthorized có nghĩa là máy chủ đang chặn các client không phải trình duyệt. Google Sheets cũng sẽ gặp phải rào cản tương tự.

3. Kiểm tra loại nội dung mà máy chủ trả về

curl -s -o /dev/null -w "%{content_type}" "https://example.com/data.csv"

IMPORTDATA yêu cầu text/csv hoặc text/tab-separated-values. Nếu bạn thấy application/json hoặc text/html, hãy chuyển sang hàm import phù hợp (xem Cách sửa 4 bên dưới).

Sửa lỗi theo nguyên nhân

Cách sửa 1: Dùng URL CSV/TSV công khai, trực tiếp

URL phải có thể truy cập công khai — không đăng nhập, không token — và trả về dữ liệu CSV hoặc TSV thuần túy. URL file raw trên GitHub là một ví dụ đáng tin cậy:

=IMPORTDATA("https://raw.githubusercontent.com/user/repo/main/data.csv")

Lưu ý: dùng URL raw, không phải trang xem trước file. Trang xem trước trả về HTML, không phải CSV.

Cách sửa 2: Google Drive — dùng URL export

Dữ liệu nằm trong Google Sheets hoặc Drive? Dùng trực tiếp endpoint export:

=IMPORTDATA("https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/export?format=csv&gid=SHEET_GID")

Thay SPREADSHEET_IDSHEET_GID bằng giá trị thực của bạn. Spreadsheet nguồn phải được chia sẻ "Bất kỳ ai có đường dẫn đều có thể xem" — nếu không bạn sẽ nhận lỗi 403 ngay.

Cách sửa 3: Máy chủ chặn Google — proxy yêu cầu

Nếu bạn sở hữu nguồn dữ liệu, hãy whitelist dải IP của Google hoặc nới lỏng quy tắc chặn bot cho endpoint đó. Nếu bạn không kiểm soát máy chủ, có hai lựa chọn.

Tùy chọn A: định tuyến qua CORS proxy công khai (chỉ dùng cho dữ liệu công khai, không nhạy cảm). Tùy chọn B: dựng một dịch vụ middleware nhỏ:

# Minimal Flask proxy
from flask import Flask, Response, request
import requests

app = Flask(__name__)

@app.route("/proxy")
def proxy():
    url = request.args.get("url")
    r = requests.get(url)
    return Response(r.content, content_type="text/csv")

Sau đó trỏ Sheets đến endpoint của bạn:

=IMPORTDATA("https://yourproxy.com/proxy?url=https://example.com/data.csv")

Cách sửa 4: Dùng hàm khác cho nguồn không phải CSV

IMPORTDATA chỉ dành cho CSV và TSV. Nếu URL trả về HTML hoặc XML, bạn cần dùng hàm khác:

=IMPORTHTML("https://example.com/table-page", "table", 1)
=IMPORTXML("https://example.com/feed.xml", "//item/title")

Cách sửa 5: Xóa cache lỗi

Sheets đôi khi cache lỗi tải dù URL đã có thể truy cập trở lại. Có hai cách để buộc làm mới:

  • Thêm một tham số giả vào URL: đổi ?t=1 thành ?t=2 để buộc tính toán lại.
  • Vào File → Cài đặt → Tính toán → Khi thay đổi và mỗi giờ để kích hoạt làm mới định kỳ.
=IMPORTDATA("https://example.com/data.csv?nocache=" & TEXT(NOW(), "YYYYMMDDHHMMSS"))

Thủ thuật NOW() hữu ích khi debug — nó tính toán lại mỗi khi có thay đổi trên sheet. Hãy xóa nó đi sau khi dữ liệu đã tải thành công, nếu không sheet của bạn sẽ liên tục gửi yêu cầu đến máy chủ mỗi khi gõ phím.

Giải pháp lâu dài — Lưu trữ dữ liệu ở nơi đáng tin cậy

Nếu IMPORTDATA là trung tâm trong quy trình làm việc của bạn, hãy đặt file CSV ở nơi được xây dựng cho truy cập công khai ẩn danh:

  • GitHub raw URL — miễn phí, không cần xác thực cho repo công khai, luôn đáng tin cậy
  • Google Drive + export URL — theo mẫu /export?format=csv ở trên, chia sẻ công khai
  • AWS S3 public bucket — đặt ACL của object thành public-read và dùng URL S3 trực tiếp
  • Cloudflare R2 — tương tự, chi phí egress rẻ hơn S3 cho file có lượng truy cập cao

Xác nhận đã sửa xong

  • Cập nhật công thức hoặc URL, sau đó đợi 10–15 giây để Sheets tải dữ liệu.
  • Ô báo lỗi sẽ được thay thế bằng các hàng dữ liệu thực.
  • Kiểm tra ô A1 của vùng dữ liệu được import — nó phải hiển thị trường đầu tiên trong header CSV của bạn.
  • Thấy #N/A thay vì lỗi tải? URL đã tải được, nhưng định dạng dữ liệu có vấn đề — kiểm tra cài đặt dấu phân cách hoặc xem file có chứa ký tự BOM không.

Vẫn thất bại sau khi dùng URL công khai đúng? Chạy một yêu cầu curl mới từ máy chủ ngoài mạng nội bộ của bạn. Điều đó xác nhận URL có thực sự công khai hay chỉ có thể truy cập từ dải IP của bạn.

Related Error Notes