Google Apps Script untuk Pemula: Otomasi Pertama Kamu
TL;DR
Google Apps Script adalah bahasa berbasis JavaScript yang jalan di dalam Google Workspace, jadi kamu bisa ngotomatiskan Sheets, Gmail, dan Drive tanpa install apa pun. Otomasi pertama yang paling kepakai buat analis: ngambil data dari sheet, ngitung ringkasan, terus ngirimnya lewat email pakai trigger terjadwal. Semua kode di tutorial ini bisa langsung kamu tempel dan jalanin dari menu Extensions lalu Apps Script.
Google Apps Script adalah bahasa berbasis JavaScript yang jalan di dalam Google Workspace, dan bisa ngotomatiskan Sheets, Gmail, sama Drive tanpa install apa pun.
Kasus yang paling sering aku denger: tiap Jumat sore, kamu buka spreadsheet, filter data minggu ini, hitung total, copy ke email, kirim ke bos. 25 menit, tiap minggu, selamanya.
Apps Script bisa ngerjain itu jam 7 pagi tiap Senin, tanpa kamu buka laptop.
Di tutorial ini kita bikin otomasi itu dari nol. Data yang aku pakai: sheet penjualan_umkm berisi transaksi toko oleh-oleh, dengan kolom tanggal, produk, qty, harga, total, dan channel.
Apa itu Google Apps Script?
Apps Script adalah lingkungan pemrograman bawaan Google yang jalan di server mereka, bukan di komputermu. Kamu nulis JavaScript, dan dia bisa manggil Sheets, Gmail, Drive, Calendar, sampai Forms lewat API bawaan.
Yang bikin dia beda dari macro Excel: script-nya jalan walaupun laptopmu mati. Google yang nyalain, sesuai jadwal yang kamu pasang.
Gratis buat akun Google biasa. Ada kuota harian (jumlah email, total waktu jalan), tapi buat kerjaan tim kecil kuotanya gak bakal kesentuh.
Gimana cara buka editor Apps Script?
Tiga klik:
- Buka Google Sheets kamu.
- Menu Extensions → Apps Script.
- Tab baru kebuka dengan file
Code.gsberisi fungsi kosong.
Editornya udah nyambung otomatis ke spreadsheet tempat kamu bukanya. Jadi SpreadsheetApp.getActiveSpreadsheet() langsung nunjuk ke sheet itu, tanpa perlu kasih ID.
Hapus kode bawaannya. Kita mulai dari nol.
Langkah 1: Script pertama — baca data dari sheet
Tempel ini:
function bacaData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('penjualan_umkm');
const data = sheet.getDataRange().getValues();
Logger.log('Jumlah baris (termasuk header): ' + data.length);
Logger.log('Header: ' + data[0]);
Logger.log('Baris pertama: ' + data[1]);
}
Klik Run. Pertama kali, Google bakal minta izin — klik Review permissions, pilih akunmu, terus Allow. Kalau muncul peringatan "app isn't verified", itu normal buat script buatan sendiri. Klik Advanced → Go to project.
Habis itu, buka Execution log di bawah. Kamu bakal lihat isi sheet-nya.
Tiga hal yang perlu kamu ngerti dari kode itu:
getValues()balikin array 2 dimensi — array berisi array.data[0]itu baris header,data[1]baris data pertama.- Index dimulai dari 0, bukan 1. Kolom A itu index 0.
Logger.log()itu alat debug utamamu. Pakai terus.
Kalau error "Cannot read properties of null", berarti nama sheet-nya salah ketik. Cek lagi tab di bawah spreadsheet.
Langkah 2: Hitung ringkasan minggu ini
Sekarang kita filter data minggu berjalan dan hitung totalnya.
function ringkasanMingguan() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('penjualan_umkm');
const data = sheet.getDataRange().getValues();
// Batas 7 hari ke belakang
const sekarang = new Date();
const batas = new Date(sekarang.getTime() - 7 * 24 * 60 * 60 * 1000);
let omzet = 0;
let jumlahTransaksi = 0;
const omzetPerChannel = {};
// Mulai dari 1 biar header kelewat
for (let i = 1; i < data.length; i++) {
const tanggal = new Date(data[i][0]);
const total = Number(data[i][4]);
const channel = data[i][5];
if (tanggal >= batas) {
omzet += total;
jumlahTransaksi++;
omzetPerChannel[channel] = (omzetPerChannel[channel] || 0) + total;
}
}
Logger.log('Omzet 7 hari: ' + omzet);
Logger.log('Transaksi: ' + jumlahTransaksi);
Logger.log('Per channel: ' + JSON.stringify(omzetPerChannel));
return { omzet, jumlahTransaksi, omzetPerChannel };
}
Bagian omzetPerChannel[channel] = (omzetPerChannel[channel] || 0) + total; itu pola yang bakal kamu pakai terus. Artinya: kalau channel ini belum pernah kecatat, mulai dari 0. Kalau udah, tambahin.
Perhatiin Number(data[i][4]). Sheets kadang ngasih angka sebagai teks kalau kolomnya diformat aneh. Kalau kamu lupa konversi, hasilnya bakal jadi teks nyambung: "1200018000" bukan 30000.
Ini kesalahan yang sama persis kayak lupa cast tipe data di SQL. Detailnya aku bahas di artikel JSON di SQL — polanya identik.
Langkah 3: Kirim laporannya lewat email
Sekarang bagian yang bikin otomasinya kerasa.
function kirimLaporan() {
const hasil = ringkasanMingguan();
const rupiah = (n) => 'Rp ' + Math.round(n).toLocaleString('id-ID');
let barisChannel = '';
for (const channel in hasil.omzetPerChannel) {
barisChannel += '<li>' + channel + ': ' +
rupiah(hasil.omzetPerChannel[channel]) + '</li>';
}
const rataStruk = hasil.omzet / hasil.jumlahTransaksi;
const isi =
'<h3>Laporan Penjualan 7 Hari Terakhir</h3>' +
'<p>Omzet: <b>' + rupiah(hasil.omzet) + '</b><br>' +
'Transaksi: <b>' + hasil.jumlahTransaksi + '</b><br>' +
'Rata-rata per struk: <b>' + rupiah(rataStruk) + '</b></p>' +
'<p>Per channel:</p><ul>' + barisChannel + '</ul>';
MailApp.sendEmail({
to: 'owner@tokooleholeh.id',
subject: 'Laporan Mingguan — ' + new Date().toLocaleDateString('id-ID'),
htmlBody: isi
});
Logger.log('Email terkirim.');
}
Jalanin. Cek inbox. Selesai.
Satu catatan soal kuota: akun Google gratis dibatasi sekitar 100 email per hari lewat MailApp. Akun Workspace dapat lebih banyak. Angka persisnya ada di halaman kuota resmi Apps Script.
Langkah 4: Pasang trigger biar jalan sendiri
Ini yang bikin kerjaan Jumat sore-mu hilang.
- Di editor Apps Script, klik ikon jam (Triggers) di sidebar kiri.
- Klik Add Trigger.
- Pilih fungsi:
kirimLaporan. - Event source: Time-driven.
- Tipe: Week timer → hari Monday → jam 7am–8am.
- Save.
Udah. Tiap Senin pagi, laporan masuk inbox tanpa kamu sentuh apa-apa.
Kalau kamu mau bikinnya lewat kode (berguna kalau script-nya bakal dipakai orang lain):
function pasangTrigger() {
ScriptApp.newTrigger('kirimLaporan')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(7)
.create();
}
Jalanin fungsi ini sekali aja. Kalau kamu klik Run tiga kali, kamu bikin tiga trigger, dan bos kamu bakal nerima tiga email tiap Senin. Aku pernah ngelakuin ini. Gak enak.
Contoh kasus: apa yang otomasi ini temukan
Toko oleh-oleh tadi punya 3.200 transaksi selama 6 bulan. Sebelum otomasi, pemiliknya cuma lihat angka omzet total tiap bulan.
Begitu laporan mingguan mulai masuk dengan pecahan per channel, ada satu hal yang langsung kelihatan.
Omzet WhatsApp naik terus tiap minggu, tapi jumlah transaksinya stagnan di kisaran 34–38 per minggu. Artinya bukan pembelinya nambah — tapi tiap orang belanja lebih banyak.
Angka rata-rata per struk WhatsApp: Rp 133.100. Shopee: Rp 84.400. Selisihnya 58%.
Yang bikin ini kepake: pemiliknya jadi tau bahwa nambah 1 admin WhatsApp lebih masuk akal daripada naikin budget iklan Shopee. Keputusan itu keluar dari laporan yang dia baca sambil sarapan, bukan dari analisis khusus yang harus dipesan.
Otomasi yang berguna bukan yang canggih. Yang berguna itu yang bikin angka penting nyampe ke mata orang yang bisa ngambil keputusan.
Kesalahan umum pemula Apps Script
Manggil getValue() di dalam loop. Tiap panggilan ke Sheets itu request ke server, dan lambat. Kalau kamu manggil 500 kali dalam loop, script-mu bisa makan 2 menit. Ambil semuanya sekali pakai getDataRange().getValues(), terus olah di memori.
Lupa index mulai dari 0. Kolom A = data[i][0], kolom F = data[i][5]. Salah satu index, seluruh laporanmu salah tanpa error apa pun.
Gak konversi tipe data. data[i][4] bisa aja teks. Selalu bungkus pakai Number() sebelum ditambah.
Bikin trigger berkali-kali. Cek dulu di panel Triggers sebelum nambah. Kalau ada duplikat, hapus.
Nulis semuanya di satu fungsi raksasa. Pecah: satu fungsi baca data, satu ngitung, satu ngirim. Waktu ada yang error, kamu langsung tau bagian mana yang rusak.
Gak pakai Logger.log(). Ini alat debug utamamu. Kalau script-mu diam-diam salah, cetak isi variabelnya. Jangan nebak.
FAQ
Perlu bisa coding buat pakai Apps Script?
Gak perlu jago, tapi kamu bakal ketemu JavaScript. Kabar baiknya, buat otomasi Sheets kamu cuma butuh empat hal: variabel, kondisi if, perulangan for, dan pemanggilan fungsi. Itu bisa dipelajari dalam beberapa jam. Kalau kamu udah pernah nulis rumus IF bersarang di Excel, logikanya bakal terasa familiar.
Apps Script itu gratis?
Gratis buat akun Google biasa, tanpa perlu langganan Workspace. Yang dibatasi itu kuota harian: misalnya jumlah email yang bisa dikirim per hari dan total waktu eksekusi script. Akun gratis dapat kuota lebih kecil dari akun Workspace berbayar. Buat otomasi laporan harian di tim kecil, kuota gratisnya masih jauh dari cukup.
Bedanya Apps Script sama macro di Excel apa?
Macro Excel pakai VBA dan jalan di komputermu, jadi file-nya harus kebuka. Apps Script pakai JavaScript dan jalan di server Google, jadi dia tetap jalan walaupun laptopmu mati. Ini yang bikin trigger terjadwal jadi masuk akal di Apps Script tapi susah di Excel. Apps Script juga bisa nyentuh Gmail, Drive, dan Calendar langsung.
Kenapa script-ku error "You do not have permission to call"?
Karena script belum diizinkan akses layanan yang dia panggil. Pertama kali kamu jalanin fungsi yang nyentuh Gmail atau Drive, Google bakal minta otorisasi lewat popup. Klik Review permissions lalu pilih akunmu lalu Allow. Kalau muncul peringatan aplikasi belum diverifikasi, itu normal buat script buatan sendiri. Klik Advanced lalu Go to project.
Gimana cara debug script yang gak jalan?
Pakai Logger.log() buat nyetak nilai variabel, terus buka menu Execution log di editor. Di situ kamu bisa lihat apa yang beneran dibaca script-mu. Kesalahan paling umum: salah nama sheet, atau range yang kebaca kosong karena barisnya beda dari perkiraan. Cetak dulu isi data-nya sebelum nebak-nebak.
Penutup
Yang udah kamu bikin barusan:
- Script yang baca data dari Sheets pakai
getValues(). - Ringkasan mingguan yang ngitung omzet dan pecahan per channel.
- Email otomatis yang jalan tiap Senin pagi tanpa kamu sentuh.
Total kodenya kurang dari 60 baris. Dan dia ngambil alih 25 menit kerjaan tiap minggu — sekitar 21 jam setahun.
Langkah berikutnya yang aku saranin: ganti tujuan email-nya jadi alamatmu sendiri, jalanin seminggu, baru kirim ke bos. Bug di laporan yang udah ke-CC direksi itu pengalaman yang gak perlu kamu punya.
Mau lanjut? Pelajari fungsi QUERY di Google Sheets — buat filter sederhana, dia sering lebih cepat dari nulis script. Terus cek glossary automation biar paham kapan otomasi malah bikin ribet.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
Template Laporan Penjualan Excel: Struktur yang Dipakai Analis
Template laporan penjualan yang bener cuma butuh 3 sheet. Yang bikin laporan orang rusak biasanya karena data mentah dan hasil dicampur di satu tempat.
Cara Menghubungkan Google Sheets ke Looker Studio
Nyambungin Google Sheets ke Looker Studio cuma butuh 5 menit. Yang bikin lama itu datanya belum rapi. Ini urutan yang bener.
Cara Share Google Sheets dengan Aman: Permission & Protected Range
Panduan step by step share Google Sheets tanpa bikin rumus kehapus atau data gaji bocor — dari level permission, protected range, sampai audit siapa yang buka.