Connect Streamlit to a private Google Sheet
Introduction
本指南解释了如何从Streamlit社区云安全地访问私有的Google Sheet。它使用了st.connection、Streamlit GSheetsConnection和Streamlit的Secrets management。
如果您不介意为您的Google表格启用链接共享(即任何拥有链接的人都可以查看它),指南Connect Streamlit to a public Google Sheet展示了一种更简单的方法。如果您的表格包含敏感信息且您无法启用链接共享,请继续阅读。
Prerequisites
本教程要求您的Python环境中安装有streamlit>=1.28和st-gsheets-connection。
Create a Google Sheet
如果您已经有一个想要使用的Sheet,您可以跳到下一步。
使用此示例数据创建一个电子表格。
| 名字 | 宠物 |
|---|---|
| 玛丽 | 狗 |
| 约翰 | 猫 |
| 罗伯特 | 鸟 |

Enable the Sheets API
通过Google Cloud Platform控制对Google Sheets的编程访问。创建账户或登录并前往APIs & Services dashboard(如果需要,选择或创建一个项目)。如下所示,搜索Sheets API并启用它:



Create a service account & key file
要从Streamlit社区云使用Sheets API,您需要一个Google云平台服务账户(一种用于程序化数据访问的特殊账户类型)。前往服务账户页面并创建一个具有查看者权限的账户(这将允许账户访问数据但不能更改数据):



注意
按钮“CREATE SERVICE ACCOUNT”是灰色的,您没有正确的权限。请向您的Google Cloud项目的管理员寻求帮助。
点击“DONE”后,您应该会返回到服务账户概览页面。首先,记下您刚刚创建的账户的电子邮件地址(下一步很重要!)。然后,为新账户创建一个JSON密钥文件并下载它:



Share the Google Sheet with the service account
默认情况下,您刚刚创建的服务账户无法访问您的Google表格。要授予其访问权限,请点击Google表格中的“共享”按钮,添加服务账户的电子邮件(在步骤2中记下的),并选择正确的权限(如果您只想读取数据,“查看者”就足够了):


Add the key file to your local app secrets
您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。如果此文件尚不存在,请创建此文件,并添加您的 Google Sheet 的 URL 以及您下载的密钥文件的内容,如下所示:
# .streamlit/secrets.toml
[connections.gsheets]
spreadsheet = "https://docs.google.com/spreadsheets/d/xxxxxxx/edit#gid=0"
# From your JSON key file
type = "service_account"
project_id = "xxx"
private_key_id = "xxx"
private_key = "xxx"
client_email = "xxx"
client_id = "xxx"
auth_uri = "https://accounts.google.com/o/oauth2/auth"
token_uri = "https://oauth2.googleapis.com/token"
auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs"
client_x509_cert_url = "xxx"
重要
将此文件添加到.gitignore中,不要将其提交到你的GitHub仓库!
Write your Streamlit app
将下面的代码复制到您的Streamlit应用程序中并运行它。
# streamlit_app.py
import streamlit as st
from streamlit_gsheets import GSheetsConnection
# Create a connection object.
conn = st.connection("gsheets", type=GSheetsConnection)
df = conn.read()
# Print results.
for row in df.itertuples():
st.write(f"{row.name} has a :{row.pet}:")
看到上面的st.connection了吗?它处理密钥检索、设置、查询缓存和重试。默认情况下,.read()的结果会被缓存且不会过期。你可以传递可选参数给.read()来自定义你的连接。例如,你可以指定工作表的名称、缓存过期时间,或者像这样传递pandas.read_csv的参数:
df = conn.read(
worksheet="Sheet1",
ttl="10m",
usecols=[0, 1],
nrows=3,
)
在这种情况下,我们设置ttl="10m"以确保查询结果缓存不超过10分钟。你也可以设置ttl=0来禁用缓存。了解更多信息,请访问Caching。我们已经声明了可选参数usecols=[0,1]和nrows=3供pandas在内部使用。
如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

Connecting to a Google Sheet from Community Cloud
本教程假设使用本地Streamlit应用程序,但您也可以从社区云托管的应用程序连接到Google Sheets。主要附加步骤如下:
- 包含依赖项信息 使用一个
requirements.txt文件,其中包含st-gsheets-connection和其他任何依赖项。 - Add your secrets 到你的社区云应用程序中。
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。