Cara Menjalankan Script Otomatis Terjadwal di Google Apps Script (Time-Driven Trigger)
8 menit baca · Diperbarui 2026-07-15
Kamu mau tiap jam 7 pagi rekap penjualan kemarin sudah nangkring di inbox, tanpa buka laptop, tanpa klik tombol apa pun. Itu kerjaan trigger. Google Apps Script bisa jalan sendiri di jadwal yang kamu tentuin, dan kamu nggak perlu server, nggak perlu nyalain cron di mesin sendiri.
Masalahnya, orang sering kepeleset di detail kecil yang bikin script jalan dobel, telat sejam gara-gara timezone, atau diam-diam gagal tanpa ada yang tahu. Artikel ini bahas cara pasang time-driven trigger yang benar, plus jebakan yang bikin kamu nombok waktu di kemudian hari.
Trigger itu apa, dan dua jenisnya
Trigger adalah pemicu yang bilang ke Apps Script kapan sebuah fungsi harus jalan. Ada dua kelompok yang wajib kamu bedain:
- Simple trigger: fungsi bernama khusus seperti onOpen(e) atau onEdit(e). Jalan otomatis saat event terjadi, tapi terbatas. Nggak bisa panggil layanan yang butuh otorisasi (misalnya kirim email) dan nggak boleh jalan lebih dari 30 detik.
- Installable trigger: kamu pasang sendiri, punya izin penuh (kirim email, akses sheet lain, panggil API), dan bisa time-driven alias terjadwal. Ini yang dipakai buat penjadwalan.
Buat kebutuhan 'jalan tiap jam' atau 'tiap hari jam 7', yang kamu cari adalah installable time-driven trigger. Ada dua cara masang: lewat UI atau lewat kode.
Cara cepat: pasang lewat UI
Kalau cuma butuh satu jadwal dan males nulis kode, tinggal klik.
- Buka editor Apps Script, di sidebar kiri klik ikon jam (Triggers).
- Klik Add Trigger di kanan bawah.
- Pilih fungsi yang mau dijalanin di 'Choose which function to run'.
- Di 'Select event source' pilih Time-driven.
- Pilih tipe timer (Day timer, Hour timer, Minutes timer) lalu jamnya.
- Save. Google minta otorisasi sekali, kasih izin, selesai.
Kelemahannya: trigger ini nempel di satu proyek dan susah dilacak kalau timmu rame. Buat sesuatu yang mau kamu versioning atau deploy ulang, mending lewat kode.
Pasang lewat kode (ScriptApp)
Bikin trigger secara terprogram bikin setup-nya bisa diulang dan masuk ke source. Pola dasarnya begini:
function buatTriggerHarian() {
ScriptApp.newTrigger('rekapKemarin')
.timeBased()
.everyDays(1)
.atHour(7)
.create();
}
function rekapKemarin() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Data');
// ... proses rekap di sini ...
Logger.log('Rekap jalan: ' + new Date());
}everyDays(1).atHour(7) artinya jalan sekali sehari antara jam 7 dan 8 pagi. Catatan penting: atHour(7) bukan jaminan tepat 07:00:00. Google jalanin dalam rentang satu jam, jadi bisa 07:14, bisa 07:52. Butuh tiap jam? Ganti jadi .everyHours(1).create(). Butuh tiap menit? .everyMinutes(n), dengan n cuma boleh 1, 5, 10, 15, atau 30.
Jebakan #1: trigger dobel tiap kali jalan
Ini yang paling sering nyakitin. Kamu taruh newTrigger(...).create() di dalam fungsi yang kamu jalanin berulang, atau di fungsi yang sendirinya sudah kepasang trigger. Tiap eksekusi nambah satu trigger baru. Seminggu kemudian ada 40 trigger nembak fungsi yang sama, script jalan 40 kali, kuota jebol.
function pasangUlangTrigger() {
const namaFungsi = 'rekapKemarin';
// hapus dulu semua trigger lama untuk fungsi yang sama
ScriptApp.getProjectTriggers().forEach(function (t) {
if (t.getHandlerFunction() === namaFungsi) {
ScriptApp.deleteTrigger(t);
}
});
// baru buat yang baru
ScriptApp.newTrigger(namaFungsi)
.timeBased()
.everyDays(1)
.atHour(7)
.create();
}Panggil pasangUlangTrigger() sekali dari editor waktu setup. Aman diulang kapan pun.
Batas 6 menit dan kuota harian
Dua batas yang bikin script mati di tengah jalan:
- Maksimal 6 menit per eksekusi di akun consumer/gratis. Lewat dari itu, Apps Script langsung stop dengan error 'Exceeded maximum execution time'. Data yang belum kesimpan bisa hilang separuh jalan.
- Total waktu trigger harian juga dijatah. Di akun gratis sekitar 90 menit total per hari untuk semua trigger digabung. Habis, trigger berhenti jalan sampai reset besoknya.
Kalau kerjaanmu berat (proses puluhan ribu baris), pecah jadi batch. Simpan posisi terakhir di PropertiesService, proses beberapa ratus baris per run, biarin trigger nyicil per menit. Jangan paksa semua kelar dalam satu eksekusi.
Angka kuota beda antara akun gratis dan Workspace, dan Google sesekali ngubah. Kalau scriptmu mulai kena limit, baca rincian batas kuota Apps Script biar tahu mana yang bisa kamu naikin dan mana yang memang mentok.
Timezone: jam siapa yang dipakai?
atHour(7) itu jam 7 menurut timezone proyek, bukan timezone kamu, bukan timezone server. Kalau proyek masih default Amerika sementara kamu di WIB, rekap 'jam 7 pagi' bisa nongol tengah malam. Ini bug yang paling sering bikin bingung: kodenya benar, jamnya ngaco.
Cek dan benerin di File > Project Settings (ikon gerigi), lihat field Time zone, set ke (GMT+07:00) Jakarta. Atau di manifest appsscript.json isi 'timeZone': 'Asia/Jakarta'. Setelah timezone diganti, trigger yang sudah kepasang ikut nyesuain sendiri.
Lihat log dan kegagalan lewat Executions
Trigger jalan di background, jadi kamu nggak lihat apa-apa waktu dia gagal. Buka panel Executions (ikon daftar di sidebar editor). Di situ tiap eksekusi kecatat: waktunya, durasinya, statusnya (Completed atau Failed), plus semua Logger.log yang kamu tulis.
Pola wajib: kabari diri sendiri kalau gagal
Jangan andelin ingatan buat ngecek Executions tiap hari. Bungkus isi fungsi dengan try/catch, dan kalau meledak, kirim email ke diri sendiri lengkap dengan stack trace-nya.
function rekapKemarin() {
try {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Data');
if (!sheet) throw new Error('Sheet "Data" tidak ketemu');
// ... proses rekap di sini ...
} catch (err) {
MailApp.sendEmail({
to: Session.getEffectiveUser().getEmail(),
subject: '[GAGAL] Rekap harian error',
body: 'Trigger gagal jam ' + new Date() + '\n\n' + err.stack
});
throw err; // sengaja dilempar lagi biar tetap tercatat merah di Executions
}
}throw err di akhir catch itu disengaja, biar eksekusi tetap ketulis merah 'Failed' di Executions, bukan pura-pura sukses. Mau notif yang lebih rame (ke WhatsApp atau Telegram)? Tinggal ganti MailApp jadi UrlFetchApp yang nembak webhook.
Kalau kamu belum pernah nyetel pengiriman email dari Apps Script, panduan kirim email otomatis dari Spreadsheet ngebahas MailApp versus GmailApp dan batas kirim hariannya.
Rancang polanya benar dari awal
Penjadwalan yang rapi bukan soal hafal API-nya. Soal keputusan: fungsi mana yang terjadwal, seberapa sering, apa yang terjadi kalau gagal, gimana biar nggak dobel. Kalau itu nggak dipikirin di depan, kamu bakal nambal terus di belakang.
Di sinilah Skematik mode Web GAS kepakai. Kamu jelasin aplikasi yang mau dibangun, hasilnya PRD yang polanya sudah kepikir, termasuk trigger idempoten, penanganan error, dan batas eksekusi, sebelum kamu nulis baris pertama. Coba rancang di mode Web GAS.
Buat PRD Web GAS gratis di Skematik →Script yang jalan sendiri itu enak. Yang jalan sendiri sambil gagal diam-diam, itu mimpi buruk. Benerin timezone, pasang notifikasi, tidur nyenyak.