Praktik Terbaik

Dokumen ini mencantumkan praktik terbaik untuk meningkatkan performa skrip.

Meminimalkan panggilan ke layanan lain

Menggunakan operasi JavaScript dalam skrip Anda lebih cepat daripada memanggil layanan lain. Apa pun yang Anda selesaikan dalam Google Apps Script itu sendiri lebih cepat daripada mengambil data dari server Google atau server eksternal, seperti permintaan ke Spreadsheet, Dokumen, Sites, Terjemahan, dan UrlFetch. Skrip Anda akan berjalan lebih cepat jika Anda meminimalkan panggilan layanan.

Berkolaborasi dengan drive bersama

Jika Anda mengerjakan proyek skrip dengan developer lain, berkolaborasilah menggunakan drive bersama. File di drive bersama dimiliki oleh grup, bukan individu, sehingga mempermudah pengembangan dan pemeliharaan project.

Menggunakan operasi batch

Skrip biasanya membaca data dari spreadsheet, melakukan perhitungan, dan menulis kembali hasilnya. Apps Script menggunakan pengoptimalan bawaan seperti look-ahead dan penulisan cache.

Maksimalkan caching bawaan dengan meminimalkan operasi baca dan tulis. Perintah baca dan tulis yang bergantian lambat. Untuk mempercepat skrip, baca semua data ke dalam array dengan satu perintah, lakukan operasi pada data array, dan tulis data dengan satu perintah.

Hindari membaca dan menulis secara bergantian seperti yang ditunjukkan dalam contoh tidak efisien ini:

// 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();
}

Skrip tidak efisien karena melakukan loop pada 10.000 sel dengan penulisan berurutan. Meskipun cache tulis balik membantu, pengelompokan panggilan jauh lebih efisien:

// 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);

Kode yang tidak efisien membutuhkan waktu sekitar 70 detik untuk dijalankan, sedangkan kode yang efisien hanya membutuhkan waktu 1 detik.

Hindari library dalam skrip yang berat UI-nya

Library berguna untuk menggunakan kembali kode, tetapi meningkatkan waktu startup skrip. Penundaan ini terlihat di antarmuka pengguna Layanan HTML sisi klien yang melakukan panggilan google.script.run berulang dan berdurasi singkat. Gunakan library dengan hemat di add-on dan hindari penggunaannya dalam skrip yang melakukan banyak panggilan google.script.run.

Menggunakan layanan Cache

Gunakan Layanan cache untuk menyimpan dalam cache resource di antara eksekusi skrip. Caching mengurangi frekuensi pengambilan data. Contoh berikut menunjukkan cara menggunakan layanan Cache untuk mempercepat akses ke feed RSS yang lambat.

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;
}

Meskipun Anda masih menunggu 20 detik jika item tidak ada dalam cache, akses berikutnya akan cepat hingga item berakhir.

Set data besar dan penghitungan kompleks

Google Spreadsheet adalah alat yang canggih, tetapi seiring bertambahnya ukuran set data dan semakin kompleksnya penghitungan, Anda mungkin mengalami masalah performa seperti spreadsheet yang lambat, error IMPORTRANGE, dan waktu tunggu skrip habis.

Kapan harus menggunakan database

Jika spreadsheet Anda mendekati batas 10 juta sel atau jika Anda memiliki banyak formulir yang terhubung (misalnya, 10 atau lebih) dan formula lintas sheet yang kompleks, pertimbangkan untuk menggunakan solusi database khusus.

  • Google Cloud SQL: Layanan database relasional yang terkelola sepenuhnya untuk MySQL, PostgreSQL, dan SQL Server. Gunakan layanan JDBC untuk terhubung ke Cloud SQL atau database eksternal lainnya seperti Oracle atau MongoDB (melalui jembatan yang sesuai).
  • BigQuery: Data warehouse serverless yang sangat skalabel. Anda dapat menggunakan Sheet yang Terhubung untuk menganalisis set data BigQuery yang besar secara langsung di Spreadsheet, atau menggunakan layanan BigQuery untuk berinteraksi dengan data dari Apps Script.

Pengoptimalan performa formula

Penggunaan berat formula tertentu dapat memperlambat spreadsheet Anda:

  • ARRAYFORMULA: Meskipun berguna, perhitungan ARRAYFORMULA skala besar dapat memerlukan biaya yang tinggi.
  • VLOOKUP dan OFFSET: Fungsi ini dapat berjalan lambat pada set data besar. Sebaiknya gunakan INDEX dan MATCH atau Apps Script untuk melakukan pencarian secara lebih efisien dalam memori.
  • IMPORTRANGE: Penggunaan IMPORTRANGE yang sering di banyak sheet dapat menyebabkan "Error Internal" jika sheet sumber berukuran besar atau mengalami beban berat. Menggabungkan data ke dalam sumber terpusat dapat membantu.

Penanganan waktu tunggu skrip

Apps Script memiliki batas waktu eksekusi (biasanya 6 menit per eksekusi, atau 30 menit untuk beberapa akun Google Workspace). Jika skrip Anda sering error karena melebihi batas eksekusi:

  1. Gunakan operasi batch: Seperti yang disebutkan di bagian Menggunakan operasi batch, minimalkan panggilan ke spreadsheet dan layanan lainnya.
  2. Membagi tugas: Bagi tugas besar menjadi beberapa bagian yang lebih kecil yang masing-masing dapat diselesaikan dalam batas waktu.
  3. Menggunakan pemicu untuk kelanjutan: Siapkan pemicu yang dapat diinstal dan berbasis waktu untuk melanjutkan proses yang berjalan lama. Skrip Anda dapat menyimpan status saat ini (misalnya, indeks baris terakhir yang diproses) menggunakan layanan Properti dan melanjutkan dari titik tersebut pada eksekusi berikutnya.