背景
私が留守の間、子どもたちが家のことをやるのですが、トラブルが合った時に困るので、Google Slideでトラブル時の対応を書いてました。
そろそろRAGに入れて、FAQのチャットボットを作ろうと思ってたのですが、Google SlideからDialog Flowに入れられないことがわかり、CSV出力する必要が発生しました。
仕様概要
Google Slideの3ページ目からFAQ情報が入っています。
FAQはすべて1ページで収まっており、最初のテキストボックスは質問、移行のテキストボックスが回答になっています。
-
Google APIに接続: Googleアカウントにログインし、プログラムがGoogleスライドにアクセスすることを許可します。
-
スライドの情報を取得: 指定したGoogleスライドの全ページ情報を取得します。
-
テキストを抽出: 3ページ目以降を対象に、各ページからテキストを抽出します。ページの最初のテキストボックスを「質問」、 以降のテキストボックスを「回答」 として扱います。
-
CSVファイルに書き出し: 抽出した「質問」と「回答」のペアをCSVファイルに出力します。
事前準備
プログラムを実行するには、初回のみいくつかの設定が必要です。
-
Google Cloudプロジェクトの作成とAPIの有効化
-
Google Cloud コンソールにアクセスし、新しいプロジェクトを作成します。
-
そのプロジェクトで「Google Slides API」を検索し、有効にします。
-
-
認証情報(credentials.json)のダウンロード
-
APIを有効にした後、「認証情報」ページに移動します。
-
「認証情報を作成」 > 「OAuth クライアント ID」を選択します。
- 初めての場合はOAuth同意画面を作る必要があります。対象は内部設定で作りましょう。
-
アプリケーションの種類で「デスクトップアプリ」を選択し、名前を付けます。
作成後、JSONファイルをダウンロードするボタンが表示されるのでクリックします。ダウンロードしたファイル名を「faq_csv_credentials.json」に等のわかり易い名前に変更し、これから作成するPythonスクリプトと同じフォルダに保存してください。
-
-
Pythonライブラリのインストール
作業用ディレクトリを作って、venv環境をいれてから作成することをオススメしますが、ここでは割愛します。
- ターミナルまたはコマンドプロンプトで、以下のコマンドを実行して必要なライブラリをインストールします。
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
できれば作業後にpip freezeコマンドを使って各ライブラリのバージョンを確認して、今後のためにrequirements.txtを作成しておくことをオススメします。
Pythonコード全体
以下のコードをコピーして、export_faq.pyのようなファイル名でfaq_csv_credentials.jsonと同じ場所に保存してください。
import os.path
import csv
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# このスコープはスライドの読み取り専用アクセスを許可します。
SCOPES = ['https://www.googleapis.com/auth/presentations.readonly']
# ★★★ あなたのGoogleスライドのIDに変更してください ★★★
# URLが https://docs.google.com/presentation/d/PRESENTATION_ID/edit の場合
# PRESENTATION_ID の部分がIDです。
PRESENTATION_ID = 'ここにあなたのプレゼンテーションIDを入力'
# 出力するCSVファイル名
CSV_FILENAME = 'faq_output.csv'
def main():
"""
GoogleスライドからFAQを抽出し、CSVファイルに書き出します。
"""
creds = None
# token.jsonファイルは、ユーザーのアクセストークンとリフレッシュトークンを保存します。
# 認証フローが初めて完了したときに自動的に作成されます。
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# 有効な認証情報がない場合は、ユーザーにログインを求めます。
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# 次回実行のために認証情報を保存します。
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
service = build('slides', 'v1', credentials=creds)
# Slides APIを呼び出し
presentation = service.presentations().get(
presentationId=PRESENTATION_ID).execute()
slides = presentation.get('slides', [])
if not slides:
print('指定されたプレゼンテーションにスライドがありません。')
return
faq_data = []
print(f"全{len(slides)}ページのスライドを検出しました。3ページ目から処理を開始します...")
# 3ページ目(インデックスは2)から処理を開始
for i, slide in enumerate(slides[2:]):
page_num = i + 3
page_elements = slide.get('pageElements', [])
question = None
answer_parts = []
for element in page_elements:
# 'shape'と'text'を持つ要素からテキストを抽出
if 'shape' in element and 'text' in element['shape']:
text_content = ''
for text_element in element['shape']['text']['textElements']:
if 'textRun' in text_element:
text_content += text_element['textRun']['content']
text_content = text_content.strip()
if text_content: # 空のテキストボックスは無視
if question is None:
# ページ内の最初のテキストを「質問」とする
question = text_content
else:
# 2つ目以降のテキストを「回答」の一部として追加
answer_parts.append(text_content)
if question:
# 回答部分は改行で連結する
answer = '\n'.join(answer_parts)
faq_data.append([question, answer])
print(f" - {page_num}ページ目を処理しました: Q={question[:20]}...")
# 抽出したデータをCSVファイルに書き出し
with open(CSV_FILENAME, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
# ヘッダーを書き込み
writer.writerow(['Question', 'Answer'])
# データを書き込み
writer.writerows(faq_data)
print(f"\n処理が完了しました。'{CSV_FILENAME}' にFAQが出力されました。")
except HttpError as err:
print(err)
if __name__ == '__main__':
main()
実行方法
-
コードの編集: 上記のPythonコードの中にあるPRESENTATION_IDを、あなたのGoogleスライドのIDに書き換えてください。
-
スクリプトの実行: ターミナルまたはコマンドプロンプトで、ファイルが保存されているフォルダに移動し、以下のコマンドを実行します。
python export_faq.py -
ブラウザでの認証(初回のみ):
-
実行すると、自動的にブラウザが立ち上がり、Googleアカウントへのログインとアクセス許可を求められます。
-
画面の指示に従って、アクセスを許可してください。
-
認証が完了すると、token.jsonというファイルが自動で作成され、次回以降はブラウザでの操作は不要になります。
-
実行結果:
プログラムが完了すると、同じフォルダ内にfaq_output.csvというファイルが作成されます。このファイルに、質問と回答が書き出されています。
これで、Googleスライドのナレッジをプログラムで抽出し、チャットボットなどに活用できるCSVデータに変換することができます。