できます。フォームの回答をスプレッドシートに出したあと、別シートで作品番号ごとの得点を計算するのが簡単です。
例として、次のように集計できます。
・フォームの回答シート
A列にタイムスタンプ、B列に「1番気に入った作品の番号」、C列に「2番目に気に入った作品の番号」…が入っているとします。
・集計用シートを新しく作成
A列に作品番号を縦に並べます(1、2、3…と作品数ぶん)。
B列に「その作品の合計得点」を計算する式を入れます。
例えば
1位を5点、2位を4点、3位を3点とする場合、
集計シートの B2 に次のような式を書きます(シート名は例です)。
=COUNTIF(‘フォームの回答’!B:B, A2)*5
• COUNTIF(‘フォームの回答’!C:C, A2)*4
• COUNTIF(‘フォームの回答’!D:D, A2)*3
これで「A2の作品番号が1位に選ばれた回数×5点」+「2位に選ばれた回数×4点」…が合計されます。
この式を下にコピーすれば、全作品分の得点表ができます。あとは得点の大きい順に並べ替えれば順位表になります。
作品数が10点でも30点でも、集計シートのA列にある作品番号の分だけ自動で集計されるため、作品数が毎回変わっても対応できます。
GASを使わなくても、基本的にはこのような関数だけで「作品番号ごとの結果表」と「得点制での順位」を出すことができます。
追記
将来的な自動化は、スプレッドシート側を「触らなくてよい形」に作り込んでおき、必要であればGASで得点を自動加算する仕組みを足す、という二段構えにすると運用が楽になります。
まず、関数だけでできる自動化です。
前回のように「作品番号ごとの合計得点」を別シートで出す場合、COUNTIF などの範囲を「B:B」「C:C」のように列全体にしておけば、新しい回答が追加されても自動で集計が更新されます。つまり「式は最初に一度だけ作る」「あとはフォームが送られるたびに勝手に数字が変わる」状態になります。関数が分からない人には「結果シートを見るだけ」にしてもらえばよいので、運用上かなり安全です。
さらに踏み込んで、GASで自動加算する方法です。
イメージとしては、次のような流れになります。
1 フォーム送信時トリガー(onFormSubmit)を設定する
2 スクリプトで、送信された「1番」「2番」などの作品番号を取得する
3 [5点,4点,3点…] といった配列を用意しておき、作品番号ごとに対応する点数を集計シートに加算していく
4 集計シートの1列目を作品番号、2列目を合計点にしておき、その行を探して点数を足す
コードの雰囲気は次のような形です。
onFormSubmit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(“集計”);
var points = [5, 4, 3]; // 1位 2位 3位など
var rankings = [
e.namedValues[“1番目に気に入った作品”][0],
e.namedValues[“2番目に気に入った作品”][0],
e.namedValues[“3番目に気に入った作品”][0]
];
rankings.forEach(function(workNo, i) {
if (!workNo) return;
var row = findRowByWorkNo(sheet, workNo); // 作品番号の行を探す自作関数
var current = sheet.getRange(row, 2).getValue() || 0;
sheet.getRange(row, 2).setValue(current + points[i]);
});
}
このようにしておけば、フォームが送信されるたびに合計点が自動更新されるので、担当者は「フォームを開いて回答を見る」「集計シートで順位を見る」だけで済みます。
最後に、関数やスクリプトが書いてあるシートは保護機能で編集不可にしておき、一般の人は「投票フォーム」と「結果を見るシート」にだけ触れる運用にすると、トラブルも少なくなり扱いやすいと思います。