結果のリンクされたスプレッドシートを使用して、多肢選択式クイズ用のGoogleフォームを作成しました。これは非常にうまく機能します。私には特定の問題があります。それは、ユーザーの結果をユーザーに提示したいということです(つまり、ユーザーが正解/不正解した回答の数)。私がこれまでに取ったアプローチは次のとおりです。
- 各回答の正解数を計算する数式を使用して、スプレッドシートに追加のシートを作成します。これにより、「フルネーム」と「スコア」の2つの列が表示されます
- フォームをGoogleサイトに埋め込みます
- Google Apps Scriptを作成して、結果シートを読み、出力を表示します
- 上記をAppsScriptガジェットと同じフォームの下のサイトに埋め込みます
現在、これまでに記録されたすべての結果を表示することができます。ここを参照してください:
https://sites.google.com/site/mcqtest123/home
スクリプトは次のようになります。
// Script-as-app template.
function doGet() {
var app = UiApp.createApplication();
var title = app.createLabel("Survey Results").setStyleAttribute("fontSize","16px");
app.add(title);
//readRows(app);
calculateScores(app);
return app;
};
function calculateScores(app) {
var sheet = SpreadsheetApp.openById("0AlNR-ou0QtandFFzX1JCU1VRdTl0NVBRNTFjOUFhd1E");
var responseSheet = sheet.getSheetByName("Form Responses");
var allData = responseSheet.getDataRange().getValues();
var correct = allData[1];
var responses = allData.slice(2);
//Logger.log("Timestamp, name, score");
Logger.log("Name, Score");
for (var i = 0; i < responses.length; i++) {
var timestamp = responses[i][0];
var name = responses[i][1];
var score = 0;
for (var j = 2; j < correct.length; j++) {
if(responses[i][j] == correct[j]) {
score += 1;
}
}
//var output = timestamp + ", " + name + ", " + score + "/" + correct.length
var output = name + ", " + score + "/" + correct.length
print(app, output);
}
};
function print(app, line) {
Logger.log(line);
app.add(app.createLabel(line));
};
したがって、これには2つの問題があります。
ページが読み込まれると、すべての回答者のスコアが読み込まれます。フォームに記入した人のスコアのみを提示できるようにしたいと思います。
フォームが入力されてもスコアは更新されません。ページが更新された場合のみです。
document.getElementById('targetFrame')
問題1)については、iframe形式のデータにアクセスして(たとえば、Googleスクリプトがドキュメントモデルにアクセスできないように見えることを除いて)、フルネームの人の結果のみを表示する方法があるかどうか疑問に思いました。フォーム内の名前と一致します(もちろん、他の人がフルネームとして何を入力するかがわかっている場合は、他の人の結果を表示できますが、タイムスタンプを使用しないと、この周りに表示されません)。
問題2)については、回答シートが更新されたときにスクリプトをトリガーする方法があるのではないかと思いました。ただし、スプレッドシートと[ツール]-> [スクリプトマネージャー]に移動すると、「スクリプトが見つかりません」というメッセージが表示されるため、このトリガーを追加する方法がわかりません。