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 .
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.

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.

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.

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]