Featured

    Featured Posts

  • dimana kehidupan
  • disitulah jawaban

Merapikan Data Inventaris Kantor dengan Google Spreadsheet

Beberapa waktu ini saya mulai belajar merapikan data inventaris kantor. Ceritanya saya kebetulan diminta untuk ikut membantu pendataan barang. Awalnya saya pikir pekerjaannya sederhana. Paling hanya mencocokkan data yang sudah ada dengan barang yang ada di ruangan.

Ternyata setelah mulai dikerjakan, kondisinya tidak sesederhana itu.

Data utama memang sudah ada. Tetapi ketika dibandingkan dengan kondisi nyata di ruangan, ternyata banyak yang belum sesuai. Ada barang yang di data tercatat berada di lokasi tertentu, tetapi fisiknya ada di ruangan lain. Ada barang yang labelnya masih ada, tetapi ketika dicari di database utama tidak langsung ditemukan. Ada juga barang yang secara fisik ada, tetapi informasinya belum cocok dengan data utama.

Merapikan Data Inventaris Kantor dengan Google Spreadsheet

Dari situ saya mulai berpikir, kalau langsung ingin merapikan semuanya sekaligus, sepertinya akan berat. Jadi saya coba mulai dari langkah yang paling sederhana dulu, yaitu melakukan pendataan per ruangan.

Alurnya saya buat pelan-pelan:

  1. Cek barang langsung ke tiap ruangan.
  2. Catat manual dulu di tabel/form pendataan.
  3. Masukkan hasil catatan ke Google Spreadsheet.
  4. Cocokkan dengan database utama.
  5. Tandai data yang sudah diproses.
  6. Catat juga data yang tidak ditemukan atau perlu dicek ulang.

Jadi tulisan ini saya buat sebagai catatan belajar saya sendiri. Supaya kalau nanti lupa, saya bisa buka lagi.

Gambaran Alur Kerja

Sebelum masuk ke Google Spreadsheet, proses awal yang saya lakukan sebenarnya masih manual.

Saya mengecek barang langsung ke tiap ruangan, lalu mencatatnya di tabel/form pendataan sederhana. Jadi sumber input awalnya bukan langsung dari database utama, tetapi dari hasil pengecekan fisik di ruangan.

Misalnya saya masuk ke satu ruangan, lalu mulai mencatat barang-barang yang ada di sana. Saya catat nomor atau identitas item yang masih terbaca, nama item jika perlu, kondisi item, dan keterangan lain yang dianggap penting.

Setelah hasil catatan dari ruangan terkumpul, barulah data tersebut saya masukkan ke Google Spreadsheet.

Tujuannya bukan hanya mengetik ulang data, tetapi untuk membandingkan antara:

  • item yang benar-benar ada di ruangan,
  • item yang tercatat di database utama,
  • dan apakah lokasi item di data sudah sesuai dengan kondisi nyata.

Dengan cara ini, saya tidak hanya bergantung pada data lama. Database utama tetap dipakai sebagai pembanding, tetapi kondisi nyata di ruangan tetap menjadi dasar pengecekan awal.

Penomoran Ruangan

Sebelum membuat sheet per ruangan, saya sudah lebih dulu memberi nomor untuk tiap ruangan.

Tujuannya sederhana, agar proses pendataan lebih mudah dilacak.

Misalnya:

  • Ruang nomor 1 saya beri nama 1RuangRapat
  • Ruang nomor 38 saya beri nama 38RuangServer

Jadi angka 1, 2, 38, dan seterusnya itu bukan berarti urutan saya menginput data di spreadsheet. Angka itu adalah nomor ruangan yang memang sudah saya buat sebelumnya untuk memudahkan pendataan.

Dalam praktiknya, input data tidak harus dimulai dari ruangan nomor 1.

Misalnya ruangan nomor 38 lebih dulu selesai dicek secara manual, maka saya bisa input dulu ke sheet 38RuangServer. Kalau ruangan nomor 1 selesai belakangan, baru nanti saya input ke sheet 1RuangRapat.

Jadi urutan input mengikuti ruangan mana yang sudah selesai didata di lapangan, bukan harus urut dari nomor ruangan terkecil.

Ini penting supaya pekerjaan lebih fleksibel. Karena dalam proses cek fisik, kadang ruangan tertentu lebih mudah diakses, sedangkan ruangan lain harus menunggu waktu kosong, menunggu kunci, atau menunggu penanggung jawab ruangannya.

Struktur Sheet yang Saya Buat

Di Google Spreadsheet, saya membuat beberapa sheet.

Kurang lebih strukturnya seperti ini:

  1. Master
  2. Daftar_Ruangan
  3. Cek_Fisik
  4. Sheet per ruangan, misalnya:
    • 1RuangRapat
    • 38RuangServer

Nama sheet saya buat tanpa spasi agar lebih mudah dipakai di rumus. Misalnya saya pakai 1RuangRapat, bukan 1 Ruang Rapat.

Sheet Master

Sheet Master berisi database utama item.

Header-nya bisa disesuaikan dengan kebutuhan. Saya buat dengan istilah umum saja, misalnya:

  • No
  • Kode Unit
  • Nama Unit
  • Kode Item
  • ID Item
  • Nama Item
  • Status
  • Brand
  • Model
  • Kondisi
  • Lokasi
  • Keterangan

Yang paling penting untuk proses awal ini adalah kolom-kolom berikut:

Kolom Isi
ANo
FID Item
GNama Item
IBrand
KKondisi

Kolom No menjadi kunci utama. Jadi ketika saya mengisi nomor di sheet ruangan, data lain seperti nama item, ID item, brand, dan kondisi bisa otomatis ditarik dari sheet Master.

Sheet Daftar_Ruangan

Sheet Daftar_Ruangan saya gunakan untuk menyimpan daftar kode dan nama ruangan.

Formatnya sederhana:

Kode Ruangan Nama Ruangan
R001Ruang Rapat
R002Ruang Server
R003Ruang Administrasi

Misalnya:

  • Kolom A = Kode Ruangan
  • Kolom B = Nama Ruangan

Data dimulai dari baris 2, karena baris 1 dipakai untuk header.

Contoh rentang datanya:

A2:B40

Sheet ini nanti dipakai sebagai sumber dropdown di sheet Cek_Fisik.

Sheet Cek_Fisik

Sheet Cek_Fisik saya gunakan untuk menampung hasil pengecekan fisik barang di ruangan.

Jadi sebelum data dimasukkan ke sheet ini, saya terlebih dahulu mengecek barang secara langsung di tiap ruangan dan mencatatnya secara manual di tabel/form pendataan.

Setelah itu, hasil catatan tersebut baru saya masukkan ke Google Spreadsheet.

Di sheet Cek_Fisik, saya ingin ketika memilih kode ruangan, maka nama ruangannya otomatis muncul. Ini supaya proses input lebih rapi dan saya tidak perlu mengetik nama ruangan berulang-ulang.

Contohnya seperti ini:

Kode Ruangan Nama Ruangan
pilih dari dropdownotomatis muncul

Dengan cara ini, saya bisa lebih fokus mencatat hasil pengecekan fisik, lalu setelah itu membandingkannya dengan data yang ada di sheet Master.

Bisa dibilang, sheet Cek_Fisik ini menjadi jembatan antara kondisi nyata di ruangan dengan database utama yang sudah ada.

Langkah pertama yang saya buat adalah dropdown untuk kode ruangan.

Tujuannya supaya kode ruangan tidak diketik manual. Kalau diketik manual, kadang ada risiko salah ketik, kelebihan spasi, atau formatnya tidak sama.

Langkahnya:

  1. Buka sheet Cek_Fisik.
  2. Blok kolom yang ingin diberi dropdown, misalnya:
A2:A500
  1. Klik menu:
Data → Validasi data
  1. Pada bagian kriteria, pilih:
Dropdown dari rentang
  1. Masukkan rentang sumber data:
Daftar_Ruangan!A2:A40
  1. Klik selesai.

Setelah itu, kolom kode ruangan di sheet Cek_Fisik sudah memiliki dropdown. Jadi tinggal pilih kode ruangan dari daftar yang tersedia.

Membuat Nama Ruangan Otomatis Muncul

Setelah dropdown kode ruangan berhasil, langkah berikutnya adalah membuat nama ruangan otomatis muncul.

Misalnya di sheet Cek_Fisik:

Kolom Isi
AKode Ruangan
BNama Ruangan

Maka di cell B2, saya isi rumus berikut:

=IF(A2="";"";IFERROR(VLOOKUP(A2;Daftar_Ruangan!A:B;2;FALSE);"Tidak ditemukan"))

Setelah rumus ini dipasang, ketika saya memilih kode ruangan di kolom A, nama ruangan akan otomatis muncul di kolom B.

Penjelasan sederhananya:

  • A2 adalah kode ruangan yang dipilih.
  • Daftar_Ruangan!A:B adalah sumber data kode dan nama ruangan.
  • Angka 2 berarti mengambil data dari kolom kedua, yaitu nama ruangan.
  • FALSE berarti pencarian harus cocok persis.
  • IFERROR dipakai supaya kalau data tidak ditemukan, tidak langsung muncul error.

Catatan Penting tentang Koma, Titik Koma, dan Setting Wilayah

Ini salah satu hal kecil yang sempat membuat saya bingung.

Awalnya saya mencoba memasukkan rumus seperti ini:

=IF(A2="","",IFERROR(VLOOKUP(A2,Daftar_Ruangan!A:B,2,FALSE),"Tidak ditemukan"))

Ternyata muncul error.

Setelah dicek, masalahnya bukan pada logika rumusnya, tetapi pada setting wilayah atau locale Google Spreadsheet yang saya gunakan.

Kalau Google Spreadsheet memakai setting Indonesia, biasanya pemisah antarbagian rumus menggunakan titik koma ;, bukan koma ,.

Jadi untuk setting Indonesia, rumusnya menjadi seperti ini:

=IF(A2="";"";IFERROR(VLOOKUP(A2;Daftar_Ruangan!A:B;2;FALSE);"Tidak ditemukan"))

Perbedaannya kecil, tapi cukup penting.

Versi setting Inggris/US biasanya memakai koma:

=VLOOKUP(B2,Master!A:G,7,FALSE)

Sedangkan versi setting Indonesia memakai titik koma:

=VLOOKUP(B2;Master!A:G;7;FALSE)

Jadi kalau rumus terasa sudah benar tetapi tetap error, coba periksa dulu tanda pemisahnya.

Setting SpreadsheetPemisah Rumus
Indonesiatitik koma ;
Inggris/USkoma ,

Hal yang sama juga berlaku untuk rumus lain seperti IF, IFERROR, VLOOKUP, ARRAYFORMULA, COUNTIF, dan OR.

Contoh rumus format bersyarat dengan setting Indonesia:

=COUNTIF(INDIRECT("'1RuangRapat'!B:B");$A2)>0

Kalau memakai setting Inggris/US, biasanya menjadi:

=COUNTIF(INDIRECT("'1RuangRapat'!B:B"),$A2)>0

Bagi saya, ini pelajaran kecil tapi penting. Kadang kita merasa rumusnya salah, padahal yang salah hanya tanda pemisahnya.

Membuat Nama Ruangan Otomatis untuk Semua Baris

Kalau tidak ingin menarik rumus ke bawah satu per satu, bisa memakai ARRAYFORMULA.

Misalnya di cell B2 sheet Cek_Fisik:

=ARRAYFORMULA(IF(A2:A="";"";IFERROR(VLOOKUP(A2:A;Daftar_Ruangan!A:B;2;FALSE);"Tidak ditemukan")))

Dengan rumus ini, cukup pasang sekali di baris 2. Nanti baris-baris di bawahnya akan otomatis mengikuti.

Tapi ada catatan penting.

Kalau memakai ARRAYFORMULA, maka kolom hasilnya tidak bisa diisi manual di tengah-tengah. Karena seluruh kolom sudah dikendalikan oleh rumus dari baris atas.

Ini nanti menjadi penting ketika ada data yang tidak ditemukan di database utama dan perlu diisi manual.

Membuat Sheet Per Ruangan

Setelah sheet Cek_Fisik mulai rapi, saya lanjut membuat sheet per ruangan.

Contohnya saya membuat sheet:

1RuangRapat

dan juga:

38RuangServer

Sekali lagi, angka di depan nama sheet adalah nomor ruangan yang sudah saya tentukan sebelumnya. Jadi 1RuangRapat artinya ruangan nomor 1, sedangkan 38RuangServer artinya ruangan nomor 38.

Header di sheet ruangan kurang lebih seperti ini:

NoNo Urut Data UtamaNama ItemID ItemBrandKondisi

Kolom pentingnya:

KolomIsi
BNo Urut Data Utama
CNama Item
DID Item
EBrand
FKondisi

Konsepnya begini.

Saya cukup mengisi kolom No Urut Data Utama. Nomor tersebut sama dengan kolom No yang ada di sheet Master.

Setelah nomor diisi, maka data lain akan otomatis muncul dari sheet Master.

Dalam proses input, saya tidak harus mengisi sheet ruangan secara berurutan dari nomor 1. Kalau hasil cek fisik ruangan nomor 38 sudah selesai duluan, saya bisa langsung mengisi sheet 38RuangServer. Nanti kalau ruangan nomor 1 baru selesai dicek, baru saya isi sheet 1RuangRapat.

Jadi spreadsheet ini mengikuti alur kerja nyata di lapangan, bukan memaksa harus urut dari awal.

Menarik Data dari Master

Menarik Nama Item dari Master

Di sheet 1RuangRapat, kolom B adalah No Urut Data Utama. Kolom C adalah Nama Item.

Karena di sheet Master, kolom A adalah No dan kolom G adalah Nama Item, maka di cell C2, saya isi rumus:

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:G;7;FALSE);""))

Menarik ID Item dari Master

Untuk kolom D atau ID Item, rumus di cell D2:

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:F;6;FALSE);""))

Menarik Brand dari Master

Untuk kolom E atau Brand, rumus di cell E2:

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:I;9;FALSE);""))

Menarik Kondisi dari Master

Untuk kolom F atau Kondisi, rumus di cell F2:

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:K;11;FALSE);""))

Setelah semua rumus dipasang di baris 2, rumus bisa ditarik ke bawah sesuai kebutuhan.

Versi Otomatis dengan ARRAYFORMULA

Awalnya saya mencoba memakai ARRAYFORMULA, supaya tidak perlu menarik rumus ke bawah.

Untuk Nama Item di C2:

=ARRAYFORMULA(IF(B2:B="";"";IFERROR(VLOOKUP(B2:B;Master!A:G;7;FALSE);"Tidak ditemukan")))

Untuk ID Item di D2:

=ARRAYFORMULA(IF(B2:B="";"";IFERROR(VLOOKUP(B2:B;Master!A:F;6;FALSE);"Tidak ditemukan")))

Untuk Brand di E2:

=ARRAYFORMULA(IF(B2:B="";"";IFERROR(VLOOKUP(B2:B;Master!A:I;9;FALSE);"Tidak ditemukan")))

Untuk Kondisi di F2:

=ARRAYFORMULA(IF(B2:B="";"";IFERROR(VLOOKUP(B2:B;Master!A:K;11;FALSE);"Tidak ditemukan")))

Dengan cara ini, semua baris otomatis ikut terisi ketika kolom No Urut Data Utama diisi. Tapi setelah dipakai, ternyata ada kasus khusus.

Ketika Data Tidak Ada di Master dan Perlu Diisi Manual

Saat mulai pendataan, saya menemukan kasus seperti ini.

Identitas item ada secara fisik, tetapi ketika dicari di database utama, datanya tidak ditemukan. Bisa jadi karena data belum diperbarui, lokasinya belum sesuai, atau memang perlu dicek ulang.

Masalahnya, kalau kolom memakai ARRAYFORMULA, saya tidak bisa mengetik manual di kolom tersebut. Ketika dipaksa diisi manual, muncul error karena cell itu bagian dari hasil array.

Dari sini saya belajar, untuk pekerjaan pendataan inventaris yang datanya belum sepenuhnya rapi, lebih fleksibel menggunakan rumus biasa per baris, bukan ARRAYFORMULA.

Jadi solusinya:

  1. Hapus rumus ARRAYFORMULA.
  2. Pakai rumus biasa di baris 2.
  3. Tarik rumus ke bawah.
  4. Jika ada data yang perlu diisi manual, hapus rumus di cell tersebut.
  5. Isi manual sesuai hasil pengecekan.

Rumus yang saya pakai akhirnya seperti ini:

C2 - Nama Item

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:G;7;FALSE);""))

D2 - ID Item

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:F;6;FALSE);""))

E2 - Brand

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:I;9;FALSE);""))

F2 - Kondisi

=IF(B2="";"";IFERROR(VLOOKUP(B2;Master!A:K;11;FALSE);""))

Dengan cara ini, kalau ada data yang tidak ditemukan di Master, saya masih bisa mengisi manual di baris tertentu.

Untuk kondisi data inventaris yang masih perlu dirapikan, cara ini terasa lebih aman.

Menandai Data di Master Jika Sudah Diproses

Setelah data dari Master ditarik ke sheet ruangan, saya ingin di sheet Master ada tanda otomatis.

Misalnya nomor 280 di Master adalah item tertentu. Kalau nomor 280 sudah dimasukkan ke sheet 1RuangRapat, maka cell nomor 280 di sheet Master otomatis berubah warna.

Tujuannya agar saya tahu item mana yang sudah diproses dan item mana yang belum.

Caranya menggunakan Format Bersyarat atau Conditional Formatting.

Format Bersyarat untuk Satu Sheet Ruangan

Misalnya sheet Master kolom A adalah No, dan sheet 1RuangRapat kolom B adalah No Urut Data Utama. Saya ingin jika Master!A2 ditemukan di 1RuangRapat!B:B, maka cell tersebut berubah warna.

Awalnya saya mencoba rumus seperti ini:

=COUNTIF('1RuangRapat'!B:B;$A2)>0

Tapi ternyata Google Sheets tidak mengizinkan format bersyarat langsung mengambil referensi dari sheet lain.

Solusinya adalah memakai INDIRECT.

Rumus yang berhasil:

=COUNTIF(INDIRECT("'1RuangRapat'!B:B");$A2)>0

Langkahnya:

  1. Buka sheet Master.
  2. Blok rentang data yang ingin diberi warna, misalnya:
A2:A620
  1. Klik menu:
Format → Format bersyarat
  1. Pada bagian aturan, pilih:
Formula khususnya adalah
  1. Masukkan rumus:
=COUNTIF(INDIRECT("'1RuangRapat'!B:B");$A2)>0
  1. Pilih warna, misalnya hijau.
  2. Klik selesai.

Sekarang, kalau nomor di Master sudah ada di sheet 1RuangRapat, maka cell nomor tersebut akan berubah warna.

Kenapa Saya Pakai A2:A620?

Awalnya saya ingin memakai rentang seperti ini:

A2:A

atau untuk satu baris penuh:

A2:CM

Tapi di bagian format bersyarat, kadang Google Sheets menolak dan muncul pesan:

Masukkan rentang yang valid

Saya juga sempat mencoba:

A2:CM9999

Tetapi tetap tidak bisa.

Kemungkinan karena kolom terakhir yang tersedia atau terbaca di sheet belum sampai CM, atau format rentangnya belum diterima di bagian format bersyarat.

Karena data saya saat ini hanya sekitar 600-an baris, akhirnya saya pakai rentang yang lebih aman:

A2:A620

Artinya, yang berubah warna hanya kolom No, dari baris 2 sampai 620.

Untuk kebutuhan awal, ini sudah cukup. Yang penting saya bisa melihat nomor mana saja yang sudah diproses.

Menambahkan Sheet Ruangan Lain

Setelah berhasil untuk 1RuangRapat, saya ingin menambahkan sheet lain, misalnya:

38RuangServer

Kalau semua sheet ingin diberi warna yang sama, rumusnya bisa digabung memakai OR.

Contohnya:

=OR(COUNTIF(INDIRECT("'1RuangRapat'!B:B");$A2)>0;COUNTIF(INDIRECT("'38RuangServer'!B:B");$A2)>0)

Artinya:

Jika nomor di Master!A2 ditemukan di sheet 1RuangRapat atau 38RuangServer, maka cell tersebut akan berubah warna.

Rumus ini cocok kalau semua ruangan ingin diberi warna yang sama.

Memberi Warna Berbeda untuk Tiap Sheet Ruangan

Setelah dicoba, saya merasa akan lebih enak kalau setiap sheet ruangan punya warna berbeda.

Misalnya:

  • 1RuangRapat = hijau
  • 38RuangServer = kuning atau warna lain

Kalau ingin warna berbeda, jangan memakai rumus OR.

Caranya adalah membuat beberapa aturan Format Bersyarat.

Aturan 1: 1RuangRapat Warna Hijau

Di sheet Master, buat aturan format bersyarat.

Terapkan ke rentang:

A2:A620

Formula khususnya:

=COUNTIF(INDIRECT("'1RuangRapat'!B:B");$A2)>0

Pilih warna hijau, lalu klik selesai.

Aturan 2: 38RuangServer Warna Lain

Tambahkan aturan baru.

Terapkan ke rentang:

A2:A620

Formula khususnya:

=COUNTIF(INDIRECT("'38RuangServer'!B:B");$A2)>0

Pilih warna lain, misalnya kuning, lalu klik selesai.

Dengan cara ini, nomor item di Master akan berubah warna sesuai sheet ruangan tempat nomor tersebut dipakai.

Kalau nanti ada sheet lain, tinggal tambah aturan baru lagi.

Misalnya:

=COUNTIF(INDIRECT("'NamaSheetLain'!B:B");$A2)>0

Lalu pilih warna lain sesuai kebutuhan.

Catatan tentang Nama Sheet

Saya memakai nama sheet tanpa spasi, misalnya:

1RuangRapat
38RuangServer

Menurut saya ini lebih aman dan mudah dipakai di rumus.

Tapi walaupun tanpa spasi, saya tetap menulis nama sheet di dalam tanda petik seperti ini:

INDIRECT("'1RuangRapat'!B:B")

Ini untuk menghindari error, terutama karena nama sheet diawali angka.

Jika Satu Nomor Muncul di Dua Sheet

Idealnya, satu nomor item hanya masuk ke satu sheet ruangan.

Tapi kalau ternyata satu nomor masuk di dua sheet sekaligus, warna yang tampil bisa mengikuti aturan format bersyarat yang posisinya lebih atas atau lebih dominan di daftar aturan.

Jadi untuk menjaga data tetap rapi, saya harus hati-hati agar satu nomor tidak tercatat di dua ruangan berbeda, kecuali memang sedang dalam proses pengecekan.

Alur Kerja yang Saya Pakai

Setelah beberapa kali coba dan error, alur kerja yang saya pakai kira-kira seperti ini:

  1. Siapkan sheet Master dari database item.
  2. Siapkan sheet Daftar_Ruangan.
  3. Beri nomor dan nama untuk tiap ruangan agar mudah dilacak.
  4. Lakukan pengecekan fisik ke tiap ruangan.
  5. Catat hasil pengecekan secara manual di tabel/form pendataan.
  6. Masukkan hasil catatan tersebut ke sheet Cek_Fisik atau sheet ruangan.
  7. Input data tidak harus urut dari ruangan nomor 1, tetapi mengikuti ruangan mana yang sudah selesai dicek lebih dulu.
  8. Buat dropdown kode ruangan di sheet Cek_Fisik.
  9. Buat nama ruangan otomatis muncul berdasarkan kode ruangan.
  10. Buat sheet per ruangan, misalnya 1RuangRapat dan 38RuangServer.
  11. Isi No Urut Data Utama di sheet ruangan.
  12. Nama item, ID item, brand, dan kondisi otomatis ditarik dari sheet Master.
  13. Jika data tidak ditemukan di Master, isi manual di cell tertentu.
  14. Di sheet Master, buat format bersyarat untuk menandai nomor yang sudah diproses.
  15. Jika ingin beda warna tiap ruangan, buat aturan format bersyarat masing-masing sheet.

Dengan alur ini, pekerjaan menjadi lebih masuk akal. Saya tidak langsung memaksa data di spreadsheet harus benar semua. Saya mulai dari kondisi nyata dulu, lalu membandingkannya dengan database utama.

Kesimpulan Sementara

Dari proses ini saya belajar bahwa merapikan data inventaris tidak cukup hanya dengan melihat data di sistem. Tetap harus dicocokkan dengan kondisi nyata di ruangan.

Google Spreadsheet cukup membantu untuk tahap awal, terutama untuk:

  • membuat dropdown kode ruangan,
  • menarik nama ruangan otomatis,
  • mengambil data item dari database utama,
  • menandai data yang sudah diproses,
  • dan memudahkan pengecekan per ruangan.

Penomoran ruangan juga cukup membantu. Jadi meskipun input data tidak harus urut dari ruangan nomor 1, setiap data tetap bisa dilacak berdasarkan nomor dan nama ruangan yang sudah dibuat sebelumnya.

Untuk data yang sudah rapi, ARRAYFORMULA memang enak karena otomatis. Tapi untuk data inventaris yang masih banyak kemungkinan tidak cocok antara database dan kondisi fisik, rumus biasa per baris lebih fleksibel karena masih bisa diisi manual jika diperlukan.

Ini baru tahap awal. Setidaknya saya mulai punya alur yang lebih jelas untuk merapikan data inventaris kantor pelan-pelan, dimulai dari pendataan per ruangan, lalu dicocokkan dengan database utama.

Semoga catatan ini bermanfaat, terutama buat saya sendiri kalau nanti lupa langkah-langkahnya.

Belajar Akses SSH Server dari Luar Jaringan

🎯 Akses SSH Server STB dari Luar Jaringan (Cloudflare Tunnel) + Tips Keamanan

🎯 Akses SSH Server STB dari Luar Jaringan (Cloudflare Tunnel) + Tips Keamanan

Saya masih belajar dan nyoba-nyoba. Dulu kalau bingung harus googling, baca-baca, tanya-tanya di forum. Sekarang alhamdulillah belajar lebih mudah karena bisa langsung dipandu sama GPT—jadi step by step-nya lebih jelas dan cepat dipraktekin.

Target saya di catatan ini: bisa remote SSH ke server STB Armbian + CasaOS dari luar rumah tanpa ribet buka port di modem/ISP. Solusinya pakai Cloudflare Tunnel + domain sendiri (contoh: ssh.domainkita.com).


1) Setting Cloudflare Tunnel di Server

Edit file /etc/cloudflared/config.yml. Gunakan TCP mode untuk SSH (penting!):

tunnel: 12345678-abcd-4321-efgh-9876543210ab
credentials-file: /root/.cloudflared/12345678-abcd-4321-efgh-9876543210ab.json

ingress:
  - hostname: casa.domainkita.com
    service: http://localhost:80
  - hostname: n8n.domainkita.com
    service: http://localhost:5678
  - hostname: ssh.domainkita.com
    service: tcp://localhost:22
  - service: http_status:404

Ganti 12345678-abcd-4321-efgh-9876543210ab dengan Tunnel ID kamu sendiri. Berlaku juga nanti saat mengisi “Target” di DNS (format: TUNNEL_ID.cfargotunnel.com).

Restart service biar config terbaca:

sudo systemctl restart cloudflared
sudo systemctl status cloudflared --no-pager -l

Contoh “screenshot” output (dummy):

● cloudflared.service - cloudflared
     Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled)
     Active: active (running) since Wed 2025-09-10 04:42:44 UTC
   Main PID: 28406 (cloudflared)
      Tasks: 9
Sep 10 04:42:44 cloudflared[28406]: INF Registered tunnel connection ... protocol=quic location=sin13
Sep 10 04:42:45 cloudflared[28406]: INF Registered tunnel connection ... protocol=quic location=sin09

2) Tambahkan DNS Record di Cloudflare

Masuk dashboard Cloudflare → menu DNS → tambah CNAME:

  • Name: ssh
  • Target: 12345678-abcd-4321-efgh-9876543210ab.cfargotunnel.com
    (Ganti 12345678-... dengan Tunnel ID kamu → TUNNEL_ID.cfargotunnel.com)
  • Proxy status: Proxied (ikon awan oranye)

Cek dari server:

dig +short CNAME ssh.domainkita.com
dig +short A ssh.domainkita.com

Kalau keluar IP Cloudflare (104.xx, 172.xx), berarti DNS sudah resolve OK.


3) Install cloudflared di Laptop/PC Client

Kita butuh agent cloudflared di sisi client supaya koneksi SSH bisa “diterowongkan” lewat Cloudflare.

Windows

  1. Download cloudflared.exe dari situs resmi Cloudflare.
  2. Buat folder C:\cloudflared dan taruh cloudflared.exe di sana.
  3. Tambahkan ke PATH:
    • Buka Start → ketik Environment Variables → pilih Edit the system environment variables.
    • Klik Environment Variables….
    • Di System variables → pilih PathEditNew.
    • Isi: C:\cloudflared → OK semua.
    • Tutup semua CMD/PowerShell yang terbuka, lalu buka lagi.
  4. Cek versi:
cloudflared --version

Linux

sudo apt-get install cloudflared
cloudflared --version

4) Jalankan Tunnel dari Client

Di laptop/PC (Windows/Linux), jalankan ini untuk bikin “listener” di port lokal 2222:

cloudflared access tcp --hostname ssh.domainkita.com --url localhost:2222

Maksudnya: koneksi ke ssh.domainkita.com akan diteruskan ke localhost:2222 di laptop.


5) Akses SSH Seperti Biasa

Buka terminal baru, lalu:

ssh root@localhost -p 2222

Contoh “screenshot” output (dummy):

The authenticity of host '[localhost]:2222' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
root@localhost's password:
Welcome to Armbian 25.5 (bookworm) on aml-s9xx-box
Last login: Wed Sep 10 06:28:56 2025 from 127.0.0.1

Kalau sudah masuk shell server, artinya akses SSH dari luar jaringan berhasil 🎉.


Diagram Alur

Client (Laptop)
   |
   | SSH -> localhost:2222
   v
cloudflared (client)
   |
   | Tunnel terenkripsi via Cloudflare
   v
Cloudflare Edge
   |
   | Forward TCP -> server
   v
cloudflared (server) -> sshd (localhost:22)

Tips Keamanan SSH (Wajib kalau Publik)

1) Ubah port SSH default

Misalnya ganti ke 22222. Edit /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config
# ubah/aktifkan baris:
Port 22222

Restart SSH:

sudo systemctl restart ssh

Jangan lupa sesuaikan config.yml:

  - hostname: ssh.domainkita.com
    service: tcp://localhost:22222

2) Gunakan SSH Key (disable password login)

Di laptop/PC, buat key (kalau belum ada):

ssh-keygen -t ed25519 -C "ssh-remote-tunnel"
# tekan Enter terus atau set passphrase sesuai kebutuhan

Kirim public key ke server:

ssh-copy-id -p 2222 root@localhost
# kalau port server diganti 22222:
# ssh-copy-id -p 2222 -o "ProxyCommand=none" root@localhost

Disable password login di server (/etc/ssh/sshd_config):

PermitRootLogin prohibit-password
PasswordAuthentication no

Restart SSH lagi:

sudo systemctl restart ssh

Setelah ini, login hanya bisa dengan key → jauh lebih aman.

3) (Opsional) Buat alias di ~/.ssh/config

Biar lebih simple, kita bisa bikin profile:

Host stb
  HostName localhost
  Port 2222
  User root
  IdentityFile ~/.ssh/id_ed25519

Setelah itu, cukup jalankan:

ssh stb

Penutup

Awalnya saya kira rumit, tapi ternyata setelah dipandu step-by-step sama GPT, semuanya jadi lebih jelas. Sekarang saya bisa remote server STB/Armbian dari mana saja dengan domain sendiri, tanpa buka port router—lebih aman dan rapi.

Belajar Setting Webhook Telegram di n8n + Cloudflare Tunnel

Belajar Setting Webhook Telegram di n8n + Cloudflare Tunnel

Setting Webhook Telegram di n8n + Cloudflare Tunnel

Hari ini saya mau berbagi pengalaman pribadi saya ketika belajar menghubungkan Telegram dengan n8n. Prosesnya lumayan panjang, ada error sana-sini, tapi alhamdulillah akhirnya bisa jalan juga. Yang nemenin saya belajar? Ya si ChatGPT ini 😅, sabar banget dipake tanya bolak-balik.

Awal Cerita

Jadi ceritanya saya sudah punya n8n yang bisa diakses lewat domain publik https://n8n.domain-saya.com (disini saya pakai subdomain di Cloudflare Tunnel). Targetnya: bikin workflow sederhana dengan Telegram Trigger. Intinya kalau saya kirim pesan ke bot, n8n bisa nangkep.

Setting Webhook Telegram di n8n

Masalah Pertama: Webhook masih localhost

Waktu saya coba aktifkan workflow, ternyata error:

Bad Request: bad webhook: An HTTPS URL must be provided for webhook

Lha jelas, webhook-nya masih ke http://localhost:5678/.... Padahal Telegram cuma mau nerima HTTPS URL publik. Di sini ChatGPT nyaranin saya untuk menambahkan beberapa environment variables di container n8n.

Set Environment Variables

Saya buka CasaOS → App n8n → Settings → Environment Variables, lalu saya tambahkan:

N8N_PUBLIC_URL=https://n8n.domain-saya.com
WEBHOOK_URL=https://n8n.domain-saya.com
N8N_HOST=n8n.domain-saya.com
N8N_PROTOCOL=https

Habis itu saya restart container n8n. Begitu buka lagi workflow, Webhook URL-nya sudah berubah jadi pakai domain HTTPS saya. Mantap!

Hapus Webhook Lama di Telegram

Supaya Telegram nggak nyangkut di webhook lama, saya hapus dulu dengan command:

curl -s "https://api.telegram.org/bot<TOKEN>/deleteWebhook"

Lalu cek apakah kosong:

curl -s "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"

Kalau hasilnya "url": "" berarti sudah aman.

Daftarkan Webhook Baru

Langkah selanjutnya, saya daftarkan webhook ke URL produksi n8n. Formatnya gini:

curl -s "https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://n8n.domain-saya.com/webhook/<WEBHOOK_ID>/webhook"

<WEBHOOK_ID> ini ID unik workflow saya (otomatis ada di n8n). Begitu jalan, saya cek lagi:

curl -s "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"

Hasilnya sudah ada URL HTTPS domain saya sendiri. YES! 🚀

Uji Coba

Saya coba kirim pesan ke bot Telegram saya. Dan bener aja, di n8n → Executions langsung muncul workflow run. Rasanya puas banget, karena dari error “bad webhook” akhirnya bisa solved.

Diagram Alur Webhook Telegram ke n8n

Biar kebayang alurnya:

User kirim pesan Telegram Server Telegram Webhook call Cloudflare Tunnel n8n.your-domain.com n8n http://localhost:5678 Workflow jalan Trigger → Nodes

Contoh Hasil Executions di n8n

Kalau webhook Telegram sudah berhasil, di tab Executions n8n bakal muncul log baru setiap ada pesan masuk. Kira-kira tampilannya seperti ini (dummy data):

Execution #123

Status: ✅ Success

Started: 2025-09-04 15:12:33

Finished: 2025-09-04 15:12:34


Input Data (Telegram Trigger)

{
  "update_id": 987654321,
  "message": {
    "message_id": 45,
    "from": {
      "id": 11223344,
      "is_bot": false,
      "first_name": "Budi"
    },
    "chat": {
      "id": 11223344,
      "type": "private"
    },
    "date": 1725436353,
    "text": "Halo n8n!"
  }
}
  

Output Data (Set Node)

{
  "username": "Budi",
  "message": "Halo n8n!",
  "isStudent": true
}
  

Insight Buat Saya

  • n8n butuh tahu URL publik → atur di environment variables.
  • Telegram cuma mau HTTPS → makanya perlu domain + Cloudflare Tunnel.
  • Webhook lama harus dihapus → biar nggak nyangkut.
  • Proses belajar sambil trial-error itu seru, apalagi kalau ada ChatGPT jadi mentor dadakan 😆

Penutup

Itu catatan belajar hari ini. Semoga bermanfaat buat yang lagi belajar juga. Kalau ada yang bingung, santai aja... error itu bagian dari belajar 😁

Menghubungkan CasaOS ke Cloudflare Tunnel dengan Subdomain Kustom

Panduan Lengkap: Menghubungkan CasaOS ke Cloudflare Tunnel dengan Subdomain Kustom

Ringkas: Menghubungkan CasaOS dan aplikasi (mis. n8n) ke internet secara aman tanpa port forwarding menggunakan Cloudflare Tunnel dan subdomain kustom (contoh: casa.example.com, n8n.example.com).

CasaOS ke Cloudflare Tunnel dengan Subdomain Kustom

Langkah ini sudah berhasil saya terapkan (coba-coba dipandu GPT), saya tulis disini untuk catatan pas besok mau nyoba-nyoba lagi.

CasaOS Cloudflare Tunnel Self-Hosting n8n STB Armbian

1) Persiapan

  • Domain aktif di Cloudflare (contoh: example.com)
  • Akses root ke server (CasaOS di STB/mini PC)
  • Akun Cloudflare (gratis)

2) Instalasi Cloudflared (Connector)

Opsi A — CasaOS App Store: praktis, klik-install, cocok pemula (umumnya 1 tunnel/token).

Opsi B — Command Line (disarankan): fleksibel, bisa multi-subdomain dalam 1 tunnel melalui config.yml.

Install Cloudflared (Debian/Armbian)
# Tambah repository Cloudflare
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# Update & install
sudo apt-get update && sudo apt-get install -y cloudflared

# Cek versi
cloudflared --version

3) Login ke Cloudflare

Login (menghasilkan cert.pem)
cloudflared tunnel login
# Buka URL yang muncul -> pilih akun & domain (example.com)
# Setelah sukses, kredensial origin tersimpan di: /root/.cloudflared/cert.pem

4) Buat Tunnel Lokal

Buat tunnel bernama: unified-tunnel
cloudflared tunnel create unified-tunnel
# Catat Tunnel ID (UUID), misal:
# abcd1234-ef56-7890-abcd-1234567890ef
# File JSON otomatis dibuat di:
# /root/.cloudflared/abcd1234-ef56-7890-abcd-1234567890ef.json

5) Tulis config.yml (Ingress Rules)

/etc/cloudflared/config.yml
sudo nano /etc/cloudflared/config.yml
Contoh isi config.yml
tunnel: abcd1234-ef56-7890-abcd-1234567890ef
credentials-file: /root/.cloudflared/abcd1234-ef56-7890-abcd-1234567890ef.json

ingress:
  - hostname: casa.example.com
    service: http://localhost:80
  - hostname: n8n.example.com
    service: http://localhost:5678
  - service: http_status:404
Validasi config
cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate

6) Hubungkan DNS → Tunnel

Pastikan tidak ada record lama/duplikat untuk casa.example.com dan n8n.example.com. Jika ada, hapus dulu di Dashboard Cloudflare → DNS.

Buat CNAME otomatis ke Tunnel ID
cloudflared tunnel route dns abcd1234-ef56-7890-abcd-1234567890ef casa.example.com
cloudflared tunnel route dns abcd1234-ef56-7890-abcd-1234567890ef n8n.example.com

7) Menjalankan Tunnel

Test manual (foreground)

Run (test)
cloudflared tunnel --config /etc/cloudflared/config.yml run
# Jika sukses: biarkan berjalan (uji akses), lalu Ctrl+C untuk stop

Jadikan service (otomatis saat reboot)

/etc/systemd/system/cloudflared.service
sudo nano /etc/systemd/system/cloudflared.service
Isi ExecStart (pakai config.yml)
[Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate --config /etc/cloudflared/config.yml tunnel run
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
Enable & start sebagai service
sudo systemctl daemon-reload
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared --no-pager -l

8) Uji Akses

  • https://casa.example.com → CasaOS
  • https://n8n.example.com → n8n

Diagram Alur (Flow)

Browser User casa.example.com / n8n.example.com Cloudflare Edge CDN & Security Cloudflare Tunnel abcd1234-...-90ef CasaOS http://localhost:80 n8n http://localhost:5678

Perbandingan Metode

Install Cloudflare: CasaOS vs Command Line

MetodeKelebihanKekurangan
CasaOS App StorePraktis, klik-installUmumnya hanya 1 tunnel/token, fleksibilitas terbatas
Command LineFleksibel, multi-subdomain dalam 1 tunnel via config.ymlButuh kenyamanan dengan CLI

1 Tunnel untuk Banyak Subdomain vs 1 Tunnel per Subdomain

MetodeKelebihanKekurangan
1 Tunnel → Multi-Subdomain Hemat resource, 1 service & 1 file config Jika tunnel down, semua subdomain terdampak
1 Tunnel per Subdomain Isolasi layanan lebih baik Lebih kompleks, banyak service & manajemen

Kesimpulan

Dengan Cloudflare Tunnel, Anda dapat memublikasikan CasaOS dan aplikasi seperti n8n ke internet aman, stabil, dan tanpa port forwarding. Untuk kebanyakan skenario self-hosting rumahan, pendekatan 1 tunnel untuk banyak subdomain paling praktis.

Tips: Backup /etc/cloudflared/config.yml dan file kredensial JSON tunnel. Jika reinstall, cukup restore berkas-berkas itu, lalu start service.

Tag

CasaOS, Cloudflare Tunnel, Self-Hosting, n8n, STB Armbian, Server Rumah

Cara Reset Password CasaOS yang Lupa dengan Mudah

Cara Reset Password CasaOS yang Lupa dengan Mudah (Tanpa Install Ulang)

Kemarin saya sempat bingung banget gara-gara lupa password CasaOS di perangkat kecil yang sudah saya install Armbian + CasaOS. Udah coba berbagai cara manual, utak-atik database, sampai ikutin perintah reset bawaan… tapi tetep aja gagal login. 😅

Reset Password CasaOS


Akhirnya saya coba cari di YouTube. Ketemu video ini 👉 Tutorial Reset Password CasaOS

Nah, dari video itu diarahkan ke GitHub: 👉 BigBearTechWorld Reset Password Script

Saya ikutin persis langkahnya… dan akhirnya berhasil! 🎉

Langkah Reset Password CasaOS

  1. Login dulu ke Armbian lewat SSH.
  2. Jalankan perintah ini di terminal:
    bash -c "$(wget -qLO - https://raw.githubusercontent.com/bigbeartechworld/big-bear-scripts/master/reset-password-for-casaos/run.sh)"
      
  3. Tunggu proses selesai → nanti akan muncul info username dan password baru di layar.

Hasilnya

Begitu script selesai jalan, saya bisa login lagi ke CasaOS pakai password hasil reset. Gampang banget, tanpa perlu ngoprek database manual atau install ulang. 🙌

Penutup

Kalau kamu juga lagi ngalamin lupa password CasaOS, cobain cara ini deh. Simpel dan langsung bisa dipakai. 👍

Pulsa Gratis Dari Telkomsel

Pulsa Gratis Dari Telkomsel. Postingan ini, inyonk mau bagi-bagi info gratisan. Gratisan pulsa 50K dari Telkomsel untuk 7 Hari.

Caranya ?

1. Download aplikasi My Telkomsel
2. Install aplikasi ditas

Pulsa Gratis Dari Telkomsel


3. Daftarkan No. Telkomsel kamu
4. Tunggu SMS kode verifikasi
5. Masukan kode verifikasi tersebut di Aplikasi yang sudah terinstall
6. Verifikasi sukses 

Pulsa Gratis Dari Telkomsel


7. Tutup
8. Buka lagi aplikasinya.
9. Silahkan cek. Pulsa akan terkirim dinomor yang telah didaftarkan.

Bukti Pulsa Masuk


Pulsa Gratis Dari Telkomsel


*Ayo segera dicoba, sebelum kehabisan.
** 11 April 2016 cara diatas berhasil ane buktikan.


Cara Menyimpan Catatan Penting di Grup WhatsApp

Cara Menyimpan Catatan Penting di Grup WhatsApp.

Banyak gabung grup WhatsApp, akhirnya tidak semua isi grup dapat terbaca satu-persatu. Pas nemuin isi grup ada tulisan ataupun arikel bagus, mau dibaca pas lagi sibuk, mau copy paste ke note ribet.

yah...  :(



Adakah caranya agar kita bisa lebih mudah menandai dan menemukan kembali artikel yang kita sukai itu ?

ada bos, inyonk coba tulis Cara Menyimpan Catatan Penting di Grup WhatsApp dibawah ini.



Cara Menyimpan adalah seperti berikut ini :



1. Pilih artikel / catatan yang akan disimpan.



2. Klik dan tahan artikel itu sampai berubah agak biru. Klik tanda bintang yang ada diatas.




 3. beres

udah gitu aja ?

iya bos, gitu aja.


Cara menemukanya kembali adalah sepeti berikut ini :

1. Kembali home WA

2. Klik pengaturan ( kiri bawah ) perhatikan ada muncul tulisan " pesan berbintang / Starred Messages " . Klik aja yang itu.


3. Semua tulisan, artikel yang sudah ditandai bintang di grup akan muncul dan terkumpul di situ.



 Dengan demikian Anda akan mudah mencari dan membacanya kapan saja.

semoga info Cara Menyimpan Catatan Penting di Grup WhatsApp diatas bermanfaat ya Bos.

www.CodeNirvana.in

Online Sejak 2013 Dwi Yanto | Blogger Templates | Designed By Code Nirvana