0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google SlideからCSV出力する方法

Posted at

背景

私が留守の間、子どもたちが家のことをやるのですが、トラブルが合った時に困るので、Google Slideでトラブル時の対応を書いてました。
そろそろRAGに入れて、FAQのチャットボットを作ろうと思ってたのですが、Google SlideからDialog Flowに入れられないことがわかり、CSV出力する必要が発生しました。

仕様概要

Google Slideの3ページ目からFAQ情報が入っています。
FAQはすべて1ページで収まっており、最初のテキストボックスは質問、移行のテキストボックスが回答になっています。

  1. Google APIに接続: Googleアカウントにログインし、プログラムがGoogleスライドにアクセスすることを許可します。

  2. スライドの情報を取得: 指定したGoogleスライドの全ページ情報を取得します。

  3. テキストを抽出: 3ページ目以降を対象に、各ページからテキストを抽出します。ページの最初のテキストボックスを「質問」、 以降のテキストボックスを「回答」 として扱います。

  4. CSVファイルに書き出し: 抽出した「質問」と「回答」のペアをCSVファイルに出力します。

事前準備

プログラムを実行するには、初回のみいくつかの設定が必要です。

  1. Google Cloudプロジェクトの作成とAPIの有効化

    • Google Cloud コンソールにアクセスし、新しいプロジェクトを作成します。

    • そのプロジェクトで「Google Slides API」を検索し、有効にします。

  2. 認証情報(credentials.json)のダウンロード

    • APIを有効にした後、「認証情報」ページに移動します。

    • 「認証情報を作成」 > 「OAuth クライアント ID」を選択します。

      • 初めての場合はOAuth同意画面を作る必要があります。対象は内部設定で作りましょう。
    • アプリケーションの種類で「デスクトップアプリ」を選択し、名前を付けます。

    作成後、JSONファイルをダウンロードするボタンが表示されるのでクリックします。ダウンロードしたファイル名を「faq_csv_credentials.json」に等のわかり易い名前に変更し、これから作成するPythonスクリプトと同じフォルダに保存してください。

  3. 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()

実行方法

  1. コードの編集: 上記のPythonコードの中にあるPRESENTATION_IDを、あなたのGoogleスライドのIDに書き換えてください。

  2. スクリプトの実行: ターミナルまたはコマンドプロンプトで、ファイルが保存されているフォルダに移動し、以下のコマンドを実行します。

    python export_faq.py
    
  3. ブラウザでの認証(初回のみ):

    • 実行すると、自動的にブラウザが立ち上がり、Googleアカウントへのログインとアクセス許可を求められます。

    • 画面の指示に従って、アクセスを許可してください。

    • 認証が完了すると、token.jsonというファイルが自動で作成され、次回以降はブラウザでの操作は不要になります。

実行結果:

プログラムが完了すると、同じフォルダ内にfaq_output.csvというファイルが作成されます。このファイルに、質問と回答が書き出されています。

これで、Googleスライドのナレッジをプログラムで抽出し、チャットボットなどに活用できるCSVデータに変換することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?