如何使用Quip Python API从/向Quip电子表格中读取和写入数据
从/向 Quip 电子表格读写数据的 Quip Python API 使用方法
我们分析师经常被要求提供解决方案,以便使最终用户能够提供他们的输入,这些输入可以在最终的分析解决方案中用作覆盖/额外上下文。
让我们以电子商务购物应用程序为例。他们在系统中有一种逻辑,一旦他们获得100个负面客户评级,就会将供应商列入黑名单。现在,可能会存在由于应用内体验或交付/退货体验而导致负面评级的情况。因此,为了保持公平,供应商有一次在六个月内申诉取消黑名单的机会。为了本文的目的,让我们假设批准/拒绝的记录在离线电子表格中。
一个星期内创建的所有新的取消黑名单的申诉都被导出到电子表格中,并发送给团队进行审查。团队审查数据并批准或拒绝。然后他们将数据发送回系统进行更新。这是一个每周的练习。
现在,需要将这个人工干预的数据添加到系统中。有多种方法可以做到这一点。个人用户可以将其数据上传到一个S3存储桶,然后可以安排从该存储桶读取数据到数据库。或者我们可以使用quip,使所有人可以实时更新同一电子表格,并以固定的频率将其上传到数据库中。
Quip是一款协作软件,可以让多人在移动设备和桌面上编辑文档、电子表格等,让他们可以自由使用任何最终客户端。
在本文中,我将展示如何自动化一个quip电子表格,以读取用户输入的数据,将其上传到数据库表中,然后将新数据写回到同一个电子表格中。我将使用Redshift作为此练习的数据库。
这个任务可以分为两个独立的部分。首先,从Quip电子表格中读取数据并将其存储在数据库中的一个表中。其次,我们将对此进行一些数据操作或检查,并将其与数据库中的预先存在的数据进行关联,然后将处理后的数据写入到已存在的quip电子表格中。我们将分别研究这两种情况,以便在您只想读取或只想写入时,本文也可以帮助您进行操作。让我们先看看第一部分。
第1部分-从Quip电子表格中读取数据并写入到数据库表中。
步骤1:获取连接到Quip的访问令牌使用Quip APIs。
我们需要生成一个访问令牌,以便为我们的个人Quip帐户提供API访问。要生成个人访问令牌,请访问此页面:https://quip.com/dev/token。如果您有一个启用了企业SSO的quip帐户,则URL会稍有不同,如-https://quip-corporate.com/dev/token

一旦您点击上面的获取个人访问令牌按钮,您将获得一个令牌,我们将在以后的章节中使用该令牌来通过API访问quip电子表格。
步骤2:导入所需的库
让我们首先导入所需的库。在本部分,我们主要将使用quipclient和pandas_redshift库。
import quipclient as quipimport pandas as pdimport numpy as npimport pandas_redshift as primport boto3from datetime import datetime as dtimport psycopg2import warningswarnings.filterwarnings('ignore')import socket
步骤3:使用令牌ID连接到Quip
QuipClient API 需要基本 URL、线程 ID 和访问令牌才能访问任何文件。基本 URL 是您尝试从中读取(或写入) Quip 服务器的 URL。对于企业账户,URL 通常会包含企业名称。线程 ID 是 Quip 服务器上所有文件的唯一标识符。它是目标文件的基本 URL 之后的字母数字值,例如电子表格。
如果文件的 URL 如下所示 – https://platform.quip-XXXXXXXXX.com/abcdefgh1234/,那么基本 URL 将是 – https://platform.quip-XXXXXXXXX.com,线程 ID 将是 – abcdefgh1234。
访问令牌是我们在第一步刚生成的那个。
现在,使用 QuipClient API,我们使用访问令牌和线程 ID 连接到 URL。
##################################### # 声明 Quip 变量 #####################################baseurl = 'https://platform.quip-XXXXXXXXX.com'access_token = "************************************************************************" thread_id = 'abcdefgh1234'########################################### 连接到 Quip##########################################client = quip.QuipClient(access_token = access_token, base_url=baseurl)rawdictionary = client.get_thread(thread_id)
第 4 步:将数据从 quip 读取到 dataframe 中
步骤 3 中的 rawdictionary 输出返回了一系列 HTML。Pandas 函数 read_html 将帮助将 HTML 部分读取到 dataframe dfs 中。因此,dfs 是一个 dataframe 的列表。该列表中的每个 dataframe 都包含 quip 电子表格中每个选项卡中的数据。在本示例中,我们只考虑来自最后一个选项卡的数据。因此,索引 -1 用于获取 raw_df 中的最后一个 dataframe。
########################################### 清理数据,并创建 dataframe #########################################dfs=pd.read_html(rawdictionary['html'])raw_df = dfs[-1]raw_df.columns=raw_df.iloc[0] # 将第一行设置为列头raw_df=raw_df.iloc[1:,1:] # 上一步之后,前两行变得重复。删除第一行raw_df=raw_df.replace('\u200b', np.nan) # 用 nan 替换空单元格
第 5 步:连接到数据库并将数据写入表中
要访问 Redshift 实例,我们需要Redshift 端点 URL。例如,实例可能类似于以下内容:
datawarehouse.some_chars_here.region_name.redshift.amazonaws.com.
我们连接到数据库并将 dataframe(在第 4 步中创建)写入新表或现有表。pandas_to_redshift 函数允许将数据附加到现有表或完全覆盖表。请注意,如果选择 append = False,则每次执行此操作时,表将被删除并重新创建。如果您希望在运行此操作之前保留某些列的数据类型或字符长度或用户权限,最好在运行此操作之前截断表。您可以通过发出直接的 Truncate 命令来进行截断。SQLAlchemy 和 psycopg2 是实现此目的的更简便选项。在截断表之后,您可以使用 append = True 运行操作。我通常对于需要维护历史数据的类型 2 表使用 append=True。
#### 截断表 ############################################### 连接到数据库##########################################user1="user"pswd1="password"connection_db=psycopg2.connect(dbname = 'test_db', host='test_host.com', port= '1234', user= user1, password= pswd1)########################################### 连接已建立##########################################df = pd.read_sql_query("""Select distinct from test_tableorder by 1 asc""",connection_db)result = df.to_markdown(index=False)cur = connection_db.cursor()cur.execute('TRUNCATE TABLE test_table')
#### 将数据写入表中 ############################################### 连接到 redshift 和 s3##########################################pr.connect_to_redshift(dbname = 'db', host = 'server.com', port = 1234, user = 'user', password = 'password')pr.connect_to_s3(aws_access_key_id = '*************', aws_secret_access_key = '*************************', bucket = 'test', subdirectory = 'subtest')########################################### 将 DataFrame 写入 S3,然后写入 redshift##########################################pr.pandas_to_redshift(data_frame = raw_df, redshift_table_name = 'test_table',append = True, region = 'xxxxxxx')
这完成了第一部分,您从Quip电子表格中读取数据并将其写入Redshift表。现在,让我们来看看第二部分。
第二部分:将数据写入现有的Quip电子表格。
对于这一部分,前三个步骤与第一部分相同。所以,请按照上面的步骤1、2和3进行操作。我们将从第4步开始。
第4步:连接数据库以读取数据
我们将在这里使用psycopg2来连接到Redshift实例,并从Redshift表中读取需要写入Quip电子表格的数据。在这里,我将数据帧转换为标记以获得一个干净的表格,这也是QuipClient库的前提之一。
########################################### 连接到数据库##########################################user1="用户"pswd1="密码"connection_db=psycopg2.connect(dbname = 'test_db', host='test_host.com', port= '1234', user= user1, password= pswd1)########################################### 连接已建立##########################################df = pd.read_sql_query("""选择不同的col名从test_table升序排列""",connection_db)result = df.to_markdown(index=False)
第5步:将数据写入Quip文件
要将数据写入Quip电子表格,您可以使用QuipClient库的edit_document函数。该函数有多个参数。格式可以是HTML或标记。默认格式是HTML,这就是为什么我们在第4步中将数据帧转换为标记的原因。您需要指定section_id和location以指定您希望添加数据的位置-追加、预追加、在特定部分之后/之前等。对于这个特定的场景,我只想将数据追加到现有电子表格中的一个新选项卡中。您可以在这里了解更多信息。
有时,操作已执行,但脚本由于API响应的延迟而仍然失败。try-except错误块用于捕获任何超时错误。
########################################### 将数据插入Quip########################################## try: client.edit_document(thread_id=thread_id, content = result, format='markdown', operation=client.APPEND) print("测试数据库已更新。")except socket.timeout: print("出现错误!")
我们完成了!
希望您找到本文有用。如果您有任何其他问题,请随时联系我们。
感谢阅读!
下次见……





