Skip to content

Google Forms Integration

Overview

Input data penerima akan masuk via Google Forms. Ada beberapa cara menghubungkan Google Forms ke backend.

Opsi Integrasi

Opsi A: Webhook via Google Apps Script (Rekomendasi)

Google Forms → Apps Script → UrlFetchApp.fetch() ke API backend. Real-time.

Pros:

  • Real-time — data masuk segera setelah submit
  • Simple — satu Apps Script 10-20 baris
  • Gratis

Cons:

  • Butuh deploy Apps Script
  • Jika API down, data bisa hilang (butuh retry logic)

Cara setup:

  1. Buka Google Forms → Responses → spreadsheet icon (buat linked Google Sheet)
  2. Buka spreadsheet → Extensions → Apps Script
  3. Tulis script:
javascript
function onFormSubmit(e) {
  const response = e.values;
  const payload = {
    name: response[1],
    bank_code: response[2],
    account_number: response[3],
    account_name: response[4],
    amount: parseInt(response[5])
  };

  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + ScriptProperties.getProperty('API_KEY')
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    UrlFetchApp.fetch('https://your-api.com/api/recipients', options);
  } catch (error) {
    // Log error, bisa kirim email alert
    console.error(error);
  }
}

function createTrigger() {
  ScriptApp.newTrigger('onFormSubmit')
    .forSpreadsheet(SpreadsheetApp.getActive())
    .onFormSubmit()
    .create();
}
  1. Set API key di Script Properties (Project Settings → Script Properties)
  2. Run createTrigger() sekali untuk aktifkan trigger
  3. Deploy sebagai web app (tidak perlu, trigger cukup)

Opsi B: Sheet Sync via Apps Script

Responses masuk Sheet, Apps Script trigger on-edit atau timer, push ke API.

Pros:

  • Data tersimpan di Sheet sebagai backup
  • Bisa batch process (lebih efisien)
  • Bisa retry jika API down

Cons:

  • Delay (tergantung timer interval, min 1 menit)
  • Lebih kompleks dari webhook

Cara setup:

javascript
function syncToApi() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data[0];

  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const status = row[6]; // kolom status

    if (status === 'SYNCED') continue;

    const payload = {
      name: row[1],
      bank_code: row[2],
      account_number: row[3],
      account_name: row[4],
      amount: parseInt(row[5])
    };

    try {
      UrlFetchApp.fetch('https://your-api.com/api/recipients', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        payload: JSON.stringify(payload)
      });
      sheet.getRange(i + 1, 7).setValue('SYNCED');
    } catch (error) {
      sheet.getRange(i + 1, 7).setValue('FAILED: ' + error.message);
    }
  }
}

function createTimeTrigger() {
  ScriptApp.newTrigger('syncToApi')
    .timeBased()
    .everyMinutes(1)
    .create();
}

Opsi C: Polling dari Backend

Backend baca Sheet via Google Service Account.

Pros:

  • Tidak perlu Apps Script
  • Full control dari backend

Cons:

  • Kurang elegan
  • Delay (tergantung polling interval)
  • Rate limit Google Sheets API
  • Butuh service account setup

Cara setup:

  1. Buat Google Cloud project
  2. Enable Google Sheets API
  3. Buat Service Account, download JSON key
  4. Share Sheet dengan service account email
  5. Backend polling:
typescript
import { google } from 'googleapis';

const auth = new google.auth.GoogleAuth({
  keyFile: './service-account.json',
  scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly'],
});

const sheets = google.sheets({ version: 'v4', auth });

async function pollSheet() {
  const response = await sheets.spreadsheets.values.get({
    spreadsheetId: 'YOUR_SHEET_ID',
    range: 'Form Responses 1',
  });

  const rows = response.data.values;
  // Process rows, insert to DB
}

// Run setiap 1 menit
setInterval(pollSheet, 60000);

Rekomendasi

Opsi A (Webhook) untuk case ini karena:

  • Real-time — data masuk segera, tidak perlu tunggu
  • Simple — tidak perlu status tracking di Sheet
  • Untuk jumlah transaksi yang tidak terlalu besar, webhook lebih dari cukup
  • Kalau perlu backup, Google Forms tetap simpan responses di Sheet secara otomatis

Hybrid approach (Opsi A + Sheet backup):

  • Gunakan webhook untuk real-time push ke API
  • Google Forms tetap linked ke Sheet untuk backup
  • Kalau API down, data masih ada di Sheet dan bisa di-import manual

Google Forms Fields

FieldTipeContoh
Nama PenerimaShort answerBudi Santoso
Nama BankDropdown (pilihan bank yang support)BCA
Nomor RekeningShort answer (validasi numeric)1234567890
Nama di RekeningShort answerBudi Santoso
Jumlah (Rp)Short answer (validasi number)500000000

Tips

  • Validasi input: Gunakan response validation di Google Forms untuk memastikan:
    • Nomor rekening hanya angka
    • Jumlah adalah angka positif
    • Bank code valid (dropdown)
  • Test dulu: Buat form test, submit beberapa data, pastikan webhook bekerja
  • Error handling: Apps Script harus handle error gracefully (jangan throw uncaught)
  • Retry: Kalau API return error, bisa simpan ke Sheet dan retry nanti

Research and documentation for disbursement system