Cara Kirim Notifikasi WhatsApp Otomatis dari Google Form (Tanpa Bayar Plugin)
/send, pasang trigger "Saat formulir dikirim", lalu uji dengan mengisi formulirnya sungguhan. Di bawah ada kode utuh yang bisa langsung disalin, cara mengirim balasan ke si pengisi, dan daftar periksa kalau pesannya tidak kunjung masuk.Formulirnya jalan, tapi kamu baru tahu ada yang daftar besok siang
Google Form enak dipakai karena gratis dan cepat dibikin. Repotnya baru terasa setelah isiannya rutin masuk. Ada yang mendaftar jam sebelas malam, kamu baru membuka spreadsheet besok siang, dan orangnya sudah keburu bertanya ke tempat lain. Notifikasi email bawaan Google Form memang ada, tapi email jarang dibuka secepat WhatsApp.
Yang kamu butuhkan sederhana. Begitu ada yang menekan Kirim, isian itu langsung nongol di WhatsApp kamu. Kalau perlu, orang yang mengisi juga dapat pesan konfirmasi. Tidak perlu beli plugin dan tidak perlu langganan penghubung otomatis, karena Google sudah menyediakan alatnya sendiri: Apps Script.
Jawaban singkat: begini alur notifikasi WhatsApp dari Google Form
Sambungkan Google Form ke Spreadsheet jawaban, buka Extensions lalu Apps Script dari Spreadsheet itu, tempel fungsi yang memanggil endpoint /send milik gateway WhatsApp lewat UrlFetchApp, kemudian pasang trigger "Saat formulir dikirim". Setiap isian baru langsung diteruskan ke nomor tujuan.
Yang perlu disiapkan dulu
- Google Form yang sudah jadi dan sudah punya Spreadsheet jawaban.
- Satu nomor WhatsApp yang tersambung ke gateway, plus token API dari dashboard-nya.
- Nomor tujuan dalam format internasional tanpa tanda plus, misalnya
6281234567890.
Soal gateway-nya: kalau kamu belum punya, konsep dan cara kerjanya dibahas terpisah di Cara Kirim WhatsApp Lewat API. Untuk artikel ini yang penting cuma tiga hal: alamat server, token, dan nama field yang dikirim. Contoh di bawah memakai Jalinara, tapi polanya sama untuk gateway mana pun yang menerima target dan message.
Langkah 1: pastikan Form terhubung ke Spreadsheet
Buka Google Form kamu, masuk ke tab Responses (Tanggapan), lalu klik ikon Sheets hijau. Kalau belum ada, pilih "Create a new spreadsheet". Kalau sudah ada, tinggal buka spreadsheet-nya.
Langkah ini kelihatan sepele, tapi menentukan sisa tutorialnya. Kode di bawah membaca jawaban lewat e.namedValues, dan bentuk data itu hanya muncul kalau trigger-nya dipasang dari sisi Spreadsheet. Banyak orang gagal di sini, bukan di kodenya.
Langkah 2: ambil token API dan simpan sebagai Script Property
Ambil token dari dashboard gateway kamu. Jangan ditempel langsung di badan kode, apalagi kalau proyek Apps Script-nya nanti kamu bagikan ke orang lain. Simpan di Script Properties.
Dari editor Apps Script: klik ikon gerigi (Project Settings), gulir ke Script Properties, klik Add script property. Isi JALINARA_TOKEN sebagai nama, dan token kamu sebagai nilainya. Simpan.
Khusus paket Free Jalinara ada satu syarat yang sering bikin bingung: token baru bisa diterbitkan setelah akunmu punya nomor WhatsApp yang pernah tersambung lewat scan QR. Kalau tombol buat token menolak padahal kamu sudah login, itu penyebabnya.
Langkah 3: tempel kodenya
Dari Spreadsheet jawaban, buka menu Extensions (Ekstensi) lalu Apps Script. Hapus isi Code.gs yang kosong itu, lalu tempel semuanya:
// ====== ATUR DI SINI ======
var URL_KIRIM = 'https://app.jalinara.id/send';
var NOMOR_ADMIN = '6281234567890'; // nomor tujuan notifikasi, format 62...
var ZONA_WAKTU = 'Asia/Jakarta';
// ==========================
/**
* Dipanggil otomatis tiap ada isian formulir baru.
* Trigger: Dari spreadsheet -> Saat formulir dikirim.
*/
function kirimNotifWA(e) {
if (!e || !e.namedValues) {
throw new Error('Fungsi ini harus dipanggil oleh trigger formulir, bukan tombol Run.');
}
var token = PropertiesService.getScriptProperties().getProperty('JALINARA_TOKEN');
if (!token) {
throw new Error('Script Property JALINARA_TOKEN belum diisi.');
}
var jawaban = e.namedValues;
// Ambil isi jawaban berdasarkan JUDUL PERTANYAAN. Harus persis sama,
// termasuk huruf besar-kecil dan spasi. Salin dari header kolom di Spreadsheet.
function isi(label) {
var v = jawaban[label];
return (v && v[0]) ? String(v[0]).trim() : '-';
}
var nama = isi('Nama Lengkap');
var hp = isi('Nomor WhatsApp');
var paket = isi('Pilih Paket');
var catatan = isi('Catatan');
var waktu = Utilities.formatDate(new Date(), ZONA_WAKTU, 'dd/MM/yyyy HH:mm');
var pesan =
'*Isian baru masuk*\n\n' +
'Nama: ' + nama + '\n' +
'WhatsApp: ' + hp + '\n' +
'Paket: ' + paket + '\n' +
'Catatan: ' + catatan + '\n' +
'Waktu: ' + waktu;
kirimWA(token, NOMOR_ADMIN, pesan);
}
/**
* Satu pemanggilan ke endpoint /send.
* Body dikirim sebagai form biasa; header Authorization membawa token.
*/
function kirimWA(token, target, pesan) {
var res = UrlFetchApp.fetch(URL_KIRIM, {
method: 'post',
headers: { 'Authorization': 'Bearer ' + token },
payload: { target: target, message: pesan },
muteHttpExceptions: true
});
var kode = res.getResponseCode();
var isiRes = res.getContentText();
Logger.log('HTTP ' + kode + ' | ' + isiRes); // dibaca di menu Executions
if (kode !== 200) {
throw new Error('Gagal kirim WA. HTTP ' + kode + ' | ' + isiRes);
}
return isiRes;
}
Ganti tiga label di dalam fungsi isi() dengan judul pertanyaan formulir kamu sendiri. Cara paling aman: buka Spreadsheet jawaban, lihat baris pertama, salin tulisannya persis apa adanya. Satu spasi berlebih saja sudah bikin jawaban terbaca kosong.
Simpan (Ctrl+S atau Cmd+S), lalu beri nama proyeknya supaya gampang dicari nanti.
Langkah 4: pasang trigger "Saat formulir dikirim"
Masih di editor Apps Script, klik ikon jam (Triggers) di bilah kiri, lalu Add Trigger. Isi begini:
| Kolom | Isi |
|---|---|
| Choose which function to run | kirimNotifWA |
| Select event source | From spreadsheet |
| Select event type | On form submit |
| Failure notification settings | Notify me immediately |
Begitu ditekan Save, Google akan meminta izin. Muncul layar "Google hasn't verified this app" karena skripnya bikinan sendiri dan belum lewat proses verifikasi Google. Klik Advanced, lalu "Go to (nama proyek) (unsafe)", lalu Allow. Skrip ini butuh izin mengakses spreadsheet dan menghubungi layanan luar, dan izin itulah yang sedang diminta.
Pilihan "Notify me immediately" di baris terakhir sering diabaikan, padahal berguna. Kalau nanti kodenya gagal jalan diam-diam, Google mengirim email berisi pesan error-nya ke kamu.
Langkah 5: uji dengan mengisi formulirnya sungguhan
Jangan menguji dengan tombol Run. Fungsi kirimNotifWA butuh parameter e yang hanya diisi oleh trigger. Klik Run dan yang kamu dapat cuma error yang menyesatkan.
Buka tautan formulirnya, isi seperti orang biasa, kirim. Lalu balik ke editor Apps Script dan buka menu Executions (ikon daftar di kiri). Di situ terlihat apakah fungsinya jalan, berapa lama, dan apa isi Logger.log tadi. Baris HTTP 200 berisi "detail":"message queued" artinya pesan sudah diterima gateway dan masuk antrean.
Kirim juga ke orang yang mengisi formulir
Notifikasi ke diri sendiri itu setengah pekerjaan. Bagian yang biasanya lebih berdampak adalah konfirmasi otomatis ke si pengisi, karena orang jadi tahu pendaftarannya masuk dan berhenti bertanya "sudah diterima belum ya?".
Masalahnya nomor yang mereka ketik jarang rapi. Ada yang menulis 0812..., ada yang +62 812-3456-7890, ada yang pakai spasi. Tambahkan fungsi perapi ini di bawah kode tadi:
function rapikanNomor(nomor) {
var n = String(nomor).replace(/[^0-9]/g, ''); // buang +, spasi, tanda hubung
if (n.indexOf('0') === 0) {
n = '62' + n.substring(1); // 0812... -> 62812...
} else if (n.indexOf('62') !== 0) {
n = '62' + n; // 812... -> 62812...
}
return n;
}
Lalu sisipkan potongan berikut di akhir fungsi kirimNotifWA, tepat setelah baris kirimWA(token, NOMOR_ADMIN, pesan);:
var tujuan = rapikanNomor(hp);
if (tujuan.length >= 11) {
Utilities.sleep(4000); // satu nomor per sekali kirim; beri jeda
var balasan =
'Halo ' + nama + ', pendaftaran kamu sudah kami terima.\n' +
'Paket: ' + paket + '\n\n' +
'Kami hubungi lagi lewat nomor ini kalau ada yang perlu dilengkapi. Terima kasih.';
try {
kirimWA(token, tujuan, balasan);
} catch (err) {
Logger.log('Balasan ke pengisi gagal: ' + err.message); // notif admin tetap terkirim
}
}
Dua hal yang disengaja di potongan itu. Pertama, pengiriman ke pengisi dibungkus try supaya nomor yang salah ketik tidak menggagalkan notifikasi ke kamu. Kedua, ada jeda empat detik. Paket Free Jalinara membatasi API di 20 pesan per menit dan satu nomor tujuan per sekali kirim, jadi dua panggilan berurutan tanpa jeda sebenarnya masih aman, tapi jeda kecil menghindarkan kamu dari mentok saat beberapa orang mengisi formulir bersamaan.
Satu lagi soal paket Free: setiap pesan keluar diberi tanda "Sent Via Jalinara". Kalau konfirmasi itu dibaca pelanggan dan kamu tidak ingin ada tanda tersebut, paket berbayar mulai Rp 39.000 per bulan mengirim tanpa tanda itu.
Kalau error, cek ini dulu
Urutannya dari yang paling sering terjadi.
Skrip tidak jalan sama sekali
- Trigger dipasang di tempat yang salah. Kode ini butuh trigger dari proyek Apps Script milik Spreadsheet dengan sumber "From spreadsheet". Kalau kamu memasangnya dari proyek Apps Script milik Form, isi
eberbeda bentuk dane.namedValueskosong. - Otorisasi belum tuntas. Buka Triggers, lihat kolom kanan. Kalau ada tanda perlu izin, klik dan selesaikan sampai Allow.
- Salah menguji. Isi formulirnya betulan, jangan pakai tombol Run.
Skrip jalan tapi pesannya aneh atau kosong
- Label pertanyaan tidak cocok. Semua field terisi
-? Berarti nama label di kode berbeda dengan header di Spreadsheet. Salin ulang dari baris pertama Spreadsheet. - Pertanyaan pilihan ganda kotak centang. Jawabannya bisa berisi beberapa nilai sekaligus, dipisah koma dalam satu sel. Kode di atas mengambil isinya apa adanya, jadi hasilnya tetap terbaca.
Ada HTTP error di Executions
| Kode | Kemungkinan penyebab | Yang dilakukan |
|---|---|---|
| 401 | Token salah, kadaluwarsa, atau kepotong saat menyalin | Buat ulang token di dashboard, tempel ulang ke Script Properties |
| 400 | Field target atau message kosong | Cek label pertanyaan; pesan teks tidak boleh kosong |
| 402 / 403 | Paket belum mengizinkan, atau kuota pesan bulan ini habis | Lihat sisa kuota di dashboard |
| 429 | Kena batas kirim per menit | Tambah jeda Utilities.sleep, atau naikkan paket |
Percobaan kedua tidak masuk, padahal yang pertama sukses
Ini jebakan klasik saat menguji, dan gampang disangka kodenya rusak. Jalinara melewati pengiriman lewat API kalau pesan dengan isi sama persis baru dikirim ke nomor yang sama dalam lima menit terakhir. Pengaman itu ada supaya skrip yang keliru tidak menembaki satu nomor berkali-kali. Di Executions kamu tetap melihat HTTP 200, tapi di badan responsnya ada catatan bahwa target tersebut dilewati.
Notifikasi ke admin biasanya lolos karena ada baris Waktu yang berubah tiap menit. Yang gampang kena justru balasan ke pengisi, sebab kalimatnya sama persis untuk nama yang sama. Saat menguji, ubah-ubah isian formulirnya atau beri jeda lebih dari lima menit antar percobaan.
HTTP 200 tapi pesan tidak sampai
Respons 200 berarti pesan diterima gateway dan masuk antrean, bukan berarti sudah mendarat di HP tujuan. Yang perlu diperiksa: apakah perangkat WhatsApp-nya masih tersambung (sesi bisa putus kalau HP mati lama atau logout dari WhatsApp Web), dan apakah nomor tujuan benar-benar terdaftar di WhatsApp. Untuk yang kedua ada endpoint /validate yang mengecek tanpa memakan kuota pesan.
Soal Fonnte: kenapa tutorial lama masih bisa dipakai
Kalau kamu mencari "google form ke whatsapp otomatis", sebagian besar tutorial Apps Script yang muncul memakai Fonnte. Kode itu tidak perlu kamu buang.
Format perintah API Jalinara memang dibuat sama dengan Fonnte: endpoint /send dengan field target dan message, ditambah /device untuk cek status perangkat dan /validate untuk cek nomor. Bentuk responsnya pun mengikuti pola yang sama. Jadi untuk memindahkan tutorial Fonnte ke Jalinara, yang berubah biasanya cuma alamat server dan tokennya.
Ini bukan klaim yang harus kamu percaya begitu saja. Ambil kode Fonnte mana pun yang beredar, ganti URL-nya ke https://app.jalinara.id/send, ganti tokennya, jalankan. Satu catatan kecil: header Authorization di Jalinara menerima token polos maupun berawalan Bearer atau Token, jadi kode Fonnte yang mengirim token tanpa awalan tetap diterima.
Kapan Apps Script sudah tidak cukup
Cara di atas pas untuk satu formulir dengan satu tujuan notifikasi. Begitu kebutuhannya bercabang, mengurusnya lewat Apps Script mulai melelahkan. Misalnya kamu ingin isian dibagi ke beberapa admin sesuai jenis layanan, atau ada tindak lanjut terjadwal H+1, atau data yang sama juga harus masuk ke sistem lain.
Di titik itu penghubung visual lebih hemat tenaga, karena percabangan dan penundaan tinggal disusun tanpa menulis logika sendiri. Cara menyambungkannya dibahas di Cara Integrasi WhatsApp dengan n8n. Kalau datanya sudah terlanjur menumpuk di Spreadsheet dan yang kamu mau adalah mengirim dari sana, bukan dari formulirnya, jalurnya sedikit berbeda dan dijelaskan di Integrasi WhatsApp dengan Google Sheets.
Pola yang sama juga dipakai untuk keperluan lain. Kode kirimWA di atas tidak tahu-menahu soal formulir; dia cuma mengirim teks ke sebuah nomor. Ganti pemanggilnya, dan fungsi yang sama bisa dipakai mengirim kode verifikasi, seperti dibahas di API WhatsApp untuk OTP dan Verifikasi.
Terakhir, soal batas Google. Apps Script punya kuota harian untuk pemanggilan layanan luar seperti UrlFetchApp, dan angkanya berbeda antara akun Gmail biasa dan Workspace. Untuk formulir dengan lalu lintas normal biasanya tidak terasa, tapi kalau kamu berencana mengirim ribuan pesan per hari, cek dulu halaman kuota resmi Google sebelum menyandarkan semuanya ke sini.
Poin Penting
- Trigger harus dipasang dari proyek Apps Script milik Spreadsheet dengan sumber "From spreadsheet", bukan dari Form. Ini penyebab kegagalan paling sering.
- Label di dalam fungsi
isi()wajib sama persis dengan header kolom di Spreadsheet jawaban. - Uji dengan mengisi formulirnya sungguhan, lalu baca hasilnya di menu Executions. Tombol Run akan selalu gagal.
- Pesan yang isinya sama persis ke nomor yang sama dilewati kalau baru dikirim dalam lima menit terakhir, jadi variasikan isian saat menguji.
- Format perintah Jalinara sama dengan Fonnte, jadi tutorial Fonnte yang beredar tinggal diganti alamat server dan tokennya.
Pertanyaan yang sering ditanyakan
Kenapa kodenya error waktu saya klik tombol Run di Apps Script?
Karena fungsi itu butuh parameter e yang hanya diisi oleh trigger formulir. Kalau dijalankan manual lewat tombol Run, e kosong dan skrip berhenti di baris pertama. Cara mengujinya bukan dengan Run, tapi dengan benar-benar mengisi formulirnya sekali lalu memeriksa hasilnya di menu Executions.
Trigger-nya dipasang di Google Form atau di Spreadsheet?
Untuk kode yang memakai e.namedValues, trigger harus dipasang dari proyek Apps Script milik Spreadsheet, dengan sumber acara "From spreadsheet" dan jenis "On form submit". Kalau trigger dipasang di proyek Apps Script milik Form, isi datanya berbeda bentuk dan e.namedValues akan kosong.
Saya tes beberapa kali, kenapa cuma pesan pertama yang masuk?
Jalinara melewati pengiriman lewat API kalau pesan dengan isi sama persis baru dikirim ke nomor yang sama dalam lima menit terakhir. Pengaman ini mencegah skrip yang keliru mengirim beruntun ke satu nomor. Saat menguji, ubah isian formulirnya tiap percobaan atau beri jeda lebih dari lima menit.
Apakah notifikasi Google Form ke WhatsApp bisa jalan di paket gratis?
Bisa. Paket Free Jalinara sudah termasuk REST API dengan batas 20 pesan per menit dan satu nomor tujuan per sekali kirim, plus kuota 700 pesan teks per bulan. Semua pesan keluar di paket Free diberi tanda "Sent Via Jalinara". Untuk formulir dengan volume isian yang wajar, batas itu biasanya cukup.
Apakah tutorial Fonnte bisa dipakai untuk Jalinara?
Sebagian besar bisa, karena format perintah API Jalinara memang dibuat sama dengan Fonnte: endpoint /send dengan field target dan message, plus /device dan /validate. Yang perlu diganti adalah alamat servernya dan tokennya. Kamu bisa membuktikannya sendiri dengan menempel kode Fonnte yang beredar lalu mengubah URL-nya.