Penyebab Paling Umum Timeout
Sebagian besar script satu kali jalan selesai jauh di bawah 60 detik. Yang mati mendekati batas waktu biasanya melakukan salah satu dari ini:
Perulangan sel per sel pada rentang besar. Script yang membaca 2.400 baris menggunakan getValue() per sel dan menulis balik dengan setValue() per sel melakukan sekitar 4.800 API roundtrip. Dengan rata-rata 150ms per panggilan: 4.800 Ă— 0,15 detik = 720 detik. Script akan timeout di sekitar 50% penyelesaian, setiap kali tanpa kecuali.
Rangkaian pemanggilan API eksternal. Satu pemanggilan yang mengembalikan data dalam 3 detik sudah membakar 8% anggaran waktu akun consumer, sebelum menyentuh spreadsheet. Jika script menarik data bulan demi bulan secara berurutan, efek kumulatifnya fatal.
Refresh model multi-tab secara naif. Script yang melakukan flush setelah setiap penulisan pada model cascading besar akan menumpuk overhead dengan cepat.
Langkah 1: Batch API dengan getValues() dan setValues()
Ini menyelesaikan masalah untuk sebagian besar model. Ganti perulangan sel per sel dengan operasi rentang penuh.
Pola yang salah:
// Lambat: 2.400 pemanggilan API individual
for (let i = 2; i <= 2401; i++) {
const rev = sheet.getRange(i, 3).getValue();
sheet.getRange(i, 10).setValue(rev * 0.385);
}
Pola yang benar:
// Cepat: 2 pemanggilan API untuk 2.400 baris yang sama
const data = sheet.getRange(2, 3, 2400, 1).getValues();
const output = data.map(([rev]) => [rev * 0.385]);
sheet.getRange(2, 10, 2400, 1).setValues(output);
SpreadsheetApp.flush();
Satu pemanggilan getValues() pada 2.400 baris memakan waktu yang kurang lebih sama dengan satu getValue() pada 1 sel. Peningkatan kecepatan pada tabel 2.400 baris biasanya mencapai 40-60x.
Langkah 2: Implementasikan Continuation dengan PropertiesService
Ketika batch API tidak cukup (tabel 50.000 baris, pemanggilan API eksternal lambat yang tidak bisa di-batch), Anda perlu menyimpan checkpoint progres di antara eksekusi.
function refreshActuals() {
const CHUNK_SIZE = 250; // baris per eksekusi - sesuaikan berdasarkan kompleksitas
const props = PropertiesService.getScriptProperties();
// Bersihkan trigger lama di awal, bukan hanya di akhir
deleteOldTriggers('refreshActuals');
// Lanjutkan dari checkpoint terakhir, atau mulai dari baris 2 (baris 1 = header)
const startRow = parseInt(props.getProperty('lastRow') || '2');
const ss = SpreadsheetApp.getActiveSpreadsheet();
const src = ss.getSheetByName('Actuals');
const dest = ss.getSheetByName('P&L');
const lastRow = src.getLastRow();
const endRow = Math.min(startRow + CHUNK_SIZE - 1, lastRow);
// Satu baca untuk seluruh chunk
const rows = src.getRange(startRow, 1, endRow - startRow + 1, 8).getValues();
// Transformasi: pendapatan di kolom 3 (indeks 2), COGS di kolom 4 (indeks 3)
const output = rows.map(r => {
const rev = r[2];
const cogs = r[3];
const gp = rev - cogs;
const gm = rev > 0 ? gp / rev : 0;
return [gp, gm];
});
// Satu tulis untuk seluruh chunk
dest.getRange(startRow, 10, output.length, 2).setValues(output);
SpreadsheetApp.flush();
if (endRow < lastRow) {
props.setProperty('lastRow', String(endRow + 1));
ScriptApp.newTrigger('refreshActuals')
.timeBased()
.after(1500)
.create();
} else {
props.deleteProperty('lastRow');
}
}
function deleteOldTriggers(fnName) {
ScriptApp.getProjectTriggers()
.filter(t => t.getHandlerFunction() === fnName)
.forEach(t => ScriptApp.deleteTrigger(t));
}
Perhatikan bahwa deleteOldTriggers() dipanggil di awal setiap eksekusi. Tanpa itu, setiap jalan membuat trigger baru dan Anda menumpuk trigger basi dengan cepat. Berdasarkan halaman Quotas for Google Services, Apps Script membatasi trigger berbasis waktu maksimal 20 per pengguna per script. Anda mencapai batas itu di eksekusi ke-20 dari pekerjaan 50-chunk tanpa pembersihan rutin.
Kenapa Batas 30 Menit Workspace Tidak Menyelesaikan Segalanya
Upgrade ke Google Workspace memperpanjang batas per eksekusi menjadi 30 menit. Ini peningkatan nyata. Namun ada batas kedua yang ikut berlaku: total waktu eksekusi harian.
Per Juli 2026: pengguna Workspace mendapat 6 jam total waktu eksekusi per hari, pengguna consumer mendapat 1 jam per hari.
Refresh laporan keuangan triwulanan yang berjalan 8 menit per eksekusi melalui trigger, dijalankan setiap 30 menit selama jam kerja (8 jam Ă— 2 kali per jam = 16 eksekusi Ă— 8 menit = 128 menit) akan menghabiskan anggaran harian akun consumer sebelum tengah hari. Workspace memberi lebih banyak ruang, tapi otomasi refresh frekuensi tinggi pada model besar tetap mengharuskan Anda memikirkan kedua batas secara bersamaan.
Kapan Arsitektur yang Menjadi Masalahnya
Beberapa pekerjaan sama sekali tidak cocok dengan model waktu eksekusi Apps Script:
- Jadwal refresh lebih pendek dari 5 menit, berjalan 24/7
- Penarikan lebih dari 100.000 baris dari API eksternal yang rate-limited
- Transformasi yang harus berjalan secara berurutan di 20 tab atau lebih sebelum menulis output apa pun
Untuk kasus-kasus ini, Apps Script adalah lingkungan eksekusi yang salah. Script tersebut mencoba melakukan pekerjaan backend, jenis pekerjaan yang seharusnya berada di proses server tanpa batas waktu. Solusi yang tepat bukan ukuran chunk yang lebih besar, melainkan perpindahan ke infrastruktur yang sesuai dengan skala pekerjaan.
FAQ: Batas Waktu Eksekusi Google Apps Script
Berapa batas waktu eksekusi Google Apps Script?
Batas maksimalnya adalah 6 menit untuk akun Google consumer (gmail.com) dan 30 menit untuk akun Google Workspace berbayar, per eksekusi fungsi. Batas ini berlaku sama untuk eksekusi manual maupun trigger otomatis, dan tidak dapat dinaikkan melalui konfigurasi atau permintaan khusus ke Google.
Apa yang terjadi ketika script melampaui batas waktu eksekusi?
Runtime Apps Script melempar Exception: Exceeded maximum execution time dan langsung menghentikan eksekusi. Semua progres yang belum disimpan ke spreadsheet atau PropertiesService pada saat itu hilang sepenuhnya. Script tidak dilanjutkan secara otomatis.
Saya analis, bukan developer. Apa yang bisa saya lakukan sendiri?
Ada empat langkah yang tidak membutuhkan akses ke kode. Pertama, matikan kalkulasi otomatis di File > Settings > Calculation sebelum menjalankan script, lalu kembalikan setelah selesai. Kedua, gunakan Ctrl+Alt+F9 untuk refresh formula tab model secara manual setelah script selesai, bukan biarkan Sheets memicunya otomatis di tengah proses. Ketiga, kalau model Anda besar, pertimbangkan memisahkan tab sumber data ke spreadsheet tersendiri. Keempat, kalau masalahnya adalah penarikan data dari sumber eksternal seperti CRM atau sistem akuntansi, pertimbangkan alat yang memproses di sisi server sehingga batas waktu Apps Script tidak lagi berlaku.
Apakah upgrade ke Google Workspace memperpanjang batas waktu eksekusi?
Ya, dari 6 menit menjadi 30 menit per eksekusi. Namun kuota total harian juga berlaku: 1 jam per hari untuk akun consumer, dan 6 jam per hari untuk Workspace. Script yang sering berjalan lama tetap bisa menghabiskan kuota harian meski tidak pernah timeout per eksekusi.
Bagaimana cara menjalankan script yang butuh lebih dari 6 menit?
Ada dua pendekatan utama. Pertama, optimalkan script dengan mengganti perulangan getValue()/setValue() dengan getValues()/setValues() pada rentang penuh, yang sering kali mengurangi waktu eksekusi 40-60x. Kedua, implementasikan pola continuation dengan PropertiesService dan trigger terjadwal untuk memproses data dalam beberapa eksekusi terpisah.