使用IFTTT和Django自动将Google表单导出到概念

祝大家有美好的一天! 我认为本文对使用Notion的每个人都会很有趣,但由于某些原因无法完全转向它。

史前史


我正在开发我的项目 。 输入电子邮件后,在目标网页上会发布指向基于Google表单的社会调查的链接。 响应记录在Google云端硬盘的铭牌上。

问题是我随身携带的所有物品都保留在“概念”中。 老套更方便。 由复制粘贴处理,但评论很少。 然后有更多的人-有必要提出一些建议。 谁在乎发生了什么-欢迎来猫。

问题


Google表单仅在铭牌上记录答案-也就是说,这里没有其他食谱。 因此,我有一个计划:让我们通过IFTTT监听平板电脑的更新,将新数据发送到Webhook,以某种方式进行处理并将其上传到Notion。

对于不熟悉IFTTT的用户:这是一项服务,可让您进行一系列操作。 说,“帖子是用电报进来的”-“我们将其导出到VKontakte”。

该计划开始失败:Notion没有正式的API。 但是有人将其逆转并制作了非官方的API

图片

最终的计划是这样的:

  • 我们在IFTTT中制作小程序:“平板电脑上已添加一行-将其发送到服务器
  • 我们直接制作接收数据并将其发送到Notion的服务器

当发现IFTTT与Google表格的集成中断,因此该applet无法正常工作时,出现了第二个问题。

图片

因此,我不得不更改计划:我们将带有Google表格的csv'shku抽出,在服务器上进行解析,然后将所有新内容都投放到Notion中。 IFTTT被用作整个过程的触发器。

第1部分。CSV与Google表格


这部分可能是最简单的。 我们打开表格进行查看(这样您就不必担心Cookie了)。 接下来,获取并复制链接以导出CSV。 为此,只需按键盘上的Ctrl键,然后按Ctrl + Shift + J(即打开开发人员的控制台),然后转到“网络”选项卡。 然后单击文件-下载-CSV。 我们看到请求并复制链接。

第2部分。编写服务器


由于我们拥有Python库,因此我们将使用Django进行编写。

现在介绍一下我的桌子的具体结构。 与Google表格中的表格不同,Notion中的表格具有“参考”列。 这是到另一个表的链接(在我的情况下,是用户喜欢的功能的描述)。 其余的内容通常很清楚:仅包含数据的列。

我们转到概念,我们已经熟悉Ctrl + Shift + J,打开控制台,转到应用程序-Cookies,复制token_v2并将其命名为TOKEN。 然后,转到带有标牌的页面,然后将链接复制到该页面。 致电NOTION。 如果您还有关联,请转到带有关联的页面,复制链接并调用,例如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,说“数据库? 给出两个!“然后我们直接从这两个板中获取数据(默认情况下是请求,但是可以进行排序,有关更多详细信息,请参见库文档)。

然后,我们必须执行以下操作:向Google请求CSV并进行解析。 我们会做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”,因为细心的读者可能会问:这是什么?

这是概念(存储记录时间)中列的名称。 我以某种方式没有设法添加俄语名称,所以我将所有名称更改为英语并添加它们。

图片

现在是用于验证数据并在“ 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是用于检查是否将空项目传递给它的函数。 当我给他喂零个字段时,这个想法以某种方式勉强地起作用了,所以值得写。

现在让我们继续进行关系分析,因为在正式文档中我没有看到它。 要链接到另一个数据库中的一行,您需要使用它(并属于该行)并进行传输。 因此,如果隐含了从另一块板到字符串的链接的数组,则需要获取其标识符的数组。 我个人通过函数名称添加了关系。

 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部分。


转到小程序创建选项卡 。 我们选择触发器(在我们的例子中是日期和时间),设置为“每小时”。 我们选择触发的(即“ that”)Webhook,指示我们(到目前为止)的本地地址以对其进行测试。 好吧,就是这样。 测试。

第4部分。


您以为我们对IFTTT的这一触发机制感到困惑-这是不付费的。 Heroku提供托管我们的东西的免费价格。 最主要的是该服务至少要休眠6个小时。 而且他肯定会睡觉,因为我们叫他每小时工作,而不是每分钟工作。

图片

此外,我们执行以下操作。 转到heroku 创建一个新项目 。 接下来,在其操作系统上安装其客户端 。 然后,我们根据创建应用程序后出现的说明进行所有操作。

在heroku上下载所有内容后,转到我们的applet,然后将URL编辑为一个新的URL。

现在,该列表应该每小时更新一次。 假设地,IFTTT可能会给出一个错误,表明您有某种长时间的请求,但这并不是那么重要。

更新资料


事实证明这很重要。 当IFTTT发现持续的错误时,它开始跳过小程序。
要解决此问题,只需为所有内容启动一个新线程,并立即给出答案。
 if request.method == "POST": thread = Thread(target=run_notion_import) thread.start() return HttpResponse("Hello, habr.") 


我在文章中忘记表达的另一个想法是使用标准pandas方法检查无效性。
也就是说,您的支票将如下所示:
 if not pd.isna(health_usages[i][0]): row.health_examples = health_usages[i][0] 

Source: https://habr.com/ru/post/zh-CN455714/


All Articles