Panduan Lengkap: Otomasi Laporan Panen dari Gmail ke Google Sheets
Bagi Anda yang mengelola kebun atau aktivitas panen secara rutin, membuat laporan harian melalui email dan merangkumnya secara manual ke dalam spreadsheet tentu sangat melelahkan dan membuang waktu. Bagaimana jika laporan tersebut bisa masuk dan direkap secara otomatis hanya dengan mengirimkan sebuah email singkat?
Di artikel ini, kita akan membahas cara membuat sistem otomasi menggunakan Google Sheets dan Google Apps Script. Tenang saja, panduan ini dibuat khusus untuk pemula (orang awam) dengan langkah-langkah yang sangat mendetail dari nol!
Keunggulan Sistem Ini:
- Tanpa Input Manual: Cukup kirim email singkat, data langsung masuk ke tabel.
- Tab Bulanan Otomatis: Data otomatis dikelompokkan ke tab bulan yang sesuai (misalnya tab November 2026).
- Rekapitulasi Otomatis: Menghitung total janjang, brondolan, hingga jumlah hari kerja secara otomatis di bagian bawah.
- Peringatan Tanggal Ganda: Baris data dengan tanggal yang tidak sengaja terinput dua kali akan otomatis berubah menjadi warna merah.
Langkah 1: Menyiapkan Google Sheets
- Buka browser di komputer Anda, lalu masuk ke halaman Google Sheets.
- Klik tombol tanda tambah (+ Kosong / Blank) untuk membuat lembar kerja baru.
- Beri nama dokumen spreadsheet Anda di bagian kiri atas, contoh:
Laporan Panen Kebun.
Langkah Memasukkan Skrip Otomasi
- Pada menu atas Google Sheets, klik menu Ekstensi > pilih Apps Script.
- Anda akan dibawa ke tab baru berisi halaman editor kode (tampilan tempat menulis skrip).
- Hapus semua kode bawaan yang ada di dalam kotak editor (jika ada).
- Salin (Copy) kode program lengkap di bawah ini, lalu tempelkan (Paste) ke dalam editor tersebut:
function imporLaporanPanenOtomatis() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var query = 'subject:Panen is:unread';
var threads = GmailApp.search(query);
if (threads.length === 0) {
Logger.log("Tidak ada email baru dengan subjek 'Panen'.");
return;
}
var mapHari = {
"sen": "Senin", "sel": "Selasa", "rab": "Rabu",
"kam": "Kamis", "jum": "Jumat", "sab": "Sabtu", "min": "Minggu",
"ming": "Minggu"
};
var mapBulan = {
"jan": "Januari", "feb": "Februari", "mar": "Maret",
"apr": "April", "mei": "Mei", "jun": "Juni",
"jul": "Juli", "agu": "Agustus", "agust": "Agustus",
"sep": "September", "okt": "Oktober", "nov": "November", "des": "Desember"
};
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
var dataPerBulanEmail = {};
for (var j = 0; j < messages.length; j++) {
var msg = messages[j];
if (msg.isUnread()) {
var body = msg.getPlainBody();
var lines = body.split('\n');
for (var k = 0; k < lines.length; k++) {
var line = lines[k].trim();
if (line === "") continue;
var lowerLine = line.toLowerCase();
var janjangMatch = line.match(/(?:janjang|jjg)\s*(\d+)/i);
var janjang = janjangMatch ? parseInt(janjangMatch[1]) : 0;
var brondolMatch = line.match(/(?:brondol|brondolan|\bbr\b)\s*(\d+)\s*(?:kg)?/i);
var brondol = brondolMatch ? parseInt(brondolMatch[1]) : 0;
var keterangan = "Panen normal";
if (lowerLine.indexOf('ket i') !== -1 || lowerLine.endsWith(' i') || lowerLine.indexOf('izin') !== -1) {
keterangan = "Izin";
janjang = 0;
brondol = 0;
} else if (lowerLine.indexOf('ket l') !== -1 || lowerLine.endsWith(' l') || lowerLine.indexOf('lembur') !== -1) {
keterangan = "Panen lembur";
} else if (lowerLine.indexOf('ket n') !== -1 || lowerLine.endsWith(' n') || lowerLine.indexOf('panen normal') !== -1) {
keterangan = "Panen normal";
}
var hariMatch = line.match(/(sen|sel|rab|kam|jum|sab|min|ming)/i);
var angkaMatch = line.match(/\b([1-9]|[12][0-9]|3[01])\b/);
var tgl = angkaMatch ? angkaMatch[1] : "1";
var blnMatch = line.match(/(jan|feb|mar|apr|mei|jun|jul|agu|sep|okt|nov|des)/i);
var namaBulan = blnMatch ? (mapBulan[blnMatch[1].toLowerCase()] || "Oktober") : "Oktober";
var tahunStr = "2026";
var stringHari = hariMatch ? (mapHari[hariMatch[1].toLowerCase()] || "") : "";
var formatHariTanggal = (stringHari ? stringHari + ", " : "") + tgl + " " + namaBulan + " " + tahunStr;
var kunciBulan = namaBulan + " " + tahunStr;
if (!dataPerBulanEmail[kunciBulan]) {
dataPerBulanEmail[kunciBulan] = [];
}
dataPerBulanEmail[kunciBulan].push([formatHariTanggal, "(kosong)", janjang, brondol, keterangan]);
}
msg.markRead();
}
}
for (var kunciBulan in dataPerBulanEmail) {
var targetSheet = null;
var allSheets = ss.getSheets();
var namaBulanSaja = kunciBulan.split(" ")[0].toLowerCase();
for (var s = 0; s < allSheets.length; s++) {
var sheet = allSheets[s];
if (sheet.getName().toLowerCase().indexOf(namaBulanSaja) !== -1) {
targetSheet = sheet;
break;
}
}
if (!targetSheet) {
var sheet1 = ss.getSheetByName("Sheet1") || ss.getSheets()[0];
if (sheet1.getLastRow() <= 1 && sheet1.getName() === "Sheet1") {
targetSheet = sheet1;
targetSheet.setName(kunciBulan);
} else {
try {
targetSheet = ss.insertSheet(kunciBulan);
} catch (e) {
targetSheet = ss.getSheetByName(kunciBulan);
}
targetSheet.appendRow(["Hari/Tanggal", "Block", "Janjang Panen", "Brondolan", "Keterangan"]);
targetSheet.getRange(1, 1, 1, 5).setFontWeight("bold");
}
}
var lastRow = targetSheet.getLastRow();
if (lastRow > 1) {
var values = targetSheet.getRange(1, 1, lastRow, 5).getValues();
var clearRowIndex = -1;
for (var r = 0; r < values.length; r++) {
var cell = String(values[r][0]);
if (cell.indexOf("REKAPITULASI") !== -1 || cell.indexOf("Total") !== -1 || cell.indexOf("Jumlah") !== -1 || cell.indexOf("#ERROR!") !== -1) {
clearRowIndex = r + 1;
break;
}
}
if (clearRowIndex !== -1) {
targetSheet.deleteRows(clearRowIndex, lastRow - clearRowIndex + 1);
}
}
var rows = dataPerBulanEmail[kunciBulan];
if (rows.length > 0) {
var currentLastRow = targetSheet.getLastRow();
var startRow = (currentLastRow === 1 && targetSheet.getRange(1, 1).getValue() === "Hari/Tanggal") ? 2 : currentLastRow + 1;
targetSheet.getRange(startRow, 1, rows.length, 5).setValues(rows);
var updatedLastRow = targetSheet.getLastRow();
var dataRangeForCheck = targetSheet.getRange(2, 1, updatedLastRow - 1, 5);
dataRangeForCheck.setBackground(null);
var dataValues = dataRangeForCheck.getValues();
var tanggalCounts = {};
for (var d = 0; d < dataValues.length; d++) {
var tglStr = String(dataValues[d][0]).trim();
if (tglStr !== "" && tglStr.indexOf("REKAPITULASI") === -1) {
tanggalCounts[tglStr] = (tanggalCounts[tglStr] || 0) + 1;
}
}
for (var d = 0; d < dataValues.length; d++) {
var tglStr = String(dataValues[d][0]).trim();
if (tanggalCounts[tglStr] > 1) {
targetSheet.getRange(d + 2, 1, 1, 5).setBackground("#f4cccc");
}
}
var totalJjgNormal = 0, totalJjgLembur = 0;
var totalBrondolNormal = 0, totalBrondolLembur = 0;
var countNormal = 0, countLembur = 0, countIzin = 0;
for (var d = 0; d < dataValues.length; d++) {
var rowData = dataValues[d];
var cellA = String(rowData[0]);
if (cellA.indexOf("REKAPITULASI") !== -1 || cellA.indexOf("Total") !== -1) continue;
var jjgVal = Number(rowData[2]) || 0;
var brdValStr = String(rowData[3]).replace(" kg", "").trim();
var brdVal = Number(brdValStr) || 0;
var ketVal = String(rowData[4]).toLowerCase();
if (ketVal.indexOf("normal") !== -1) {
totalJjgNormal += jjgVal;
totalBrondolNormal += brdVal;
countNormal++;
} else if (ketVal.indexOf("lembur") !== -1) {
totalJjgLembur += jjgVal;
totalBrondolLembur += brdVal;
countLembur++;
} else if (ketVal.indexOf("izin") !== -1) {
countIzin++;
}
}
var totalJjgSemua = totalJjgNormal + totalJjgLembur;
var totalBrondolSemua = totalBrondolNormal + totalBrondolLembur;
var barisRekap = targetSheet.getLastRow() + 2;
targetSheet.getRange(barisRekap, 1).setValue("REKAPITULASI BULAN INI").setFontWeight("bold");
var rekapRows = [
["Total Janjang Panen Normal", totalJjgNormal + " jjg"],
["Total Janjang Panen Lembur", totalJjgLembur + " jjg"],
["Total Seluruh Janjang Panen", totalJjgSemua + " jjg"],
["Total Brondolan Panen Normal", totalBrondolNormal + " kg"],
["Total Brondolan Panen Lembur", totalBrondolLembur + " kg"],
["Total Seluruh Brondolan", totalBrondolSemua + " kg"],
["Jumlah Hari Kerja Normal", countNormal + " hari"],
["Jumlah Hari Kerja Lembur", countLembur + " hari"],
["Jumlah Hari Izin", countIzin + " hari"]
];
targetSheet.getRange(barisRekap + 1, 1, rekapRows.length, 2).setValues(rekapRows);
targetSheet.getRange(barisRekap + 1, 1, rekapRows.length, 1).setFontWeight("bold");
targetSheet.getRange(1, 1, targetSheet.getLastRow(), 1).setHorizontalAlignment("left");
}
}
}
Logger.log("Impor dengan deteksi tanggal ganda selesai.");
}
Setelah menempelkan kode, klik ikon Simpan (ikon disket) di bagian atas editor.
Langkah 2: Sinkronisasi & Memberikan Akses Akun Google (Otorisasi)
Karena skrip ini akan membaca email Gmail Anda dan menulis data ke Google Sheets, akun Google Anda perlu memberikan izin keamanan agar keduanya bisa saling terhubung. Ikuti langkah mudah berikut:
- Di halaman Apps Script, pastikan fungsi di menu dropdown atas bertuliskan
imporLaporanPanenOtomatis. - Klik tombol Jalankan (Run) berwarna biru di bagian atas.
- Google akan menampilkan jendela bertuliskan "Izin diperlukan" (Authorization Required). Klik tombol Tinjau Izin (Review Permissions).
- Pilih akun Google yang Anda gunakan saat ini.
- Akan muncul peringatan layar merah bertuliskan "Google belum memverifikasi aplikasi ini" (ini wajar karena ini buatan Anda sendiri). Jangan panik, klik teks kecil bertuliskan Lanjutan (Advanced) di bagian bawah.
- Klik tautan bertuliskan Buka (tidak aman) / Go to Untitled project (unsafe).
- Terakhir, klik tombol Izinkan (Allow) di pojok kanan bawah untuk memberikan izin akses Gmail dan Sheets.
Selesai! Akun Anda kini sudah berhasil disinkronkan.
Langkah 3: Cara Menjalankan Skrip Secara Manual
Jika Anda ingin langsung mengetes atau memasukkan data email yang baru masuk saat itu juga tanpa menunggu waktu otomatis, Anda bisa menjalankan skrip secara manual:
- Buka kembali halaman editor Apps Script melalui Google Sheets Anda (klik Ekstensi > Apps Script).
- Pada menu dropdown fungsi di bagian atas, pastikan terpilih imporLaporanPanenOtomatis.
- Klik tombol Jalankan (Run) berwarna biru di sebelah kiri atas.
- Tunggu beberapa detik hingga proses selesai. Catatan: Pastikan email laporan di Gmail Anda berstatus Belum dibaca (Unread) agar terbaca oleh skrip.
Langkah 4: Membuat Pemicu Otomatis (Trigger)
Supaya Anda tidak perlu repot mengeklik tombol "Jalankan" setiap kali ada email masuk, kita bisa memasang Trigger (Pemicu Otomatis) agar skrip berjalan sendiri di latar belakang:
- Di halaman editor Apps Script, lihat panel menu di sebelah kiri. Klik ikon bergambar Jam Alarm (Pemicu / Triggers).
- Di pojok kanan bawah halaman tersebut, klik tombol biru bertuliskan + Tambahkan Pemicu (+ Add Trigger).
- Atur pilihannya seperti berikut:
- Pilih fungsi yang akan dijalankan:
imporLaporanPanenOtomatis - Pilih penyebaran yang harus dieksekusi:
Kepala (Head) - Pilih sumber waktu:
Berbasis waktu (Time-driven) - Pilih jenis penentuan waktu berbasis waktu: Pilih interval waktu yang diinginkan, misalnya Timer per jam (Hour timer) atau Timer harian.
- Pilih fungsi yang akan dijalankan:
- Klik tombol Simpan (Save).
Langkah 5: Cara Menggunakan Sistem (Format Email)
Sistem ini dirancang untuk membaca email masuk dengan subjek "Panen". Format isi email yang dikirimkan sangat ringkas, contohnya seperti ini:
Kam 1 nov 26, jjg 221, br 80 kg, ket N Jum 2 nov 26, ket I Sab 3 nov 26, jjg 143, br 37 kg, ket N Min 4 nov 26, jjg 147, br 20 kg, ket L
Keterangan Format:
- ket N = Panen Normal (janjang & brondol dihitung)
- ket L = Panen Lembur (janjang & brondol dihitung)
- ket I = Izin (janjang & brondol otomatis 0)
Dengan pemicu otomatis yang sudah aktif, Anda cukup mengirim email laporan dari lapangan, dan Google Sheets akan merekapnya sendiri dengan rapi!

User Reviews & Discussion
Tidak ada komentar:
Posting Komentar