Ekspor Formulir Google secara otomatis ke Notion menggunakan IFTTT dan Django

Hari baik untuk semua! Saya pikir artikel ini akan menarik bagi semua orang yang menggunakan Notion, tetapi karena alasan tertentu tidak bisa bergerak sepenuhnya.

Prasejarah


Saya sedang mengembangkan proyek saya . Pada halaman arahan setelah memasukkan email, tautan ke survei sosial berdasarkan Formulir Google dikeluarkan. Respons dicatat di papan nama di Google Drive.

Masalahnya adalah bahwa semua yang saya bawa saya tetap di Notion. Itu klise lebih nyaman. Ditangani oleh copy-paste, sementara ada beberapa ulasan. Lalu ada lebih banyak dari mereka - dan perlu untuk menemukan sesuatu. Siapa yang peduli dengan apa yang terjadi - selamat datang di kucing.

Masalah


Google Forms hanya menjawab jawaban di papan nama - yaitu, tidak ada resep lain di sini. Karena itu, saya punya rencana: mari kita dengarkan melalui IFTTT untuk pembaruan tablet, kirim data baru ke webhook, proseskan entah bagaimana dan unggah ke Notion.

Bagi mereka yang tidak terbiasa dengan IFTTT: ini adalah layanan yang memungkinkan Anda membuat rantai tindakan. Katakanlah, "pos tersebut datang dalam telegram" - "kami mengekspornya di VKontakte".

Rencananya mulai gagal: Notion tidak memiliki API resmi. Tetapi seseorang membalikkannya dan membuat API tidak resmi .

gambar

Rencana akhirnya adalah ini:

  • Kami membuat applet di IFTTT: “Sebuah baris telah ditambahkan ke tablet - kirimkan ke server
  • Kami membuat langsung server yang menerima data dan mengirimkannya ke Notion

Masalah kedua muncul ketika ternyata IFTTT telah merusak integrasi dengan Google Sheets, dan karena itu applet tidak berfungsi.

gambar

Oleh karena itu, saya harus mengubah rencananya: kami memompa csv'shka dengan Google Sheets, menguraikannya di server dan membuang semua yang baru di Notion. IFTTT digunakan sebagai pemicu untuk seluruh proses.

Bagian 1. CSV dengan Google Sheets


Bagian ini mungkin yang paling mudah. Kami membuka tabel untuk dilihat (sehingga Anda tidak perlu repot dengan cookie). Selanjutnya, ambil dan salin tautan untuk mengekspor CSV. Untuk melakukan ini, cukup tekan Ctrl pada keyboard dan ketik Ctrl + Shift + J (yaitu, buka konsol pengembang), buka tab Network. Kemudian klik File - Unduh - CSV. Kami melihat permintaan dan menyalin tautannya.

Bagian 2. Menulis server


Karena kita memiliki pustaka Python, kita akan menulis dalam Django.

Sekarang sedikit tentang struktur meja saya secara khusus. Tabel di Notion, tidak seperti tabel di Google Sheets, memiliki kolom "Referensi". Ini adalah tautan ke tabel lain (dalam kasus saya, deskripsi fungsi yang disukai pengguna). Selebihnya jelas: kolom hanya dengan data saja.

Kita pergi ke Notion, kita sudah terbiasa dengan Ctrl + Shift + J buka konsol, pergi ke Application - Cookies, salin token_v2 dan menyebutnya TOKEN. Kemudian kita pergi ke halaman yang kita butuhkan dengan plat dan menyalin tautannya. Panggil NOTION. Jika Anda juga memiliki Relation, buka halaman dengan Relation, salin tautannya dan panggil, misalnya, NOTION_FUNCTIONS

Selanjutnya, tulis kode berikut (gagasan pra-impor):

def index(request): if request.method == "POST": client = NotionClient(token_v2=TOKEN) database = client.get_collection_view(NOTION) current_rows = database.default_query().execute() database_functions = client.get_collection_view(NOTION_FUNCTIONS) current_rows_functions = database_functions.default_query().execute() 

Di dalamnya kita menghubungkan NotionClient, kita mengatakan "Database? Berikan dua! "Dan kami mendapatkan langsung data dari dua lempengan ini (dengan permintaan default, tetapi dimungkinkan dengan menyortir, untuk lebih jelasnya, lihat dokumentasi untuk perpustakaan).

Maka kita harus melakukan hal berikut: meminta CSV dari Google dan menguraikannya. Kami akan melakukannya pandas'om.

 result = requests.get(SHEET).content pandas_result = pd.read_csv(io.StringIO(result.decode('utf-8'))) timestamps = pandas_result[[" "]].values ages = pandas_result[[" "]].values sexes = pandas_result[[" "]].values cities = pandas_result[[" "]].values socials = pandas_result[["   (   )"]].values agreements = pandas_result[["   ,   - ."]].values control_usages = pandas_result[["      "]].values health_usages = pandas_result[["       "]].values prices = pandas_result[["        .    :)"]].values mentions = pandas_result[[", ,       "]].values 

Maka kita harus memeriksa semua data dari lempeng ini dan memeriksa apakah sudah ditambahkan ke Notion atau belum. Untuk melakukan ini, kami meminta data dari pelat.

 def checkTimestamp(rows, timestamp): for i in range(0, len(rows)): row = rows[i] if row.name == timestamp: return True return False 

Secara terpisah, perlu disebutkan tentang "row.name", karena pembaca yang penuh perhatian mungkin akan bertanya: apa itu?

Ini adalah nama kolom di Notion (di mana waktu perekaman disimpan). Entah bagaimana saya tidak berhasil menambahkan dengan nama Rusia, jadi saya mengubah semua nama menjadi Bahasa Inggris dan menambahkannya.

gambar

Dan sekarang kode untuk memverifikasi data dan menambahkan baris ke label Notion:

 for i in range(0, len(timestamps)): if not checkTimestamp(current_rows, timestamps[i]): row = database.collection.add_row() health_usage = health_usages[i][0] control_usage = control_usages[i][0] ticks = health_usage + "," + control_usage row.title = timestamps[i][0] row.age = ages[i][0] row.sex = sexes[i][0] row.social_network = checkEmptiness(socials[i][0]) row.can_we_write_you = checkEmptiness(agreements[i][0]) row.city = checkEmptiness(cities[i][0]) row.controlling_examples = checkEmptiness(control_usages[i][0]) row.health_examples = checkEmptiness(health_usages[i][0]) row.cost = checkEmptiness(prices[i][0]) row.noticements = checkEmptiness(mentions[i][0]) row.castdev_relation = findIds(current_rows_functions, ticks) 

checkEmptiness adalah fungsi yang memeriksa apakah item nol telah diteruskan ke sana. Notion entah bagaimana dengan enggan bekerja ketika saya memberinya nol bidang, jadi itu layak ditulis.

Sekarang mari kita beralih ke analisis Relasi, karena dalam dokumentasi resmi saya tidak melihat tentang itu. Untuk membuat tautan ke suatu baris dari basis data lain, Anda harus mengambilnya (dari baris ini) dan mentransfernya. Oleh karena itu, jika array tautan ke string dari plat lain tersirat, Anda perlu mengambil array pengidentifikasi mereka. Saya pribadi menambahkan Hubungan dengan nama fungsi.

 def findIds(current_rows, titles): print("titles", titles) print("current rows", current_rows) array = [] for a in range(0, len(current_rows)): if current_rows[a].name in titles: array.append(current_rows[a].id) print("Ids", array) return array 

Pada akhirnya, setelah membuat garis, kami menambahkan jawabannya sehingga di ujung lain mereka tahu bahwa permintaan telah tiba.

 return HttpResponse("Hello, habr.") 

Taschemta dengan server paling penting selesai, buka IFTTT.

Bagian 3. IFTTT


Buka tab pembuatan applet . Kami memilih pemicu (dalam kasus kami adalah Tanggal & waktu), mengatur "setiap jam". Kami memilih Webhook yang dipicu (yaitu, "itu"), tentukan alamat lokal kami (sejauh ini) untuk mengujinya. Yah, itu dia. Tes.

Bagian 4. Heroku


Anda pikir apa yang kami lakukan dengan pemicu dari IFTTT ini - ini bukan untuk membayar. Heroku menawarkan tarif gratis untuk menampung barang-barang kami. Yang utama adalah layanan tidur setidaknya 6 jam. Dan dia pasti akan tidur, karena kita memanggilnya untuk bekerja setiap jam, dan tidak setiap menit.

gambar

Selanjutnya kami melakukan hal berikut. Pergi ke heroku untuk membuat proyek baru . Selanjutnya, instal klien mereka pada sistem operasi mereka. Dan kemudian kami melakukan segalanya sesuai dengan instruksi yang muncul setelah membuat aplikasi.

Setelah mengunduh semua yang ada di heroku, buka applet kami dan edit URL ke yang baru.

Sekarang daftar harus diperbarui setiap jam. Secara hipotesis, IFTTT dapat memberikan kesalahan bahwa Anda memiliki beberapa permintaan panjang, tetapi ini tidak begitu penting.

Perbarui


Ternyata itu penting. Ketika IFTTT menangkap kesalahan terus-menerus, ia mulai melompati applet.
Untuk mengatasi masalah ini, mulai saja utas baru untuk semua hal ini, segera berikan jawabannya.
 if request.method == "POST": thread = Thread(target=run_notion_import) thread.start() return HttpResponse("Hello, habr.") 


Gagasan lain yang saya lupa untuk menyuarakan dalam artikel ini adalah untuk memeriksa nullity menggunakan metode panda standar.
Artinya, cek Anda akan terlihat seperti ini:
 if not pd.isna(health_usages[i][0]): row.health_examples = health_usages[i][0] 

Source: https://habr.com/ru/post/id455714/


All Articles