تصدير نماذج Google تلقائيًا إلى Notion باستخدام IFTTT و Django

يوم جيد للجميع! أعتقد أن هذه المقالة ستكون ممتعة لكل من يستخدم Notion ، لكن لسبب ما لم يتمكن من الانتقال إليها تمامًا.

قبل التاريخ


أنا أطور مشروعي . في الصفحة المقصودة بعد إدخال البريد الإلكتروني ، يتم إصدار رابط لاستطلاع اجتماعي يستند إلى نماذج Google. يتم تسجيل الردود في لوحة الاسم على Google Drive.

المشكلة هي أن كل ما أحمله معي أظل في فكرة. انها قرنية أكثر ملاءمة. يتم التعامل معها عن طريق نسخ لصق ، بينما كانت هناك بعض المراجعات. ثم كان هناك الكثير منهم - وكان من الضروري الخروج بشيء ما. من يهتم بما حدث - مرحبا بكم في القط.

المشكلة


إجابات نماذج Google تسجل فقط في لوحة الاسم - أي أنه لا توجد وصفة أخرى هنا. لذلك ، كانت لدي خطة: فلنستمع عبر IFTTT إلى تحديثات الأجهزة اللوحية ، ونرسل بيانات جديدة إلى webhook ، ونعالجها بطريقة ما ونحملها على Notion.

بالنسبة لأولئك الذين ليسوا على دراية بـ IFTTT: هذه خدمة تتيح لك عمل سلاسل من الإجراءات. قل ، "جاء المنشور في البرقيات" - "نحن تصديره على فكونتاكتي".

بدأت الخطة في الفشل: لا تحتوي الفكرة على واجهة برمجة تطبيقات رسمية. لكن شخص ما عكس ذلك وجعل API غير رسمي .

صورة

كانت الخطة النهائية هي:

  • نصنع التطبيق الصغير في IFTTT: "تمت إضافة خط إلى الجهاز اللوحي - أرسله إلى الخادم
  • نجعل الخادم الذي يستقبل البيانات ويرسله مباشرة إلى Notion

ظهرت المشكلة الثانية عندما اتضح أن IFTTT قطعت التكامل مع صحائف Google ، وبالتالي فإن التطبيق الصغير لم يعمل.

صورة

لذلك ، اضطررت إلى تغيير الخطة: نقوم بضخ ملف csv'shku باستخدام Google Sheets ، وتحليله على الخادم ورمي كل شيء جديد في Notion. يستخدم IFTTT كمحرك للعملية بأكملها.

الجزء 1. ملف CSV مع أوراق Google


ربما هذا الجزء هو الأسهل. نفتح الجدول للعرض (بحيث لا تضطر إلى تناول ملفات تعريف الارتباط). بعد ذلك ، خذ ونسخ الرابط لتصدير ملف CSV. للقيام بذلك ، ما عليك سوى الضغط على Ctrl على لوحة المفاتيح واكتب Ctrl + Shift + J (أي ، افتح وحدة تحكم مطور البرامج) ، انتقل إلى علامة التبويب الشبكة. ثم انقر فوق File - Download - CSV. نرى الطلب ونسخ الرابط.

الجزء 2. كتابة الخادم


لأن لدينا مكتبة بيثون ، سنكتب في جانغو.

الآن قليلا عن هيكل جدولي على وجه التحديد. يحتوي الجدول في Notion ، على عكس الجدول في Google Sheets ، على عمود "Reference". هذا رابط لجدول آخر (في حالتي ، وصف للوظائف التي أحبها المستخدمون). الباقي واضح بشكل عام: مجرد أعمدة تحتوي على بيانات فقط.

نذهب إلى Notion ، نحن على دراية بالفعل بـ Ctrl + Shift + J ، افتح وحدة التحكم ، انتقل إلى Application - Cookies ، وانسخ token_v2 ونطلق عليها اسم TOKEN. ثم نذهب إلى الصفحة التي نحتاج إليها مع لوحة ونسخ الرابط إليها. دعوة الفكرة. إذا كانت لديك أيضًا علاقة ، فانتقل إلى الصفحة التي بها علاقة ، وانسخ الرابط والمكالمة ، على سبيل المثال ، NOTION_FUNCTIONS

بعد ذلك ، اكتب الكود التالي (فكرة ما قبل الاستيراد):

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() 

في اتصالنا NotionClient ، نقول „قواعد البيانات؟ أعط اثنين! "ونحن نحصل على البيانات مباشرة من هاتين الصفحتين (حسب الطلب الافتراضي ، ولكن من الممكن مع الفرز ، لمزيد من التفاصيل ، راجع وثائق المكتبة).

بعد ذلك ، يجب علينا القيام بما يلي: طلب ملف CSV من Google وتحليله. سنفعل ذلك 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 

ثم يتعين علينا الاطلاع على جميع البيانات من هذه اللوحة والتحقق مما إذا كانت قد تمت إضافتها إلى Notion أم لا. للقيام بذلك ، طلبنا بيانات من اللوحات.

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

بشكل منفصل ، تجدر الإشارة إلى "row.name" ، لأنه ربما يسأل القارئ اليقظ: ما هذا؟

هذا هو اسم العمود في الفكرة (حيث يتم تخزين أوقات التسجيل). لم أتمكن من الإضافة بطريقة ما بالأسماء الروسية ، لذا غيرت جميع الأسماء إلى الإنجليزية وأضفتها.

صورة

والآن الكود للتحقق من البيانات وإضافة سطر إلى تسمية الفكرة:

 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 هي وظيفة تتحقق مما إذا تم تمرير عنصر فارغ إليها. كانت الفكرة تعمل على مضض عندما أطعمته الحقول الصفرية ، لذا فإن الأمر يستحق الكتابة.

الآن دعنا ننتقل إلى تحليل العلاقات ، لأنني في الوثائق الرسمية لم أكن أرى ذلك. لإنشاء رابط إلى خط من قاعدة بيانات أخرى ، تحتاج إلى أخذه (من هذا السطر) ونقله. وفقًا لذلك ، إذا كانت هناك مجموعة من روابط السلاسل من لوحة أخرى ضمنية ، فستحتاج إلى أخذ مجموعة من معرفاتها. قمت شخصيا بإضافة العلاقات من خلال أسماء الوظائف.

 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 

في النهاية ، بعد إنشاء السطور ، نضيف الإجابة حتى نعرف في الطرف الآخر أن الطلب قد وصل.

 return HttpResponse("Hello, habr.") 

الانتهاء من Taschemta مع الخادم الأكثر أهمية ، انتقل إلى IFTTT.

الجزء 3. IFTTT


انتقل إلى علامة تبويب إنشاء التطبيق الصغير . نختار المشغل (في حالتنا هو التاريخ والوقت) ، قم بتعيين "كل ساعة". نختار Webhook المشغلة (أي ، "ذلك") ، ونحدد عنواننا المحلي (حتى الآن) لاختباره. حسنا ، هذا كل شيء. الاختبار.

الجزء 4. Heroku


لقد فكرت فيما كنا نعبث به مع هذا الزناد من IFTTT - هذا ليس بالدفع. تقدم Heroku سعرًا مجانيًا لاستضافة الأشياء الخاصة بنا. الشيء الرئيسي هو أن الخدمة تنام 6 ساعات على الأقل. وسوف ينام بالتأكيد ، لأننا ندعوه للعمل كل ساعة ، وليس كل دقيقة.

صورة

كذلك نفعل ما يلي. انتقل إلى heroku لإنشاء مشروع جديد . بعد ذلك ، قم بتثبيت عميلهم على نظام التشغيل الخاص بهم. ثم نقوم بكل شيء وفقًا للإرشادات التي ظهرت بعد إنشاء التطبيق.

بعد تنزيل كل شيء على heroku ، انتقل إلى التطبيق الصغير لدينا وقم بتحرير عنوان URL إلى عنوان جديد.

الآن يجب تحديث القائمة كل ساعة. بشكل افتراضي ، قد يقدم IFTTT خطأ بأن لديك طلبًا طويلًا ، لكن هذا ليس مهمًا جدًا.

تحديث


اتضح أن تكون مهمة. عندما يمسك IFTTT بالأخطاء المستمرة ، يبدأ في تخطي التطبيقات الصغيرة.
لحل هذه المشكلة ، ما عليك سوى بدء سلسلة جديدة لهذه الأشياء بالكامل ، مع إعطاء الإجابة فورًا.
 if request.method == "POST": thread = Thread(target=run_notion_import) thread.start() return HttpResponse("Hello, habr.") 


هناك فكرة أخرى نسيت أن أسمعها في المقال وهي التحقق من عدم الصلاحية باستخدام طريقة الباندا القياسية.
وهذا يعني أن الشيك سيبدو كالتالي:
 if not pd.isna(health_usages[i][0]): row.health_examples = health_usages[i][0] 

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


All Articles