現在の版: v1.0.0 候補版
バージョン表記は次のように分けています。
- アプリ本体の到達点:
v1.0.0 候補 - 画面上設定エクスポート形式:
meta.version = v0.1.0 - テンプレパックJSON仕様:
meta.version = 0.1.0
アプリ本体は v1.0.0 候補ですが、設定JSONとテンプレパックJSONは互換性を壊さないため、現時点では既存の形式バージョンを維持しています。
Googleスプレッドシート上の提出データを読み込み、最大5枠の得点と、最大3枠の講評/改善点を入力して同じシートへ保存するための GAS Webアプリです。
- 実データ、個人情報、生徒情報、答案本文、学校名などを公開リポジトリに含めないでください。
- Webアプリの公開範囲は、まず「自分のみ」または組織内の限定公開で動作確認することを推奨します。
- 採点対象スプレッドシートの共有設定も、必要な利用者だけに限定してください。
Code.gs: サーバーサイド。スプレッドシート読み書き、設定保存、ルール評価APIを担当します。Index.html: Webアプリ本体のUIです。sidebar.html: スプレッドシート上で使う whenExpr / message式の手入力・式ビルダー補助ツールです。samples/template-pack-bio-basic.json: テンプレパックのサンプルです。
Google Apps Script で新規プロジェクトを作成し、次のファイルを配置します。
Code.gsIndex.html(HTMLファイル名はIndex)sidebar.html(サイドバーを使う場合)
appsscript.json はこのリポジトリに無い場合、無理に作成する必要はありません。
推奨は Webアプリ起動後に設定画面の「採点するスプシURL」へ URL または ID を入力する方法です。値は ScriptProperties の TARGET_SPREADSHEET_ID に保存されます。
コードで固定したい場合は、Code.gs の SPREADSHEET_ID を書き換えてください。TARGET_SPREADSHEET_ID が未設定の場合に使われます。
Apps Script の「デプロイ」→「新しいデプロイ」→種類「ウェブアプリ」を選びます。
- 実行するユーザー: 自分
- アクセスできるユーザー: まずは「自分のみ」を推奨
初回アクセス時は、スプレッドシートへのアクセス承認が必要です。
自動講評を使う場合は、設定用スプレッドシートに _templates と _rules を作成します。設定用スプレッドシートは、コンテナバインドされたスプレッドシートが優先されます。取得できない場合は ScriptProperties.CONFIG_SPREADSHEET_ID を参照します。
スプレッドシートを開いた状態で「採点アプリ」→「ルール用シートを初期化」を実行すると、_templates / _rules シートがなければ作成し、必要なヘッダを準備できます。既にシートや別名ヘッダがある場合は既存データを消さず、不足しているヘッダだけを補完します。テンプレパックを使わずに手動でルールを書き始める場合は、まずこのメニューを実行してください。
v1.0.0 候補では、採点値入力列は次の仕様で確定します。
- 採点値入力列は最大5枠です。
- 空欄の枠は未使用です。
- 同じ列は複数の採点枠に指定できません。
- 列名は trim と大文字化の後に比較されます。例:
aaとAAは同じ列として扱います。 - 重複がある場合は保存時にエラーになります。例:
採点値入力列が重複しています: AA
統合ルール(重複列を合算・連結して保存する機能)は、v1.0.0 候補の公開仕様から外しています。リポジトリ内に将来拡張用のコードが残っていても、v1.0.0 候補の利用手順としては使いません。
設定画面の歯車ボタンから変更できます。設定は ScriptProperties の CONFIG に保存されます。
- ヘッダ行: 初期値は
1。表示名や列選択に使います。 - 開始行: 初期値は
2。採点対象データの開始行です。 - 生徒名の列: 初期値は
B。 - 採点画面表示列: 初期値は
N,O,Q。提出内容として表示する列です。 - 採点値入力列: 初期値は
AA,AB,AC,AD,AE。最大5枠です。 - 講評/改善点入力列:
_rules.targetごとに最大3枠まで割り当てられます。 - 末行から開始: ON の場合、初期表示をシート末尾から始めます。
- シート選択: 画面上部のシートプルダウンを使います。
- 開始行: 行番号を入力して「適用」を押します。
- 得点入力: 5つの採点枠へ数字を入力します。列名が空の枠は保存・評価に使いません。
- 講評/改善点: 自動生成された文を必要に応じて編集できます。
- 保存: 行移動時、または「まとめて保存」で未送信の差分を保存します。
主なキー操作:
↑/↓: 前後の行へ移動←/→: 得点枠を移動Enter: 次の得点枠へ移動Ctrl+Enter: 講評/改善点を再評価Ctrl+S: まとめて保存F8: 採点対象スプレッドシートを開くF9: ルール用スプレッドシートを開く
自動講評は _templates と _rules を使います。直接シートを編集する方法と、JSON形式のテンプレパックをエクスポート/インポートする方法があります。
手動でルールを作る場合は、スプレッドシートの「採点アプリ」→「ルール用シートを初期化」で _templates / _rules のヘッダを準備してから、各行を入力します。設定画面の「ルール用シートを準備」ボタンからも同じ準備を実行できます。
必須列:
templateId: テンプレートID。trim + lowercase で比較します。許容ヘッダ名はtemplateId,templateです。enabled: 有効フラグです。許容ヘッダ名はenabled,enable,active,isEnabled,isActiveです。値は1,"1",true,"true","TRUE"が有効です。
推奨列:
name: UI表示名です。許容ヘッダ名はname,label,title,displayNameです。
必須列:
templateId:_templates.templateIdと一致するIDです。許容ヘッダ名はtemplateId,templateです。enabled: 有効フラグです。許容ヘッダ名はenabled,enable,active,isEnabled,isActiveです。値は_templates.enabledと同じく1,"1",true,"true","TRUE"が有効です。priority: 数値。小さいほど優先されます。許容ヘッダ名はpriority,prio,order,rankです。whenExpr: 条件式です。許容ヘッダ名はwhenExpr,when,expr,condition,ifです。message: 講評本文です。許容ヘッダ名はmessage,text,output,result,commentです。
任意列:
target: 出力先サブグループ名です。最大3つまで講評/改善点枠に割り当てられます。許容ヘッダ名はtarget,dest,group,outputTargetです。visible: UIの「現在のテンプレ条件」に表示するかどうかを示します。許容ヘッダ名はvisible,show,displayです。シート上では1または"1"が表示扱いです。
評価時は、選択中のテンプレートIDに属する有効なルールだけを priority 昇順で見ます。同じ target では最初にマッチした1件だけを採用します。設定画面の「講評/改善点入力列」で、target 名ごとに最大3枠まで出力先列を割り当てます。
テンプレパックは、_templates と _rules の行データを配布・再利用するためのJSON形式です。設定画面下部の「テンプレパックのエクスポート/インポート」から操作できます。画面上設定(CONFIG)のエクスポート/インポートとは別機能です。
{
"meta": {
"type": "scoring-tool-template-pack",
"version": "0.1.0",
"name": "テンプレパック名",
"exportedAt": "2026-05-24T00:00:00.000Z"
},
"templates": [
{
"templateId": "bio_basic",
"name": "生物基礎・記述",
"enabled": true
}
],
"rules": [
{
"templateId": "bio_basic",
"target": "講評",
"priority": 10,
"whenExpr": "score1 + score2 >= 7 and score3 >= 3",
"message": "よく書けています。",
"enabled": true,
"visible": true
}
]
}| キー | 型 | 説明 |
|---|---|---|
type |
文字列 | 固定値 scoring-tool-template-pack です。 |
version |
文字列 | テンプレパック仕様のバージョンです。現在は 0.1.0 です。 |
name |
文字列 | テンプレパックの表示名です。 |
exportedAt |
文字列 | ISO形式のエクスポート日時です。 |
version は 0.1.0 を推奨します。現行実装は将来互換のため文字列であることを検証し、値の完全一致までは要求しません。
| キー | 型 | 対応先 | 説明 |
|---|---|---|---|
templateId |
文字列 | _templates.templateId |
テンプレートIDです。trim + lowercase で衝突判定します。 |
name |
文字列 | _templates.name |
UI表示名です。 |
enabled |
真偽値 | _templates.enabled |
テンプレート全体の有効フラグです。 |
| キー | 型 | 対応先 | 説明 |
|---|---|---|---|
templateId |
文字列 | _rules.templateId |
所属するテンプレートIDです。templates に存在する必要があります。 |
target |
文字列 | _rules.target |
出力先サブグループ名です。最大3種類まで講評/改善点枠に反映されます。 |
priority |
数値 | _rules.priority |
小さい順に評価されます。同じ値の場合はシート上の行順です。 |
whenExpr |
文字列 | _rules.whenExpr |
条件式です。空欄は常にマッチします。 |
message |
文字列 | _rules.message |
講評本文です。先頭が = の場合は message式として評価されます。 |
enabled |
真偽値 | _rules.enabled |
ルールの有効フラグです。 |
visible |
真偽値 | _rules.visible |
条件一覧への表示フラグです。評価可否には影響しません。インポート時はシートへ 1 / 0 として保存します。 |
設定画面の「テンプレパックをエクスポート」を押すと、現在の _templates と _rules をJSONとして出力します。有効・無効の行をどちらも含めます。クリップボードへのコピーを試み、失敗した場合は画面にJSONを表示します。
設定画面の「テンプレパックをインポート」からJSONファイルを選択します。取り込み前に確認ダイアログを表示し、検証に通った場合だけ _templates と _rules へ追記します。シートがない場合は作成し、必要ヘッダがない場合は補完します。
既存の _templates に同じ templateId がある場合はインポートを中止します。大文字小文字だけが違うIDも同一扱いです。上書きしたい場合は、先に既存行を整理するか、JSON側の templateId を変更してください。
インポート後は、設定画面のテンプレート選択で追加されたテンプレートを選び、講評/改善点入力列の target と列を確認してから保存してください。テンプレパックの取り込みだけでは、現在選択中のテンプレートや出力先列は自動変更されません。
サンプルとして samples/template-pack-bio-basic.json を用意しています。個人情報や実在生徒のデータは含まず、生物の記述採点で試せる汎用的な内容です。score1 + score2 >= 7 and score3 >= 3、total >= 6、total < 6 の条件で、「講評」と「改善点」の2種類の target を試せます。
v1.0.0 候補の whenExpr は、score1〜score5、total、加算、比較、論理条件を正式仕様とします。whenExpr と message式の式評価は、サーバー側とクライアント側で同じ仕様に揃えています。
使用できる主な構文:
- 変数:
score1,score2,score3,score4,score5,total - 数値リテラル:
0,3,4.5など - 括弧:
(,) - 比較:
==,!=,>=,<=,>,< - 論理(推奨表記):
and,or,not - 論理(互換表記):
&&,||,! - 加算:
+
score1〜score5 は、設定画面の「採点値入力列」1枠目〜5枠目に対応します。たとえば1枠目が AA、2枠目が AB の場合、score1 + score2 は AA と AB に入力した点数の合計です。total は渡された total 値ではなく、常に score1〜score5 から再計算されます。
例:
score1 >= 3
score1 + score2 >= 7
score1 + score2 >= 7 and score3 >= 3
score1 >= 3 or score2 >= 3
not(score1 == 0)
total >= 20
total は score1〜score5 の合計です。数値として解釈できる値だけを加算し、未入力や非数値は 0 として扱います。+ も同じく数値加算として扱い、数値として解釈できない値は 0 扱いです。
-, *, / は whenExpr では未対応です。必要な場合は score1 + score2 や total で表現してください。
whenExpr が空欄の場合は常にマッチします。構文エラーのある行はスキップされ、他のルール評価は継続します。未閉じの文字列は構文エラーです。
補足として、評価器は true / false / null と、"..." または '...' の文字列リテラルも扱えます。ただし初見向けの推奨は、点数・合計・比較・論理条件だけで書く形です。not は誤読を避けるため、not(score1 == 0) のように括弧付きで書いてください。
_rules.message は、先頭が = の場合に式として評価されます。先頭が = でない場合は通常の文字列としてそのまま表示します。先頭に ' を付けると、' だけを外して文字列として表示します。
例:
=label1 & ":" & map(score1,"1=要確認,2=改善中,3=良好")
=score1+score2+score3
'=score1+score2
使える主な要素:
- スコア参照:
score1〜score5 - スロット参照:
1〜5 - ラベル参照:
label1〜label5 - 文字列連結:
& - 置換:
map(x,"k=v,...")
label1〜label5 は採点値入力列の見出しではなく、採点画面上部の項目名(slotLabels)です。
map(score1,"1=×,2=△,3=○") は、左側の値を変換表で置き換えます。キーが見つからない場合は元の値をそのまま返します。map は message式専用です。whenExpr では使えません。サイドバーの文言式ビルダーでは、変換対象と変換表を入力して map(...) を生成できます。変換表はカンマ区切りの key=value 形式です。値の中にカンマを含める書き方は未対応です。
message式の + は数値加算です。文字列をつなぐ場合は & を使ってください。現行の message式では、score1+score2 のような単純な数値加算は使えますが、label1 & score1+score2 のように & / label / map と + を同じ式内で混在させる書き方は非対応です。混在が必要な場合は、条件を whenExpr 側へ寄せるか、個別スコアの文言に分けてください。
message式では total は使えません。入力済みの複数スコアを足して文言へ出す場合は、=score1+score2 のように実際に使うスコアだけを足してください。参照したスコアに未入力や非数値が含まれる場合、その message式は空文字になります。文字列リテラルは二重引用符 "..." を使います。
sidebar.html は whenExpr / message式の手入力と、よく使う式をフォームから作るための補助ツールです。スプレッドシートを開いたときに追加される「採点アプリ」→「whenExpr 記述ツール」から開きます。
サイドバー幅でも見通しを保つため、画面上に全機能を常時表示する設計ではなく、必要な機能だけを表示する3モード構成です。式ウインドウ、貼り付け、クリア、コピー、戻る、進むは常に上部に表示し、各モードの詳細説明や直接挿入ボタンは折りたたんでいます。
できること:
- 式ウインドウで whenExpr / message式を手入力する
- 「条件を作る」で
(score1 + score2) >= 7 and score3 >= 3やtotal >= 20を作る - 「文言を作る」で
="観点「" & label1 & "」は" & map(score1,"1=要確認,2=改善中,3=良好") & "です。"のような message式を作る - 「文言を作る」の「点数を文言に変換」で、画面上は変換表として入力し、内部的には
map(score1,"1=要確認,2=改善中,3=良好")を生成する - 「手入力・部品」で
score1〜score5、total、label1〜label5、比較、論理、括弧などのボタンを手入力中のカーソル位置へ挿入する - クリップボードへコピーする
- 選択セルへ貼り付け、1行下へ移動する
式ビルダーは、既存の手入力を置き換えるものではありません。生成されたDSLは式ウインドウに反映され、必要に応じて手で直してから貼り付けます。入力した式の完全な妥当性検証や、whenExpr と message式の文法差分をすべて自動判定する機能はありません。
使い分け:
_rules.whenExpr列へ貼る場合: 「条件を作る」または「手入力・部品」を使います。先頭=は付けません。mapとlabel1〜label5は使えません。_rules.message列へ貼る場合: 「文言を作る」または「手入力・部品」を使います。式として評価したい場合は先頭=が必要です。通常文として保存する場合は=を付けません。=...で始まる文字列を通常文として扱いたい場合: 先頭に'を付けます。例:'=score1+score2
設定画面下部から、画面上設定(CONFIG)をJSONとしてエクスポート/インポートできます。
- エクスポート形式は
metaとconfigを持つJSONです。 meta.versionはv0.1.0です。- インポート時は現在設定を
CONFIG_BACKUP_LATESTに1世代バックアップします。 - 「インポート前に復元」または
apiRestoreLatestConfigBackup()で直近バックアップへ戻せます。 _templates/_rulesシートの行データはエクスポート/インポート対象外です。configには内部互換用のmergeRulesキーが含まれます。画面上設定JSONの検証上は必要ですが、v1.0.0 候補の公開仕様として統合ルールは使いません。新規設定では空オブジェクト{}のままにしてください。
- 得点は、列名が空の枠、空欄の入力、列チェックがONの枠は書き込みをスキップします。
- 採点値入力列に重複がある設定では、
apiSetConfigと行保存処理の両方でエラーになります。 - 講評/改善点の指定列は、空文字でも上書き保存します。
- 設定はスクリプト単位で共有されます。ユーザーごとの設定分離は v1.0.0 候補では未対応です。
Webアプリ本体は、入力中の体感速度を優先してクライアント側でルールを評価します。サーバー側にも同じ target ごとの複数出力評価を行う evaluateRulesByTarget_ を置き、テストでクライアント側 evaluateRulesLocallyMulti_ と同じ結果になることを確認しています。
apiApplyRules は後方互換用の単一出力APIです。現在のWebアプリ本体が使う最大3枠の講評/改善点評価とは用途が違うため、新しい処理では target ごとの評価仕様を基準にしてください。
- 重複する採点値入力列を合算・連結して保存する統合ルール
- サイドバー上での完全な構文検証
- ユーザーごとの個別設定
- 旧設定キーの自動移行
GAS実行環境がない場合でも、次を確認してください。
node --test tests/*.test.jsCode.gsにassertUniqueScoreCols_が定義されていることapiSetConfigとsaveRowToSheet_からassertUniqueScoreCols_が呼ばれていること- README と設定画面に、古い重複列処理の説明が残っていないこと
- whenExpr の
score1 + score2 >= 7、score1 + score2 >= 7 and score3 >= 3、score1 >= 3 or score2 >= 3、not(score1 == 0)、total >= 20がサーバー側とクライアント側で同じ結果になること - message式の
=label1 & ":" & map(score1,"1=×,2=△,3=○")がサーバー側とクライアント側で同じ結果になること - target ごとの複数出力評価がサーバー側とクライアント側で同じ結果になること
- sidebar式ビルダーが
(score1 + score2) >= 7 and score3 >= 3、total >= 20、="観点「" & label1 & "」は" & map(score1,"1=要確認,2=改善中,3=良好") & "です。"を生成できること
- シート一覧が取得できない場合は、採点対象スプレッドシートのURL/IDと権限を確認してください。
- ルールが適用されない場合は、
_templates.enabled、_rules.enabled、priority、templateIdの一致、whenExprの構文を確認してください。 - 採点値入力列の保存でエラーになる場合は、同じ列を複数枠に指定していないか確認してください。