Moodleの小テストには作文問題(Essay Type)があります。
次のような文字の入力制限のある問題を作りたいとします。
- 必須入力とし、空白での提出は許されない。
- 最大文字数は300文字以内
例えばこんな感じの問題を作るとしましょう。
Moodleの作文問題の設定画面には次のようなオプションがあります。
テキスト必須:学生はテキストを入力する必要があります。
最小ワード数:(これを1以上にすることもできます)
最大ワード数:300 (有効にする)
これらを設定することで、要件に合う動作をする作文問題が作れそうな気がしますが。残念ながらこれらの設定はMoodle 4.5では全く機能しません。(5.0では未確認)
しかも、この「ワード数」というのは英語の単語をベースにカウントされるので、日本語ではうまく機能しません。でたらめな数字を返してきます。
日本語の場合だとワード数ではなく文字数にして欲しいところ。しかし句読点なども文字数としてカウントされたりすると「。」だけ入力して提出されてしまうので、やはり日本語に正しく対応するには難しそうではある。
そこでどうするか回避策を考えてみました。
1. 空白で提出されたら、評定時にその提出を削除する
作文問題の空白チェック機能がないので、せめて問題に「空白で提出してはダメよ」と注意喚起するしかないでしょう。それでも空白で提出してしまう学生がいたら、その提出を削除して再提出を求める方法です。
デメリット
作文問題が1問だけの場合はこの方法もありでしょう(作文問題1問だけの小テストなら課題モジュールを使った方が良いかも)。しかし、もし作文問題が複数あって、他の問題はぎっしり文字が埋められていたり、他のタイプの問題が多く含まれる小テストだとしたら、それらの回答も全てやり直しを強要してしまいます。ちょっと可哀想な気もします。
2. 空白チェックのJavaScriptを埋め込む
テーマやテンプレートにカスタムJavaScriptを追加し、提出ボタンが押されたときにオンラインテキスト欄が空であれば警告を出すようにする方法です。これはMoodleのサイト管理者の権限が必要です。
Moodleの作文問題のtextareには div.que.essay というラベルが付けられています。Submitボタンが押されたタイミングで、Form内のdiv.que.essayのtextareaの文字数をカウントし、0ならばアラートを表示し、次に進めないようにする方法です。
小テストのレイアウトは1ページに作文問題が1問の場合や、複数並ぶ場合もあるので、それらの条件に合うように次のようなスクリプトを作成する。
<script>
document.addEventListener('DOMContentLoaded', function () {
const submitBtn = document.querySelector('input[type="submit"]');
if (!submitBtn) return;
submitBtn.addEventListener('click', function (e) {
// 作文問題のtextareaを特定(essayタイプは通常 qtype_essay クラスを持つ)
const essayFields = document.querySelectorAll('.qtype_essay_editor textarea');
let emptyFound = false;
essayFields.forEach(field => {
if (field.value.trim() === '') {
emptyFound = true;
}
});
if (emptyFound) {
e.preventDefault();
alert('作文問題は必須です。空欄のままでは提出できません。');
}
});
});
</script>
JavaScriptは、管理者でログインし、サイト管理 > アピアランス > 追加HTML のヘッダー部に貼り付ける。
注意点1
このスクリプトは、全ての作文問題に対して強制的に適用されてしまう。作文問題に個別に空白チェックをON/OFFすることができなくなってしまうので、運用上問題がある場合は避けた方が良い。
注意点2
このスクリプトは、あくまで画面上にtextareが表示されている場合にのみ適用される。1画面1問のレイアウトで他のタイプの問題を表示している状態で、右側に表示されるナビゲーションパネルの「問題を提出する・・・」リンクを押されてしまうと、空白チェックスクリプトは適用されず、すり抜けてしまう。

3. 小テストの作文問題を使用せず、課題モジュールを使う
問題のすり替えのようですが、小テストの作文問題は手軽に作成できる反面、きめ細かい制約を入れることはどうやら難しそうです。ならば、作文問題は小テストを使わず課題モジュールを使う方が得策な場合もあるでしょう。
というわけで、小テストの作文問題を必須回答にしたり文字制限をつける方法は現状では限界がありそうです。
Moodleの標準機能として早く実装して欲しいものです。
※ この記事は Zenn (rublix) にも投稿しています。


