Python3: Moodle「課題活動モジュール」で「オンラインテキスト」を選び回収したテキストをExcel化

# はじめの前のおねがい
できれば「いいね♡」をお願いします。励みになります。

# はじめに
授業でコメントシートを求めて、それぞれをフィードバックするために、内容が単純なExcelで管理できると非常に楽ではあります。

しかしMicrosoft FormsではなくMoodleを使用した場合には、「調査モジュール」の場合は求められる設題に制限があり、いまいち使い勝手が良くありません。また「フィードバックモジュール」である程度長文のコメントを求めた場合、自動保存機能がないために「せっかく書いたのに消えた！」という声が続出したりします。これはMicrosoft Formsでも同じことが言えます……。

そのために、「課題活動モジュール」を使用をすることになりますが、学生さんたちにファイルで提出してもらった場合は、「許可されるファイルタイプ」で求めることができるファイルの種類は選べるとはいえ、様々なWordファイルが大量に届き、単純に<INS>プレーンテキスト</INS>で内容が欲しいのに、図形が入っていたりなど意図しないものが届く恐れがあります。

そのため提出タイプの項目で「オンラインテキスト」のみを受け付けるようにすれば、確かに（リッチテキストになってしまいますが）<INS>テキストファイルのみ</INS>で内容を受け取ることはできますが、「すべての提出を表示する」で表示される内容は一定文字数を超えると「...」で省略されてしまい、表部分をExcelにコピペしても提出された内容がそのままExcelのセルに挿入されるわけではありません。

また、Excelだとあまり意図した通りにコピペすることもできずMacOS標準の表計算ソフトNumbersを使用した方が、Moodleで表示された内容に近いものは挿入されます。

しかし、いずれにしても「...」で省略されてしまうために、結局、ルーペアイコンから別個に表示して、それをコピペし直すか、「選択した提出をダウンロードする」で、学生さんたちの名前の入ったフォルダ内にあるHTMLファイルを取得するかのどちらかになってしまいます。

しかし人数が多くなれば多くなるほど、この作業はあまりに面倒な作業になります。1人ずつフォルダを開いてHTMLファイルを開いて、コピーしてExcelに「数値のみ」でペーストして……私なら10人を超えた時点で、めまいがしてきます。

そのため、「選択した提出をダウンロードする」でダウンロードされたフォルダの中に入っている

1. フォルダ名の「_assignsubmission_onlinetext_」より前に来ている文字をExcelの1列目
1. 各「_assignsubmission_onlinetext_」が含まれるフォルダ内のHTMLテキストを抽出
1. 抽出したテキストをプレーンテキストに変換してExcelの2列目

に入ったExcelファイルをPythonで自動生成するコードがあれば良いと思いました。

# 本コードを実行するとどうなるか
本コードを実行すると
1. コードと同じ場所に格納されている「MoodleSubmissions」というフォルダを検知します。
1. フォルダ名の「_assignsubmission_onlinetext_」より前に来ている文字をExcelの1列目として出力します。
1. 各「_assignsubmission_onlinetext_」が含まれるフォルダ内のHTMLテキストを抽出します。
1. 抽出したテキストをプレーンテキストに変換してExcelの2列目に出力します。
1. 生成されたファイルは「ExtractedTexts*YYYYMMDD*.xlsx」（YYYYMMDDは生成された年月日）としてMoodleSubmissionsフォルダ内に格納されます。

この作業が自動的に行われます。

# こちら側で行う作業
このコードを実行する前に、ユーザー側でしておかなければならないのは、
1. コードと同じフォルダ内に「MoodleSubmissions」というフォルダを作成しておく
1. 「MoodleSubmissions」フォルダ内にダウンロードした内容の中で「_assignsubmission_onlinetext_」の文字が末尾にくるフォルダをコピーしておく

という手順です。

# 必要なモジュール
必要なモジュールはBeautifulSoup 4です。
```plaintext
pip install beautifulsoup4
```

このモジュールは最新のPythonモジュールではそのままpipでインストールできないために、行き詰まった時には拙記事「[初中級者向け：MacOS用IDE“CodeRunner 4”でPython仮想環境内でコードを実行する方法](https://qiita.com/ekemtt/items/252298da3e652dbf8ee4)」を参考にしていただければと思います。

# ソースコード
```python:Moodle2Excel.py
import os
import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime

# 現在のディレクトリにある 'MoodleSubmissions' フォルダのパスを設定
current_directory = os.getcwd()
folder_path = os.path.join(current_directory, 'MoodleSubmissions')

# ディレクトリが存在しない場合は作成
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 結果を格納するためのリスト
data = []

# 指定フォルダ内のフォルダを検索
for root, dirs, files in os.walk(folder_path):
    if '_assignsubmission_onlinetext_' in root:
        student_id = root.split(os.sep)[-1].split('_assignsubmission_onlinetext_')[0]
        # onlinetext.html ファイルを検出
        for file in files:
            if file == 'onlinetext.html':
                file_path = os.path.join(root, file)
                # HTML ファイルを開いて内容を抽出
                with open(file_path, 'r', encoding='utf-8') as f:
                    soup = BeautifulSoup(f.read(), 'html.parser')
                    # プレーンテキストを抽出
                    text = soup.get_text(strip=True)
                    # 学生IDとテキストをリストに追加
                    data.append([student_id, text])

# データを変換
df = pd.DataFrame(data, columns=['Student ID', 'Text'])

# 現在の日付を取得してファイル名に追加
date_string = datetime.now().strftime('_%Y%m%d')

# Excelファイルとして保存
output_path = os.path.join(folder_path, f'ExtractedTexts{date_string}.xlsx')
df.to_excel(output_path, index=False)

print("Excelファイル:", output_path)
```
以上です。お役に立てれば幸いです。