Các phương pháp hay nhất

Tài liệu này liệt kê các phương pháp hay nhất để cải thiện hiệu suất tập lệnh.

Giảm thiểu các lệnh gọi đến các dịch vụ khác

Việc sử dụng các thao tác JavaScript trong tập lệnh sẽ nhanh hơn so với việc gọi các dịch vụ khác. Mọi thao tác bạn thực hiện trong Google Apps Script đều nhanh hơn so với việc tìm nạp dữ liệu từ các máy chủ của Google hoặc máy chủ bên ngoài, chẳng hạn như các yêu cầu đối với Trang tính, Tài liệu, Sites, Dịch và UrlFetch. Các tập lệnh của bạn sẽ chạy nhanh hơn nếu bạn giảm thiểu các lệnh gọi dịch vụ.

Cộng tác bằng bộ nhớ dùng chung

Nếu bạn làm việc trên một dự án kịch bản với các nhà phát triển khác, hãy cộng tác bằng ổ đĩa dùng chung. Các tệp trong bộ nhớ dùng chung thuộc sở hữu của nhóm chứ không phải cá nhân, giúp việc phát triển và duy trì dự án trở nên dễ dàng hơn.

Sử dụng các thao tác hàng loạt

Tập lệnh thường đọc dữ liệu từ bảng tính, thực hiện các phép tính và ghi kết quả trở lại. Apps Script sử dụng tính năng tối ưu hoá tích hợp như xem trước và lưu vào bộ nhớ đệm khi ghi.

Tối đa hoá tính năng lưu vào bộ nhớ đệm tích hợp bằng cách giảm thiểu số lượt đọc và ghi. Các lệnh đọc và ghi luân phiên diễn ra chậm. Để tăng tốc một tập lệnh, hãy đọc tất cả dữ liệu vào một mảng bằng một lệnh, thực hiện các thao tác trên dữ liệu mảng và ghi dữ liệu bằng một lệnh.

Tránh đọc và ghi luân phiên như trong ví dụ không hiệu quả này:

// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  for (var x = 0; x < 100; x++) {
    var c = getColorFromCoordinates(xcoord, ycoord);
    cell.offset(y, x).setBackgroundColor(c);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
  SpreadsheetApp.flush();
}

Tập lệnh này không hiệu quả vì nó lặp lại qua 10.000 ô với các thao tác ghi liên tiếp. Mặc dù bộ nhớ đệm ghi lại giúp ích, nhưng việc gọi theo lô hiệu quả hơn nhiều:

// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  colors[y] = new Array(100);
  for (var x = 0; x < 100; x++) {
    colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);

Mã không hiệu quả mất khoảng 70 giây để chạy, trong khi mã hiệu quả chỉ mất 1 giây để chạy.

Tránh các thư viện trong tập lệnh có giao diện người dùng phức tạp

Thư viện rất thuận tiện cho việc sử dụng lại mã nhưng lại làm tăng thời gian khởi động tập lệnh. Độ trễ này có thể nhận thấy trong giao diện người dùng Dịch vụ HTML phía máy khách thực hiện các lệnh gọi google.script.run ngắn, lặp lại. Sử dụng thư viện một cách tiết kiệm trong tiện ích bổ sung và tránh sử dụng thư viện trong các tập lệnh thực hiện nhiều lệnh gọi google.script.run.

Sử dụng dịch vụ Bộ nhớ đệm

Sử dụng Dịch vụ bộ nhớ đệm để lưu tài nguyên vào bộ nhớ đệm giữa các lần thực thi tập lệnh. Việc lưu vào bộ nhớ đệm giúp giảm tần suất tìm nạp dữ liệu. Ví dụ sau đây minh hoạ cách sử dụng dịch vụ Bộ nhớ đệm để tăng tốc độ truy cập vào một nguồn cấp dữ liệu RSS chậm.

function getRssFeed() {
  var cache = CacheService.getScriptCache();
  var cached = cache.get("rss-feed-contents");
  if (cached != null) {
    return cached;
  }
  // This fetch takes 20 seconds:
  var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
  var contents = result.getContentText();
  cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
  return contents;
}

Mặc dù bạn vẫn phải đợi 20 giây nếu mục không có trong bộ nhớ đệm, nhưng các lần truy cập tiếp theo sẽ diễn ra nhanh chóng cho đến khi mục hết hạn.

Tập dữ liệu lớn và các phép tính phức tạp

Google Trang tính là một công cụ mạnh mẽ, nhưng khi tập dữ liệu tăng lên và các phép tính trở nên phức tạp hơn, bạn có thể gặp phải các vấn đề về hiệu suất như bảng tính bị trễ, lỗi IMPORTRANGE và hết thời gian chờ của tập lệnh.

Trường hợp nên sử dụng cơ sở dữ liệu

Nếu bảng tính của bạn sắp đạt đến giới hạn 10 triệu ô hoặc nếu bạn có nhiều biểu mẫu được kết nối (ví dụ: 10 biểu mẫu trở lên) và các công thức phức tạp trên nhiều trang tính, hãy cân nhắc sử dụng một giải pháp cơ sở dữ liệu chuyên dụng.

  • Google Cloud SQL: Một dịch vụ cơ sở dữ liệu quan hệ được quản lý hoàn toàn cho MySQL, PostgreSQL và SQL Server. Sử dụng dịch vụ JDBC để kết nối với Cloud SQL hoặc các cơ sở dữ liệu bên ngoài khác như Oracle hoặc MongoDB (thông qua các cầu nối thích hợp).
  • BigQuery: Một kho dữ liệu không máy chủ, có khả năng mở rộng cao. Bạn có thể sử dụng Trang tính liên kết để phân tích các tập dữ liệu lớn trên BigQuery ngay trong Trang tính, hoặc sử dụng dịch vụ BigQuery để tương tác với dữ liệu từ Apps Script.

Tối ưu hoá hiệu suất công thức

Việc sử dụng quá nhiều công thức nhất định có thể làm chậm bảng tính:

  • ARRAYFORMULA: Mặc dù hữu ích, nhưng các phép tính ARRAYFORMULA trên quy mô lớn có thể tốn kém.
  • VLOOKUP và OFFSET: Các hàm này có thể chạy chậm trên các tập dữ liệu lớn. Hãy cân nhắc sử dụng INDEXMATCH hoặc Apps Script để thực hiện các thao tác tra cứu hiệu quả hơn trong bộ nhớ.
  • IMPORTRANGE: Việc sử dụng thường xuyên hàm IMPORTRANGE trên nhiều trang tính có thể dẫn đến "Lỗi nội bộ" nếu các trang tính nguồn có kích thước lớn hoặc chịu tải lớn. Việc hợp nhất dữ liệu vào một nguồn tập trung có thể giúp ích.

Xử lý thời gian chờ của tập lệnh

Apps Script có giới hạn thời gian thực thi (thường là 6 phút cho mỗi lần thực thi hoặc 30 phút đối với một số tài khoản Google Workspace). Nếu tập lệnh của bạn thường xuyên gặp sự cố do vượt quá giới hạn thực thi:

  1. Sử dụng các thao tác hàng loạt: Như đã đề cập trong phần Sử dụng các thao tác hàng loạt, hãy giảm thiểu các lệnh gọi đến bảng tính và các dịch vụ khác.
  2. Chia nhỏ nhiệm vụ: Chia các nhiệm vụ lớn thành những phần nhỏ hơn để mỗi phần có thể hoàn thành trong giới hạn thời gian.
  3. Sử dụng các điều kiện kích hoạt cho hoạt động tiếp tục: Thiết lập một điều kiện kích hoạt có thể cài đặt dựa trên thời gian để tiếp tục một quy trình chạy trong thời gian dài. Tập lệnh có thể lưu trữ trạng thái hiện tại (ví dụ: chỉ mục hàng được xử lý gần đây nhất) bằng cách sử dụng Dịch vụ Properties và tiếp tục từ điểm đó trong lần thực thi tiếp theo.