StreamlitでGoogleスプレッドシートからデータを取得する方法を紹介します。
また、Steamlit Cloudで作成したページやアプリを公開する場合に、シークレットマネージャー機能(Secrets management)を使用して、APIキーを公開せずにStreamlit Cloudに公開する方法を紹介します。
ちなみにStreamlitのアプリ公開機能は以前はStreamlit Sharingと呼ばれていましたが、Streamlit Cloudの機能の一部となりました。
Streamlit sharing is now part of the Streamlit Cloud family! See the Starter plan below for more info.
引用:Streamlit Cloud
事前情報
スプレッドシートからデータを取得するにはGCPに登録が必要
スプレッドシートからpythonでデータを取得するには、GCP(Google Cloud Platform)に登録してAPIを使用する必要があります。
GCPへの登録方法、スプレッドシートを扱うためのAPIの活用方法については、YouTubeの「PythonでGoogleスプレッドシートの情報を抽出してみた | Python活用シリーズ」などを参考にしてください。
公開されたスプレッドシートのデータ取得はGCPに登録不要
非公開のスプレッドシートのデータ取得にはGCPのAPIが必要ですが、公開中のスプレッドシートのデータ取得にはAPIは必要ありません。
つまり、GCPの登録は不要です。
詳細については後述しています。
Streamlit Cloudでアプリを公開するためにはGitHubにコードを上げる
Streamlit Cloudでサイトやアプリを公開するためには、GitHubにコードをアップする必要があります。
つまりGCPのAPIを使う場合、APIキーも公開することになります。
APIキーを公開しないためには、Streamlit Cloudのシークレットマネージャー機能を使用することで、APIキーを公開せずに、サイトやアプリを公開することができます。
※公開中のスプレッドシートを使用する場合はAPIを使用しないので、シークレットマネージャー機能は使用する必要はありません。
ローカル環境でStreamlitを使用する場合の方法
ローカル環境でStreamlitを使用する場合は、APIキーの公開については気にする必要がないので、APIキーの情報が入っているJSONファイルをそのまま使用します。
スプレッドシートを公開している場合【GCP不要】
スプレッドシートを公開している場合はGCPを使う必要が無いので、手軽にデータ取得ができます。
まずは、スプレッドシートの共有設定を公開にします。
スプレッドシートの公開設定を変更し、誰でも見られる状態にします。
公開しているスプレッドシートのデータ取得には、gsheetsdb
というライブラリを使用します。
詳細はGitHubに公開されています。
ライブラリは2種類インストールします。
pip install shillelagh
pip install gsheetsdb
今回使用する公開用のスプレッドシートは以下です。
コードは以下です。
11行目にスプレッドシートのURLを入力します。
import streamlit as st
from gsheetsdb import connect
import pandas as pd
conn = connect()
def run_query(query): rows = conn.execute(query, headers=1) return rows
sheet_url = "スプレッドシートのURL"
rows = run_query(f'SELECT * FROM "{sheet_url}"')
# スプレッドシートの内容をstreamlitに表示する
st.write('''## スプレッドシートの内容を行ごとに表示する''')
for row in rows: st.write(f"{row}")
# それぞれの列の情報を個別に抽出する
st.write('''## それぞれの列の情報を個別に抽出する''')
for row in rows: st.write(f"{row.日付}の{row.名前}の{row.値段}円です。")
# データフレームに変換し表示する
st.write('''## データフレームに変換し表示する''')
row_list = []
for row in rows: row_list.append(row)
df=pd.DataFrame(row_list)
st.table(df)
3種類のパターンでStreamlitに出力しています。
まず、抽出した結果をそのまま表示しています。
# スプレッドシートの内容をstreamlitに表示する
st.write('''## スプレッドシートの内容を行ごとに表示する''')
for row in rows: st.write(f"{row}")
続いて、スプレッドシートの列の情報を個別に抜き出して表示しています。
# それぞれの列の情報を個別に抽出する
st.write('''## それぞれの列の情報を個別に抽出する''')
for row in rows: st.write(f"{row.日付}の{row.名前}の{row.値段}円です。")
最後にデータフレームに変換して表示します。
# データフレームに変換し表示する
st.write('''## データフレームに変換し表示する''')
row_list = []
for row in rows: row_list.append(row)
df=pd.DataFrame(row_list)
st.table(df)
スプレッドシートを公開していない場合【GCP必要】
非公開のスプレッドシートの場合は、GCPに登録してAPIを使用する必要があります。
コードの他に、GCPでダウンロードしたAPIキーのJSONファイルをコードと同じフォルダに入れておいてください。
root/
├ ***.py
└ ***.json
今回使用する非公開のスプレッドシートは以下です。
googleの認証関連のライブラリをインストールしておきます。
pip install google
コードは以下です。
8行目にAPIキーのjsonファイル名、
19行目にスプレッドシートのURLを入力します。
import streamlit as st
from google.oauth2 import service_account
from gsheetsdb import connect
import pandas as pd
# Create a connection object.
credentials = service_account.Credentials.from_service_account_file( '***.json', scopes=[ "https://www.googleapis.com/auth/spreadsheets", ],
)
conn = connect(credentials=credentials)
def run_query(query): rows = conn.execute(query, headers=1) return rows
sheet_url = "スプレッドシートのURL"
rows = run_query(f'SELECT * FROM "{sheet_url}"')
# データフレームに変換し表示する
row_list = []
for row in rows: row_list.append(row)
df=pd.DataFrame(row_list)
st.table(df)
データフレームに変換してStreamlitに出力した結果は以下です。
【別の方法】gspreadを使う方法
gsheetsdbを使わずに、gspread
というライブラリを使用する方法もあります。
gspread
のライブラリをインストールします。
pip install gspread
コードは以下です。
12行目にAPIキーのjsonファイル名、
18行目にスプレッドシートのキーを入力します。
スプレッドシートのキーはスプレッドシートのURLの以下の部分(黄色)です。
import streamlit as st
from google.oauth2 import service_account
import gspread
import pandas as pd
# スプレッドシートの認証
scopes = [ 'https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive'
]
credentials = service_account.Credentials.from_service_account_file( '***.json', scopes=scopes
)
gc = gspread.authorize(credentials)
# スプレッドシートからデータ取得
SP_SHEET_KEY = 'スプレッドシートのキー' # スプレッドシートのキー
sh = gc.open_by_key(SP_SHEET_KEY)
SP_SHEET = 'シート1' # シート名「シート1」を指定
worksheet = sh.worksheet(SP_SHEET)
data = worksheet.get_all_values() # シート内の全データを取得
df = pd.DataFrame(data[1:], columns=data[0]) # 取得したデータをデータフレームに変換
st.table(df)
結果は上記のデータフレームを表示した結果と同じになります。
Streamlit Cloudでアプリを公開する場合
Streamlit Cloudでアプリを公開する場合は、GitHubにコードをアップする必要があるので、APIキーを隠さないといけません。
そのために、Streamlitのシークレットマネージャー機能(Secrets management)を使用します。
シークレットマネージャー機能(Secrets management)とは
Streamlit Cloudの機能でアプリを公開する場合、GitHub上のコードとは別にStreamit上にAPIキーなどを保存し、環境変数として、GitHubのコードにAPIキーなどを渡すことができます。
シークレットマネージャー機能を使えば、APIキーを公開せずにアプリを公開することができます。
※公開済みにスプレッドシートを使用する場合は、APIキーなどは使用しないので、ローカルと同じコードを使って問題ありません。
コード
GitHubのリポジトリに保存するコードは以下です。
8行目のAPIキーと、
19行目のスプレッドシートのURLはStreamllit Cloud上に保存します。
import streamlit as st
from google.oauth2 import service_account
from gsheetsdb import connect
import pandas as pd
# Create a connection object.
credentials = service_account.Credentials.from_service_account_info( st.secrets["gcp_service_account"], scopes=[ "https://www.googleapis.com/auth/spreadsheets", ],
)
conn = connect(credentials=credentials)
def run_query(query): rows = conn.execute(query, headers=1) return rows
sheet_url = st.secrets["private_gsheets_url"]
rows = run_query(f'SELECT * FROM "{sheet_url}"')
# データフレームに変換し表示する
row_list = []
for row in rows: row_list.append(row)
df=pd.DataFrame(row_list)
st.table(df)
シークレットマネージャーにAPIキーを保存する
シークレットマネージャーは、Streamlit Cloudにアプリをデプロイする時に使用します。
Streamlit Cloudへのアプリのデプロイ方法はYouTube「【Streamlit超入門】データ可視化・分析アプリを爆速で作成できるPythonライブラリStreamlitの基礎を70分でマスター」などを参考にしてください。
以下はアプリをデプロイする時の画面です。
アプリの選択などを行った後、「Advanced settings」をクリックします。
SecretsにTOML形式で、APIキーとスプレッドシートのURLを入力します。
入力が完了したら、「Save」をクリックします。
これでAPIキーを公開せずにアプリを公開することができます。
private_gsheets_url = "スプレッドシートのURL"
[gcp_service_account]
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"
ローカル環境でシークレットマネージャーを使用する場合
ローカルでStreamlitを使う場合でもシークレットマネージャーを使うことができます。
アプリをデプロイする前に、ローカルで試す時などにおすすめです。
シークレットマネージャーを使うためには、.streamlit/secrets.toml
に上記と同じTOML形式のコードを格納します。
コード側の読み取りは、上記と同じst.secrets["gcp_service_account"]
などです。
root/
├ .streamlit/
│ └ secrets.toml
└ ***.py
【別の方法】gspreadを使う方法
gspreadを使う場合のコードは以下です。
import streamlit as st
from google.oauth2 import service_account
import gspread
import pandas as pd
# スプレッドシートの認証
scopes = [ 'https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive'
]
credentials = service_account.Credentials.from_service_account_info( st.secrets["gcp_service_account"], scopes=scopes
)
gc = gspread.authorize(credentials)
# スプレッドシートからデータ取得
SP_SHEET_KEY = st.secrets.SP_SHEET_KEY.key # スプレッドシートのキー
sh = gc.open_by_key(SP_SHEET_KEY)
SP_SHEET = 'シート1' # シート名「シート1」を指定
worksheet = sh.worksheet(SP_SHEET)
data = worksheet.get_all_values() # シート内の全データを取得
df = pd.DataFrame(data[1:], columns=data[0]) # 取得したデータをデータフレームに変換
st.table(df)
TOMLファイルは、スプレッドシートのURLではなく、スプレッドシートのキーを入れています。
[SP_SHEET_KEY]
key = 'スプレッドシートキー'
[gcp_service_account]
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"
UdemyのStreamlit講座がおすすめ
Streamlitについて、もっと詳しい使い方やいろいろなアプリ作成の方法を知りたい場合は、StreamitのUdemy講座がおすすめです。
Streamlitの基本的な使い方や、実際に5つのアプリを作成していく過程でStreamlitの使い方を学ぶことができます。
上記講座の詳しい内容が知りたい方は、以下の記事を参考にしてください。
Udemyの「爆速で5つのPython Webアプリを開発」を受講して初心者がwebアプリを簡単に作れるようになったまた、Pythonの基本的な内容を勉強したい、もう一度ちゃんと学習しなおしたいという方は以下の講座がおすすめです。
かなりのボリュームですが、基本的な内容から、多少の応用まで、体系的に正しい知識を得ることができます。