Cara Sinkron Data MySQL ke Google Sheets Secara Terjadwal
Data penjualan ada di MySQL, tapi tim lebih nyaman di Google Sheets. Dua cara menyalinnya otomatis dan terjadwal, contoh Apps Script siap pakai, dan cek keamanannya.

Cara paling sederhana untuk menyinkronkan MySQL ke Google Sheets secara terjadwal adalah lewat Google Apps Script. Script di dalam spreadsheet membuka koneksi ke database, menjalankan query, menulis hasilnya ke sheet, lalu diulang otomatis tiap jam atau tiap pagi dengan trigger berbasis waktu. Kalau databasenya nggak boleh dibuka ke internet, balik arahnya: server yang mengirim data ke Sheets.
Kasusnya sering begini. Aplikasi kasir, sistem pesanan, atau website menyimpan data di MySQL. Owner dan tim keuangan nggak mau membuka phpMyAdmin, mereka mau angka yang langsung bisa difilter dan dibuat grafik di Google Sheets. Selama ini ada yang export CSV manual tiap hari. Itu yang mau kita hilangkan.
Pilih arahnya dulu
| Sheets yang mengambil (Apps Script) | Server yang mengirim | |
|---|---|---|
| Cara kerja | Script di spreadsheet terhubung langsung ke MySQL lewat JDBC | Script di server membaca MySQL, lalu menulis ke Sheets lewat Google Sheets API |
| Database harus terbuka ke internet | Ya, untuk rentang IP Google | Tidak |
| Tempat jadwal diatur | Trigger Apps Script | Cron di server |
| Cocok untuk | Database di hosting atau VPS yang bisa diatur firewall-nya | Database yang hanya boleh diakses dari jaringan sendiri |
Untuk kebanyakan bisnis kecil dan menengah, cara pertama paling cepat jalan. Cara kedua lebih aman, tapi butuh akses ke server dan sedikit lebih banyak pekerjaan teknis.
Cara pertama, Apps Script dengan JDBC
Menurut dokumentasi Apps Script, layanan JDBC bisa terhubung ke MySQL, Google Cloud SQL, SQL Server, Oracle, dan PostgreSQL. Ada tiga syarat yang perlu dicatat:
- Rentang IP Google harus diizinkan di firewall database, sesuai daftar yang ditautkan di dokumentasi itu.
- Port database harus 1025 ke atas. Port bawaan MySQL, 3306, sudah memenuhi.
- Koneksi minimal TLS 1.2, karena TLS 1.0 dan 1.1 sudah dimatikan.
Berikut contoh script yang menyalin pesanan 30 hari terakhir ke tab bernama Data. Baris pertama tab itu dipakai untuk judul kolom.
// Simpan kredensial di Project Settings > Script properties, jangan di kode
function syncMysqlKeSheet() {
const props = PropertiesService.getScriptProperties();
const conn = Jdbc.getConnection(
props.getProperty('DB_URL'), // contoh: jdbc:mysql://HOST:3306/NAMA_DB
props.getProperty('DB_USER'),
props.getProperty('DB_PASS')
);
const stmt = conn.createStatement();
const rs = stmt.executeQuery(
'SELECT id, tanggal, pelanggan, total FROM pesanan ' +
'WHERE tanggal >= CURDATE() - INTERVAL 30 DAY'
);
const jumlahKolom = rs.getMetaData().getColumnCount();
const baris = [];
while (rs.next()) {
const row = [];
for (let i = 1; i <= jumlahKolom; i++) row.push(rs.getString(i));
baris.push(row);
}
rs.close();
stmt.close();
conn.close();
const sheet = SpreadsheetApp.getActive().getSheetByName('Data');
const lama = Math.max(sheet.getLastRow() - 1, 1);
sheet.getRange(2, 1, lama, jumlahKolom).clearContent();
if (baris.length) sheet.getRange(2, 1, baris.length, jumlahKolom).setValues(baris);
}
// Jalankan sekali untuk memasang jadwal tiap jam
function pasangJadwal() {
ScriptApp.newTrigger('syncMysqlKeSheet').timeBased().everyHours(1).create();
}
Langkahnya:
- Buka spreadsheet, pilih Extensions > Apps Script, lalu tempel script di atas.
- Isi
DB_URL,DB_USER, danDB_PASSdi Project Settings > Script properties. - Ganti query sesuai tabelmu, lalu jalankan
syncMysqlKeSheetsekali untuk mengecek hasilnya dan memberi izin. - Jalankan
pasangJadwalsekali. Setelah itu sinkronisasi jalan sendiri tiap jam.
Script ini menimpa isi lama setiap kali jalan, jadi tab Data selalu berisi salinan terbaru. Kalau kamu butuh riwayat, ubah bagian akhirnya supaya menambah baris baru, bukan menimpa. Nilai yang ditulis berupa teks, jadi kolom angka mungkin perlu diformat ulang di Sheets sebelum dipakai di rumus.

Batas yang perlu diketahui
Kuota Apps Script yang paling berpengaruh di sini:
| Batas | Akun Gmail biasa | Google Workspace |
|---|---|---|
| Lama satu kali jalan | 6 menit | 6 menit |
| Total waktu trigger per hari | 90 menit | 6 jam |
| Jumlah trigger per pengguna per script | 20 | 20 |
| Koneksi JDBC per hari | 10.000 | 50.000 |
Sinkronisasi tiap jam yang selesai dalam satu menit hanya memakai sekitar 24 menit sehari, jadi masih aman bahkan untuk akun Gmail biasa. Yang perlu diwaspadai adalah query yang menarik terlalu banyak baris. Ambil hanya kolom dan rentang tanggal yang dibutuhkan, karena spreadsheet juga punya batas sel. Soal batas itu dan kapan Sheets mulai nggak cukup, aku bahas di Kapan Google Sheets Cukup Jadi Database Webapp, dan Kapan Harus Pindah.
Keamanan yang wajib dicek dulu
Membuka database ke rentang IP Google artinya database bisa dijangkau dari internet. Ini saranku sebelum menyalakan sinkronisasi:
- Buat user MySQL khusus yang hanya bisa membaca, dan hanya untuk tabel atau view yang dibutuhkan. Jangan pakai user root atau user aplikasi.
- Pakai view untuk menyembunyikan kolom sensitif, misalnya nomor telepon atau alamat pelanggan, kalau tim nggak butuh.
- Batasi akses firewall hanya ke rentang IP Google, jangan dibuka untuk semua alamat.
- Simpan kredensial di Script properties, dan batasi siapa yang bisa mengedit script. Orang yang bisa mengedit script bisa membaca kredensialnya.
- Atur siapa yang bisa melihat spreadsheet-nya. Data yang sudah tersalin ke Sheets ikut aturan berbagi file itu. Kalau akun Google yang memilikinya dibobol, datanya ikut terbuka, seperti yang kubahas di Kalau Akun Google Perusahaan Kena Hack Besok Pagi, Apa Saja yang Hilang?.
Kalau salah satu poin di atas nggak bisa dipenuhi, pilih cara kedua: server yang mengirim data ke Sheets, sehingga database tetap tertutup.
Kapan sinkronisasi ini nggak cukup
Salinan terjadwal cocok untuk laporan dan pemantauan. Tapi kalau tim mulai mengedit data di Sheets lalu ingin perubahannya kembali ke MySQL, itu sudah sinkronisasi dua arah, dan risikonya jauh lebih besar. Di titik itu biasanya lebih tepat membuat halaman input kecil yang langsung menulis ke database, atau dashboard yang membaca database secara langsung. Kalau tujuannya laporan rutin, lihat juga Tiap Akhir Bulan Tim Begadang Rekap Laporan: Kapan Layak Diotomatisasi?.
Penutup
Untuk laporan yang diperbarui tiap jam atau tiap pagi, Apps Script dengan JDBC sudah cukup dan bisa jalan dalam satu sore. Yang menentukan aman atau tidaknya bukan script-nya, tapi user database, firewall, dan siapa yang bisa membuka spreadsheet-nya.
Kalau kamu ingin data dari sistemmu otomatis masuk ke Google Sheets atau dashboard tanpa export manual lagi, cerita aja dulu sistem yang kamu pakai.
Foto di artikel ini dari Unsplash, karya Domaintechnik (foto utama) dan Carlos Muza, dipakai sesuai Unsplash License.
Ada proses di tim kamu yang masih manual?
Cerita aja, kita cariin solusinya bareng.
Catatan lainnya

Bisakah AI Belajar Gaya Jualan dari Riwayat Chat WhatsApp?
Bisa, dan biasanya nggak perlu melatih model sendiri. Cara ekspor chat WhatsApp, mengubahnya jadi panduan gaya, prompt siap pakai, serta risiko data pelanggannya.
Baca catatan
Bedanya Gemini dan ChatGPT untuk Kerja Kantor, Mana yang Lebih Cocok?
Gemini dan ChatGPT sama-sama bisa dipakai kerja, tapi kekuatannya beda. Harga paket dalam Rupiah, mana yang cocok untuk tim di Google Workspace, dan kapan ChatGPT lebih pas.
Baca catatan