Apps Script Automation Email Parsing Google Sheets — Tutorial Langkah Demi Langkah Dengan Contoh SkenarioAplikasi “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.
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.
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.
Contoh header sheet (baris 1): timestamp | order_id | buyer_name | email | phone | total | subject | message_id | processed_at
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).
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.
Contoh regex untuk body plain text:
/Order ID[:\s]*([A-Z0-9-]+)/i/Name[:\s]*([A-Za-z\s.'-]+)/i/Email[:\s]*([^\s<]+@[^\s<]+\.[^\s<]+)/i/Phone[:\s]*([0-9+\-\s()]+)/i/Total[:\s]*\$?\s*([0-9,.]+)/iJika 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.
Trim, ubah koma pada angka, konversi nominal ke Number, standardisasi spacing — penting untuk akurasi 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.
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.
Buat label jika belum ada dan thread.addLabel(label) untuk menandai sukses.
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.
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.
main(); cek Execution log (Logger.log) dan sheet.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.
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)).
(Portofolio & layanan: /services/ai-automation, studi kasus: /salesforce-automation-email-parsing-sheets/).
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.
order_id dari sheet (Set/Map) dan/atau tandai thread dengan label processed serta simpan messageId untuk dedupe yang andal.getPlainBody() atau bersihkan HTML (replace(/<[^>]*>/g,' ')) sebelum parsing; tambahkan test case untuk template berbeda.