Apps Script Automation Email Parsing Google Sheets — Tutorial Langkah Demi Langkah Dengan Contoh Skenario

Pendahuluan

Aplikasi “apps script automation email parsing google sheets” mengubah email masuk menjadi baris terstruktur di Google Sheets: email dibaca otomatis, field penting diparse, data dideduplikasi, lalu di-append ke sheet tanpa input manual. Hasilnya adalah workflow email-to-sheet yang lebih cepat, lebih akurat, dan mudah dihubungkan ke sistem lain seperti CRM atau dashboard (sumber: Google Developers quickstart, InReality Solutions — Salesforce automation). Artikel ini memberi panduan praktis (step-by-step) untuk tim Marketing Ops / Dev internal membangun solusi tersebut menggunakan Apps Script. Contoh integrasi ke CRM.

Mengapa mengotomasi email parsing ke Google Sheets?

Otomasi email → sheet cocok untuk kasus: konfirmasi order e‑commerce, lead dari landing page, RSVP event, atau tiket support yang harus dicatat ke spreadsheet untuk tracking. Manfaat utama: mengurangi pekerjaan manual, menekan error copy‑paste, mempercepat waktu follow-up, dan memudahkan integrasi lanjutan (mis. notifikasi Slack, CRM) (sumber: InReality — contoh implementasi, Panduan Apps Script (EdusoftCenter)).

Untuk tim SMB/B2B di Indonesia (retail, hospitality, edukasi), keuntungan praktisnya: data masuk lebih cepat, format konsisten lewat regex/email2sheet, dan workflow bisa dilanjutkan otomatis ke pipeline sales atau reporting.

What you’ll build — contoh skenario

Skenario: toko e‑commerce menerima email “Order Confirmation”. Kita akan ekstrak: order_id, buyer_name, email, phone, total; lakukan dedupe; lalu append row ke sheet “Orders” dan beri label Gmail “processed”. Komponen utama: GmailApp, SpreadsheetApp, regex parsing, label Gmail, time-driven trigger (sumber contoh implementasi: InReality — implementasi, demo/video referensi: YouTube demo). Contoh Apps Script Daily Report.

Prasyarat & setup awal

Contoh header sheet (baris 1): timestamp | order_id | buyer_name | email | phone | total | subject | message_id | processed_at

Solusi arsitektur & cara apps script workflow (high-level)

Alur: Gmail inbox → query filter → ambil thread → parse email (regex) → normalisasi → dedupe → append row → beri label “processed”. Untuk state management bisa pakai Gmail label, PropertiesService (persist lastProcessed), atau simpan messageId — label sering cukup untuk volume kecil‑menengah (sumber: Apps Script overview, InReality — arsitektur).

Langkah demi langkah implementasi (core how‑to)

Step 1 — Filter & fetch email

Gunakan GmailApp.search() untuk hanya mengambil email relevan:

const query = 'subject:"Order Confirmation" newer_than:7d -label:processed';
const threads = GmailApp.search(query, 0, 50);

(More: GmailApp docs) Panduan Make / alternatif.

Step 2 — Parse email content (regex/email2sheet)

Contoh regex untuk body plain text:

Jika email berformat HTML, gunakan getPlainBody() atau bersihkan tag HTML sebelum parsing (catatan: regex rapuh terhadap variasi template). Untuk alur yang terhubung ke layanan mailing seperti Mailchimp, lihat juga panduan parsing untuk Mailchimp atau solusi webhook/parsing alternatif: Mailchimp & parsing.

Step 3 — Normalisasi data

Trim, ubah koma pada angka, konversi nominal ke Number, standardisasi spacing — penting untuk akurasi dedupe.

Step 4 — Dedupe logic (dedupe)

Baca order_id dari sheet ke object/Set untuk lookup cepat; juga simpan messageId atau gunakan label processed supaya email tidak diproses ulang (sumber: Google Developers quickstart). Untuk contoh integrasi ke CRM seperti Salesforce, lihat referensi arsitektur: InReality — Salesforce parsing.

Step 5 — Append row ke sheet (append row)

Untuk trafik rendah, sheet.appendRow([...]) sederhana dan cepat. Untuk batch besar, prefer setValues() untuk efisiensi (sumber: EdusoftCenter, SpreadsheetApp reference). Setelah data masuk, Anda bisa jalankan enrichment (company/profile enrichment) atau push ke CRM memakai Google Sheets automation patterns: lead enrichment.

Step 6 — Mark email as processed (label)

Buat label jika belum ada dan thread.addLabel(label) untuk menandai sukses.

Step 7 — Scheduling / triggers

Tambahkan time-driven trigger via UI (Triggers > Add Trigger) atau script untuk menjalankan tiap 5–10 menit (frekuensi rekomendasi umum; lihat docs triggers: Apps Script triggers). Contoh penggunaan time-driven triggers dan penggunaan Apps Script di workflow reporting: Daily Report case.

Full sample code (singkat, siap dipakai)

Berikut contoh ringkas (tempel di Editor Apps Script pada Spreadsheet yang aktif):

/** @OnlyCurrentDoc */
function main() {
  const SHEET_NAME = 'Orders';
  const QUERY = 'subject:"Order Confirmation" newer_than:7d -label:processed';
  const LABEL_NAME = 'processed';
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error(`Sheet "${SHEET_NAME}" tidak ditemukan`);
  const label = createLabelIfNotExist(LABEL_NAME);
  const existingIds = getExistingOrderIds(sheet);
  const threads = GmailApp.search(QUERY, 0, 50);
  threads.forEach(thread => {
    thread.getMessages().forEach(message => {
      const subject = message.getSubject();
      const messageId = message.getId();
      const body = getPlainBody(message);
      const data = parseEmail(subject, body);
      if (!data.orderId || existingIds[data.orderId]) return;
      sheet.appendRow([new Date(), data.orderId, data.buyerName, data.email, data.phone, data.total, subject, messageId, new Date()]);
      existingIds[data.orderId] = true;
    });
    thread.addLabel(label);
  });
}
function parseEmail(subject, body) {
  const orderId = extract(body, /Order ID[:\s]*([A-Z0-9-]+)/i);
  const buyerName = extract(body, /Name[:\s]*([A-Za-z\s.'-]+)/i);
  const email = extract(body, /Email[:\s]*([^\s<]+@[^\s<]+\.[^\s<]+)/i);
  const phone = extract(body, /Phone[:\s]*([0-9+\-\s()]+)/i);
  const totalRaw = extract(body, /Total[:\s]*\$?\s*([0-9,.]+)/i);
  return { orderId: normalizeText(orderId), buyerName: normalizeText(buyerName), email: normalizeText(email), phone: normalizeText(phone), total: normalizeTotal(totalRaw) };
}
function extract(text, regex) { const m = String(text||'').match(regex); return m ? m[1] : ''; }
function getPlainBody(message) { const p = message.getPlainBody(); return p && p.trim() ? p : message.getBody().replace(/<[^>]*>/g,' '); }
function normalizeText(v){ return String(v||'').trim().replace(/\s+/g,' '); }
function normalizeTotal(v){ if(!v) return ''; return Number(String(v).replace(/,/g,'')); }
function getExistingOrderIds(sheet){ const values = sheet.getDataRange().getValues(); const ids = {}; for(let i=1;i<values.length;i++){ const id = values[i][1]; if(id) ids[String(id).trim()] = true; } return ids; }
function createLabelIfNotExist(name){ const labels = GmailApp.getUserLabels(); const found = labels.find(l=>l.getName()===name); return found || GmailApp.createLabel(name); }

Referensi fungsi GmailApp & SpreadsheetApp: GmailApp reference, SpreadsheetApp reference.

Testing, logging & troubleshooting (singkat)

Performance & scaling tips

Volume kecil: appendRow() + label. Volume menengah→besar: batch read/write (getValues/setValues), atau gunakan Gmail API/Cloud Functions untuk arsitektur terpisah (sumber: EdusoftCenter, Gmail API). Jika ingin alur tanpa kode atau orkestrasi visual, lihat panduan Make — email parsing.

Security & privacy

Apps Script akan meminta izin akses Gmail dan Sheets saat pertama kali dijalankan — prinsip least privilege direkomendasikan (sumber: Apps Script scopes). Jangan log PII sensitif; atur kebijakan retensi internal (jika klaim spesifik mengenai retensi tidak ada sumber, tandai: (tanpa sumber tepercaya)).

Mengapa InReality Solutions cocok untuk proyek automasi Anda

(Portofolio & layanan: /services/ai-automation, studi kasus: /salesforce-automation-email-parsing-sheets/).

CTA — Konsultasi & Demo

Butuh audit workflow email-to-sheet atau implementasi cepat dengan skrip dan trigger yang siap pakai? Ajukan demo/konsultasi teknis singkat; tim kami bisa bantu proof‑of‑concept dan integrasi ke CRM Anda. Kontak: /services/ai-automation.

Ringkasan manfaat: Dengan apps script automation email parsing google sheets Anda mengurangi pekerjaan manual, mempercepat alur follow-up, dan membuka jalur integrasi ke sistem lebih besar — cepat diimplementasikan dan mudah diskalakan jika diperlukan.

Resources & referensi

FAQ

Q: Bagaimana menangani format email berbeda?
A: Buat regex lebih toleran, tambahkan fallback berbasis messageId/label, atau gunakan parser berbasis template/LLM untuk variasi besar.
Q: Apa kalau ada kuota?
A: Apps Script punya batasan eksekusi dan kuota Gmail/Spreadsheet — cek dokumentasi limits: Apps Script limits.
Q: Bagaimana memastikan data tidak diproses ganda?
A: Simpan dan cek order_id dari sheet (Set/Map) dan/atau tandai thread dengan label processed serta simpan messageId untuk dedupe yang andal.
Q: Bagaimana menangani email HTML dan character encoding?
A: Gunakan getPlainBody() atau bersihkan HTML (replace(/<[^>]*>/g,' ')) sebelum parsing; tambahkan test case untuk template berbeda.
Q: Apakah aman menyimpan PII di Sheets?
A: Hati‑hati — batasi logging PII, gunakan prinsip least privilege, enkripsi/retensi sesuai kebijakan internal.
en_USEnglish