Migrasi dari Google Apps Script + Sheets ke Supabase dan Cloudflare

Migrasi dari GAS dan Sheets ke Supabase berarti mengganti tiga hal: Sheets menjadi tabel Postgres, google.script.run menjadi panggilan supabase-js, dan login buatan sendiri menjadi Supabase Auth. Hasilnya lebih cepat, tidak terkena batas waktu eksekusi GAS, dan datanya terstruktur. Alurnya di bawah ini diringkas dari migrasi situs OutsiderDev.
| Di Apps Script + Sheets | Di Supabase + Cloudflare |
|---|---|
| Google Sheets (satu sheet per data) | Tabel Postgres |
google.script.run | supabase-js |
| Login buatan sendiri | Supabase Auth |
| Web app GAS | Cloudflare Pages |
Gambaran arsitektur
- Sebelum: browser memanggil GAS, GAS membaca dan menulis Google Sheets.
- Sesudah: browser membaca data langsung dari Supabase (dilindungi RLS), dan hanya tindakan sensitif yang lewat server kecil di Cloudflare. Tampilan dilayani Cloudflare Pages.
Langkah 1: Inventaris dulu
Tulis daftar semua sheet dan semua fungsi GAS yang dipanggil dari tampilan. Setiap sheet menjadi satu tabel. Setiap fungsi menjadi salah satu dari tiga jenis: baca data publik, tulis data oleh admin, atau tindakan khusus (kirim email, hitung nilai, dan sebagainya).
Langkah 2: Buat project dan skema
Buat project di Supabase, lalu buat tabel lewat SQL Editor. Contoh tabel artikel:
create table public.news ( id bigint generated always as identity primary key, title text not null, slug text unique, content text, status text not null default 'Active', date timestamptz default now(), updated_at timestamptz default now() );
Gunakan tipe data yang tegas (timestamptz untuk tanggal, bigint untuk ID). Di Sheets semuanya teks, jadi di sinilah data yang berantakan ketahuan.
Langkah 3: Pindahkan data
- Rapikan sheet: satu baris judul, tanpa sel gabungan, tanpa baris kosong.
- Unduh tiap sheet sebagai CSV.
- Di Supabase buka Table Editor, pilih tabel, lalu Import data from CSV.
- Periksa jumlah baris, format tanggal, dan nilai status setelah impor.
Langkah 4: Ganti login dengan Supabase Auth
Buat akun admin di Authentication > Users dengan email dan kata sandi kuat. Matikan pendaftaran publik (Allow new users to sign up), supaya orang luar tidak bisa membuat akun sendiri.
Langkah 5: Keamanan dengan Row Level Security
Aktifkan RLS di semua tabel. Tanpa RLS, siapa pun yang memegang kunci publik bisa membaca dan mengubah data. Pola yang umum: pengunjung hanya boleh membaca data aktif, admin yang login boleh mengelola semuanya.
alter table public.news enable row level security; create policy news_public_read on public.news for select to anon, authenticated using (status = 'Active'); create policy news_admin_all on public.news for all to authenticated using (true) with check (true);
Karena aturan admin memberi akses ke semua pengguna yang login, jangan biarkan orang asing mendaftar (langkah 4).
Langkah 6: Ganti pemanggilan di frontend
Kunci publik (anon atau publishable) memang boleh ada di kode frontend karena keamanannya dijaga RLS. Kunci rahasia (secret atau service role) tidak boleh.
// Dulu
google.script.run.withSuccessHandler(tampil).ambilArtikel();
// Sekarang
const { data, error } = await sb
.from('news')
.select('*')
.eq('status', 'Active')
.order('date', { ascending: false });Langkah 7: Hosting di Cloudflare Pages
Simpan kode di GitHub, hubungkan ke Cloudflare Pages, dan isi direktori output (mis. public). Setiap push ke main akan membuat deploy baru otomatis. Domain sendiri ditambahkan dari tab Custom domains. Belum punya domain? Lihat cara beli domain di Cloudflare.
Langkah 8: Tindakan sensitif lewat server
Untuk hal yang tidak boleh dipercayakan ke browser, seperti form kontak dengan captcha, buat fungsi kecil di Cloudflare Pages Functions. Fungsi itu memeriksa captcha, lalu menyimpan data memakai kunci rahasia yang disimpan sebagai Secret di pengaturan Pages. Setelah itu tutup izin tulis publik di database.
Jebakan yang sering terjadi
- Project Supabase gratis bisa dijeda. Supabase menyatakan project paket gratis dengan aktivitas rendah selama 7 hari dapat dijeda. Pasang tugas terjadwal (Cron Trigger di Cloudflare Worker) yang membaca satu baris tiap hari.
- Tidak ada backup yang bisa diunduh di paket gratis. Ekspor tabel secara berkala.
- Kunci rahasia tertukar antar project. Jika Anda punya banyak project, pastikan kunci berasal dari project yang benar. Gejalanya galat 401.
- Jam berbeda 7 jam. Database menyimpan UTC. Ubah ke zona waktu pengguna saat menampilkan, jangan mengubah isi database.
- Script lama masih tampil setelah deploy. Beri nomor versi pada alamat file (
script.js?v=2) atau atur cache agar selalu divalidasi ulang. - Variabel baru di Cloudflare butuh deploy ulang agar terbaca.
Sumber: Row Level Security, Supabase Docs dan Going into production, Supabase Docs.