2024/11/04 Microsoft Formsの回答復元スクリプト
Googleフォームの繰り返しできるテストを自動で埋める拡張機能を以前に書いたt6o_o6t.icon
アプリケーションプログラミングの講義の課題はGoogleフォームでなくMicrosoft Formsで作られている
作り直す必要が生じた
方法のアイデア
1. 不正解した際に、どの問題にどのような入力を行っていたのかを取得する
code:get_answers.js
const inputElements = Array.from(document.querySelectorAll('data-automation-id="textInput"'));
const answerAndQuestionLabels = inputElements.map(elm => ({
answer: elm.value, label: elm.getAttribute("aria-labelledby")
}))
2. 新しいタブに入力する
単に.valueを変更しただけでは送信ボタン押下時に未入力状態と誤認される
<input />要素の値を変更後、inputイベントを発火させる必要がある
このスクリプトは、問題ページの遷移ごとに発動させなければならない
たとえば2ページで構成されている課題の場合、1ページ目から2ページ目に初めて遷移するときにも実行する必要がある
code:input.js
answerAndQuestionLabels.forEach(entry => {
const inputElement = document.querySelector([aria-labelledby*="${entry.label}"]);
if (inputElement) {
inputElement.value = entry.answer;
// 入力済状態と認識させる
inputElement.dispatchEvent(new Event("input"));
}
});
回答提出用のAPIリクエストが外向きに飛んだときにキャッチして、回答内容(answers)と提出結果(quizResult)を取得するようなService Workerを書いたほうが簡単かもしれない?
APIリクエストのレスポンスのJSONには、answersとquizResultというフィールドが存在する
quizResultからは各問題の正解 / 不正解、得られた得点、正解などの情報を簡単に抽出できそうである
問題となるのは、新しいタブに入力を行う方法
個人用のMicrosoftアカウントで試したが、フォームの編集者が事前入力を有効にしない限り、事前入力されたURLにアクセスしても、未回答状態のフォームが表示されるようだ
事前入力URLは、次のような形式になっている
https://forms.office.com/Pages/ResponsePage.aspx?id={FormID}&{QuestionID}="{Answer}"
QuestionIDの例:rc0f0145abb654caca9e6fae2ff45b965
本来の授業課題に同様のフォーマットのURLでアクセスしたが、事前入力されたものを得ることはできなかった
2024/11/04 フォームやり直し拡張機能を一般化する