Mengisi Google Form Secara Periodik
Google Form menanjak popularitasnya setahun belakangan ini. Setidaknya yang penulis rasakan. Tidak mengherankan sebab ia memang menawarkan kemudahan penggunaan, baik saat menjadi pemilik formulir maupun pihak yang disurvei. Salah satu skenario unik dari Google Form adalah permintaan pengisian survei yang sama secara berkala. Hal itu menimbulkan situasi berulang, tidak banyak berpikir dan menggunakan komputer. Kombinasi yang tepat untuk diotomasi.
import requests data = { 'entry.1272279265': 'Opsi A' } url = 'https://docs.google.com/forms/u/0/d/e/change_this_part_with_valid_url/formResponse' requests.post(url, data=data)
Latar Belakang
Lari kemanapun dengan segera kita akan kepentok dengan Google Form. Pendaftaran webinar, presensi sekolah, survei untuk penelitian adalah beberapa yang kerap memanfaatkan jasa Google Form.
Kita mengalami masa-masa indah bersama Google Form, mendapatkan sertifikat kegiatan, membantu penelitian teman, tidak mengecewakan guru karena banyak yang mengisi presensi dan banyak hal baik lainnya.
Namun ada kalanya kita harus mengalami masa-masa membosankan bersama Google Form. Melakukan presensi kelas empat kali sehari, misalnya, adalah pekerjaan yang pasti menantang kesabaran.
Untungnya (atau celakanya, tergantung siapa yang melihat situasi ini) jenis kegiatan tersebut dapat diotomasi dengan sedikit kode dan komputer yang menyala di waktu-waktu yang dibutuhkan.
Teknologi Digunakan
Requests
Library Python yang elegan dan simpel untuk menangani HTTP, untuk manusia. Penggunaan requests relatif simpel, penulis sendiri lebih menyukai penggunaan requests (alih-alih Scrapy maupun Selenium) sepanjang proyek yang ditangani memungkinkan untuk itu.
Requests dibutuhkan untuk berinteraksi dengan Google Form, lebih tepatnya mengisi inputan atau pilihan pada formulir.
Cron Job
Kita (akan) punya kode yang bertugas mengisi formulir. Sekarang yang dibutuhkan adalah alat untuk menjalankan kode tersebut sesuai jadwal. Jawabannya adalah Cron Job.
Cron atau Cron Job akan menjalankan secara periodik kode python yang kita buat.
12 13 * * * /usr/bin/python kode_dibuat.py
Kode di atas adalah contoh cron job pada sistem operasi berbasis *nix. Yang artinya pada menit ke-12 pukul 13 setiap hari (bintang pertama) setiap bulan (bintang kedua) setiap hari (dalam seminggu) (bintang ketiga) jalankan script kode_dibuat.py menggunakan program python (yang berada di /usr/bin/python).
Jika menggunakan sistem operasi Windows kita dapat menggunakan Windows Task Scheduler untuk mencapai tujuan yang sama.
Kode
Sederhana
Kita akan berlatih dengan formulir sederhana yang hanya berisi satu pertanyaan saja. Formulir ini dapat diakses di sana.
entry.
Suatu formulir online pasti butuh tempat untuk menangkap inputan pengguna. Formulir bersahaja yang kita gunakan hanya memiliki satu input, yaitu Pertanyaan Opsional yang bisa dijawab dengan Opsi A atau Opsi B. Pertanyaannya, apakah nama input tersebut?
Semua input pada Google Form diberi nama berawalan entry. (huruf e-n-t-r-y dan tanda baca titik). Karena itu pada element Inspector (Ctrl+Shift+I pada Firefox di Windows) cukup lakukan pencarian menggunakan kata kunci entry.
Kita akan mendapatkan input bernama entry.1272279265. Input tersebut akan berisi value, yang berubah sesuai dengan pilihan yang kita ambil. Misal jika memilih Opsi A maka value akan sama dengan Opsi A. Jika pilihan diubah menjadi Opsi B maka value akan berubah juga.
Sekarang kita tahu value pada input bernama entry. adalah yang perlu kita perhatikan.
action
Data pada formulir perlu dikirimkan ke suatu tempat, dimanakah itu?
Alamat pengiriman ada di atribut action pada tag form, yang merupakan hirarki di atas input entry. Pada gambar adalah https://docs.google.com/forms/d/e/1FAIpQLScuxcQ3TXqrIn6_7Pe8lJDieWJHipT9vUR6Jn7KZ5RrzvZscg/formResponse.
Kode
Kode yang dibutuhkan sangat minim. Hanya seperti ini saja.
import requests data = { 'entry.1272279265': 'Opsi A' } url = 'https://docs.google.com/forms/u/0/d/e/1FAIpQLScuxcQ3TXqrIn6_7Pe8lJDieWJHipT9vUR6Jn7KZ5RrzvZscg/formResponse' requests.post(url, data=data)
Baris pertama untuk me-load library requests. Baris selanjutnya berisi nama input (berawalan entry.) yang akan diisi beserta value untuk mengisinya. Baris url berisi alamat data akan dikirimkan, yang kita dapatkan dari tag action. Dan baris terakhir adalah perintah agar library requests mengirimkan data ke alamat yang dituju.
Bila kode dijalankan dan kita mendapat response 200 artinya data berhasil dikirimkan.
Pertanyaan Opsional
Sekarang kita simulasikan macam-macam jenis input dan perubahan.
Gambar sebelah kiri dan kanan seperti yang dibahas sebelumnya, yang penting kita catat name dan value (entry.xxx dan Opsi A) karena itu yang akan digunakan dalam kode.
data = { 'entry.601953455': 'Opsi A' }
Bagian lain dari kode, sebelum dan setelah variabel data, tidak perlu diubah.
Bagaimana jika inputan memungkinkan bukan hanya opsi, namun teks, yang dapat diisi apa saja? Langkah pertama adalah dengan coba mengetik teks tertentu, dan melihat elemen mana saja yang berubah.
Di bawah ini, setelah mengisi kata “lorem” pada inputan other, kita akan melihat bahwa input bernama entry.60195345 akan bernilai __other_option__ dan muncul elemen input baru bernama entry.60195345.other_option_response yang memiliki value “lorem“.
Kode akan berganti menjadi seperti ini.
data = { 'entry.601953455': '__other_option__', 'entry.601953455.other_option_response': 'lorem', }
Intermezzo
Karena jawaban berupa pilihan (Opsi A, Opsi B, Opsi C) diketik, bukan diklik, muncul pertanyaan (atau ide). Bagaimana jika kita menambahkan pilihan baru, misal Opsi Z namun tidak melalui other option?
data = { 'entry.601953455': 'Opsi Z' }
Ternyata tydac bisa. Kita akan mendapat response 400 jika mencoba mengirimkan Opsi selain yang disediakan. Jika berposisi sebagai pembuat form, kita dapat bernapas lega karena tahu responden tidak dapat menjawab selain yang kita sediakan.
Pertanyaan Pilih Banyak
Bentuk isian lain adalah pilihan yang dapat dipilih lebih dari satu. Seperti sebelumnya, untuk mengetahui nama elemen yang digunakan, coba klik/pilih salah satu opsi dan perhatikan elemen yang berubah pada Element Inspector. Dalam contoh di bawah ini, entry.1655166292 adalah elemen yang kita cari.
Bagaimana jika dua pilihan diambil, seperti Opsi 1 dan Opsi 3? Ternyata entry.1655166292 muncul dua kali pada Element Inspector.
data = { 'entry.1655166292': 'Opsi 1', 'entry.1655166292': 'Opsi 3' }
Sayangnya jika menggunakan kode di atas, hanya satu pilihan (Opsi 3) yang akan diterima oleh formulir. Hal itu terjadi karena variabel data adalah dictionary yang menggunakan key sebagai index. Pada contoh, entry.1655166292 adalah key. Menurut python, key haruslah unik sehingga jika ditemukan key yang sama, hanya satu yang akan digunakan.
Solusi soalan itu adalah dengan menggunakan list berisi pilihan yang diambil sebagai value dari key entry.1655166292.
data = { 'entry.1655166292': ['Opsi 1', 'Opsi 3'] } requests.post(url, data=data)
Sama seperti sebelumnya, kita dapat pula menambahkan pilihan kita sendiri, melalui Other.
Seperti terlihat pada gambar, entry.1655166292.other_option_response berisi teks “ipsum” yang kita inginkan. Selain itu entry.1655166292 bertambah, menjadi 3, dan bernilai “__other_option__” pada elemen ketiga. Sehingga kode dimodifikasi menjadi seperti ini.
data = { 'entry.1655166292': ['Opsi 1', 'Opsi 3', '__other_option__'], 'entry.1655166292.other_option_response': 'ipsum' } requests.post(url, data=data)
Pilihan dalam Dropdown
Elemen yang digunakan adalah entry.1798163604 dan valuenya Pilihan 2, kode dipakai.
data = { 'entry.1798163604': 'Pilihan 2' } requests.post(url, data=data)
Di sisi pemilik formulir, begini yang akan terlihat.
Pertanyaan dengan Skala
Di tiitk ini kita sudah mulai bosan karena tidak ada pengetahuan baru, pelbagai jenis inputan yang ditemui, cara penanganannya sama saja. Sebab itu untuk selanjutnya, sampai ditemukan bagian yang menarik, akan disediakan kode dan hasil tangkapan layar jika kode dijalankan.
data = { 'entry.1454073696': '2' } requests.post(url, data=data)
Banyak Pilihan, Pilih Satu
Meski memiliki banyak baris dengan masing-masing baris memiliki opsi yang dapat dipilih namun tiap baris memiliki nama entry. sendiri-sendiri sehingga tiap baris dianggap sebagai satu inputan mandiri. Karena itu kode yang digunakan seperti di bawah ini.
data = { 'entry.376787985': 'Kolom A', 'entry.23460488': 'Kolom B' } requests.post(url, data=data)
Banyak Pilihan, Pilih Banyak
Ini adalah pertanyaan pilih banyak, dengan banyak baris. Berbekal pengetahuan yang telah kita dapatkan, mudah untuk menaklukkan tantangan jenis ini.
data = { 'entry.640376831': ['Kolom A', 'Kolom B'], 'entry.1902905673': ['Kolom B', 'Kolom C'] } requests.post(url, data=data)
Tanggal
Inputan tanggal sedikit menarik. Jika kita melihat elemen yang digunakan menampung, nama entry. akan ditambah dengan _year, _month dan _day. Masing-masing akan menjadi inputan tersendiri.
data = { 'entry.2111421903_year': '2021', 'entry.2111421903_month': '8', 'entry.2111421903_day': '12' } requests.post(url, data=data)
Waktu
Waktu pada Google Form ditampilkan dalam format 12 jam dengan penanda Ante Meridiem dan Post Meridiem (AM/PM). Namun jika dilihat pada elemen yang menampungnya, terlihat bahwa format waktu yang digunakan adalah 24 jam sehingga 01:01 PM akan bernilai 13:01.
Sama seperti inputan untuk tanggal, nama elemen pada inputan waktu akan diakhiri _hour dan _minute.
AM
PM
data = { 'entry.783101886_hour': '13', 'entry.783101886_minute': '01' } requests.post(url, data=data)
Teks Pendek
Inputan teks pendek, seperti biasa, hanya membutuhkan nama elemen dan teks yang akan diisikan. Kembali tidak menarik, secara konsep maupun kode.
data = { 'entry.1444066256': 'Ini adalah teks pendek' } requests.post(url, data=data)
Teks Panjang
Inputan teks panjang mengamini inputan teks pendek, sama-sama tidak menantang.
data = { 'entry.1502879167': 'Ini adalah teks panjang' } requests.post(url, data=data)
Simpulan
Mengotomasi input pada Google Form, secara mengejutkan, hanya butuh sedikit sekali kode. Cukup 4 baris kode.
Yang utama diperhatikan adalah nama elemen (berawalan entry.) dan value yang akan diisi ke dalam formulir.
Response 200 menunjukkan data berhasil dikirimkan dan tercatat.
Response 400 berarti data yang dikirimkan tidak sesuai keinginan pemilik formulir, dan tidak dicatat.
Referensi
- https://www.influencive.com/why-do-google-forms-emerge-as-one-of-the-top-survey-creator-platform-for-teachers-businesses-and-researchers/
- https://trends.builtwith.com/widgets/Google-Forms
- https://medium.com/swlh/automatically-filling-multiple-responses-into-a-google-form-with-selenium-and-python-176340c5220d
- https://dev.to/jamesshah/how-i-automated-the-google-form-filling-for-my-college-attendance-using-python-3ao1
Cover Photo by Alexander Schimmeck on Unsplash
Berlangganan
Suka tulisan di sini? Silahkan mengisi formulir di bawah ini untuk berlangganan agar kami dapat mengirim pemberitahuan tulisan baru.