Skip to content

Latest commit

 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

採点型紙(Google Apps Script / Spreadsheet)

現在の版: 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: テンプレパックのサンプルです。

セットアップ

1. Apps Script プロジェクトを作成する

Google Apps Script で新規プロジェクトを作成し、次のファイルを配置します。

  • Code.gs
  • Index.html(HTMLファイル名は Index
  • sidebar.html(サイドバーを使う場合)

appsscript.json はこのリポジトリに無い場合、無理に作成する必要はありません。

2. 採点対象スプレッドシートを指定する

推奨は Webアプリ起動後に設定画面の「採点するスプシURL」へ URL または ID を入力する方法です。値は ScriptPropertiesTARGET_SPREADSHEET_ID に保存されます。

コードで固定したい場合は、Code.gsSPREADSHEET_ID を書き換えてください。TARGET_SPREADSHEET_ID が未設定の場合に使われます。

3. Webアプリとしてデプロイする

Apps Script の「デプロイ」→「新しいデプロイ」→種類「ウェブアプリ」を選びます。

  • 実行するユーザー: 自分
  • アクセスできるユーザー: まずは「自分のみ」を推奨

初回アクセス時は、スプレッドシートへのアクセス承認が必要です。

4. ルール用シートを用意する

自動講評を使う場合は、設定用スプレッドシートに _templates_rules を作成します。設定用スプレッドシートは、コンテナバインドされたスプレッドシートが優先されます。取得できない場合は ScriptProperties.CONFIG_SPREADSHEET_ID を参照します。

スプレッドシートを開いた状態で「採点アプリ」→「ルール用シートを初期化」を実行すると、_templates / _rules シートがなければ作成し、必要なヘッダを準備できます。既にシートや別名ヘッダがある場合は既存データを消さず、不足しているヘッダだけを補完します。テンプレパックを使わずに手動でルールを書き始める場合は、まずこのメニューを実行してください。

採点値入力列の仕様

v1.0.0 候補では、採点値入力列は次の仕様で確定します。

  • 採点値入力列は最大5枠です。
  • 空欄の枠は未使用です。
  • 同じ列は複数の採点枠に指定できません。
  • 列名は trim と大文字化の後に比較されます。例: aaAA は同じ列として扱います。
  • 重複がある場合は保存時にエラーになります。例: 採点値入力列が重複しています: AA

統合ルール(重複列を合算・連結して保存する機能)は、v1.0.0 候補の公開仕様から外しています。リポジトリ内に将来拡張用のコードが残っていても、v1.0.0 候補の利用手順としては使いません。

基本設定

設定画面の歯車ボタンから変更できます。設定は ScriptPropertiesCONFIG に保存されます。

  • ヘッダ行: 初期値は 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 のヘッダを準備してから、各行を入力します。設定画面の「ルール用シートを準備」ボタンからも同じ準備を実行できます。

_templates

必須列:

  • templateId: テンプレートID。trim + lowercase で比較します。許容ヘッダ名は templateId, template です。
  • enabled: 有効フラグです。許容ヘッダ名は enabled, enable, active, isEnabled, isActive です。値は 1, "1", true, "true", "TRUE" が有効です。

推奨列:

  • name: UI表示名です。許容ヘッダ名は name, label, title, displayName です。

_rules

必須列:

  • 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)のエクスポート/インポートとは別機能です。

JSON構造

{
  "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
    }
  ]
}

meta

キー 説明
type 文字列 固定値 scoring-tool-template-pack です。
version 文字列 テンプレパック仕様のバージョンです。現在は 0.1.0 です。
name 文字列 テンプレパックの表示名です。
exportedAt 文字列 ISO形式のエクスポート日時です。

version0.1.0 を推奨します。現行実装は将来互換のため文字列であることを検証し、値の完全一致までは要求しません。

templates

キー 対応先 説明
templateId 文字列 _templates.templateId テンプレートIDです。trim + lowercase で衝突判定します。
name 文字列 _templates.name UI表示名です。
enabled 真偽値 _templates.enabled テンプレート全体の有効フラグです。

rules

キー 対応先 説明
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 >= 3total >= 6total < 6 の条件で、「講評」と「改善点」の2種類の target を試せます。

whenExpr の仕様

v1.0.0 候補の whenExpr は、score1score5total、加算、比較、論理条件を正式仕様とします。whenExpr と message式の式評価は、サーバー側とクライアント側で同じ仕様に揃えています。

使用できる主な構文:

  • 変数: score1, score2, score3, score4, score5, total
  • 数値リテラル: 0, 3, 4.5 など
  • 括弧: (, )
  • 比較: ==, !=, >=, <=, >, <
  • 論理(推奨表記): and, or, not
  • 論理(互換表記): &&, ||, !
  • 加算: +

score1score5 は、設定画面の「採点値入力列」1枠目〜5枠目に対応します。たとえば1枠目が AA、2枠目が AB の場合、score1 + score2AAAB に入力した点数の合計です。total は渡された total 値ではなく、常に score1score5 から再計算されます。

例:

score1 >= 3
score1 + score2 >= 7
score1 + score2 >= 7 and score3 >= 3
score1 >= 3 or score2 >= 3
not(score1 == 0)
total >= 20

totalscore1score5 の合計です。数値として解釈できる値だけを加算し、未入力や非数値は 0 として扱います。+ も同じく数値加算として扱い、数値として解釈できない値は 0 扱いです。

-, *, / は whenExpr では未対応です。必要な場合は score1 + score2total で表現してください。

whenExpr が空欄の場合は常にマッチします。構文エラーのある行はスキップされ、他のルール評価は継続します。未閉じの文字列は構文エラーです。

補足として、評価器は true / false / null と、"..." または '...' の文字列リテラルも扱えます。ただし初見向けの推奨は、点数・合計・比較・論理条件だけで書く形です。not は誤読を避けるため、not(score1 == 0) のように括弧付きで書いてください。

message式

_rules.message は、先頭が = の場合に式として評価されます。先頭が = でない場合は通常の文字列としてそのまま表示します。先頭に ' を付けると、' だけを外して文字列として表示します。

例:

=label1 & ":" & map(score1,"1=要確認,2=改善中,3=良好")
=score1+score2+score3
'=score1+score2

使える主な要素:

  • スコア参照: score1score5
  • スロット参照: 15
  • ラベル参照: label1label5
  • 文字列連結: &
  • 置換: map(x,"k=v,...")

label1label5 は採点値入力列の見出しではなく、採点画面上部の項目名(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 >= 3total >= 20 を作る
  • 「文言を作る」で ="観点「" & label1 & "」は" & map(score1,"1=要確認,2=改善中,3=良好") & "です。" のような message式を作る
  • 「文言を作る」の「点数を文言に変換」で、画面上は変換表として入力し、内部的には map(score1,"1=要確認,2=改善中,3=良好") を生成する
  • 「手入力・部品」で score1score5totallabel1label5、比較、論理、括弧などのボタンを手入力中のカーソル位置へ挿入する
  • クリップボードへコピーする
  • 選択セルへ貼り付け、1行下へ移動する

式ビルダーは、既存の手入力を置き換えるものではありません。生成されたDSLは式ウインドウに反映され、必要に応じて手で直してから貼り付けます。入力した式の完全な妥当性検証や、whenExpr と message式の文法差分をすべて自動判定する機能はありません。

使い分け:

  • _rules.whenExpr 列へ貼る場合: 「条件を作る」または「手入力・部品」を使います。先頭 = は付けません。maplabel1label5 は使えません。
  • _rules.message 列へ貼る場合: 「文言を作る」または「手入力・部品」を使います。式として評価したい場合は先頭 = が必要です。通常文として保存する場合は = を付けません。
  • =... で始まる文字列を通常文として扱いたい場合: 先頭に ' を付けます。例: '=score1+score2

画面上設定のエクスポート/インポート

設定画面下部から、画面上設定(CONFIG)をJSONとしてエクスポート/インポートできます。

  • エクスポート形式は metaconfig を持つJSONです。
  • meta.versionv0.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 ごとの評価仕様を基準にしてください。

v1.0.0 候補で未対応・検討中のこと

  • 重複する採点値入力列を合算・連結して保存する統合ルール
  • サイドバー上での完全な構文検証
  • ユーザーごとの個別設定
  • 旧設定キーの自動移行

動作確認の目安

GAS実行環境がない場合でも、次を確認してください。

  • node --test tests/*.test.js
  • Code.gsassertUniqueScoreCols_ が定義されていること
  • apiSetConfigsaveRowToSheet_ から assertUniqueScoreCols_ が呼ばれていること
  • README と設定画面に、古い重複列処理の説明が残っていないこと
  • whenExpr の score1 + score2 >= 7score1 + score2 >= 7 and score3 >= 3score1 >= 3 or score2 >= 3not(score1 == 0)total >= 20 がサーバー側とクライアント側で同じ結果になること
  • message式の =label1 & ":" & map(score1,"1=×,2=△,3=○") がサーバー側とクライアント側で同じ結果になること
  • target ごとの複数出力評価がサーバー側とクライアント側で同じ結果になること
  • sidebar式ビルダーが (score1 + score2) >= 7 and score3 >= 3total >= 20="観点「" & label1 & "」は" & map(score1,"1=要確認,2=改善中,3=良好") & "です。" を生成できること

トラブルシューティング

  • シート一覧が取得できない場合は、採点対象スプレッドシートのURL/IDと権限を確認してください。
  • ルールが適用されない場合は、_templates.enabled_rules.enabledprioritytemplateId の一致、whenExpr の構文を確認してください。
  • 採点値入力列の保存でエラーになる場合は、同じ列を複数枠に指定していないか確認してください。

About

Googleスプレッドシート上の提出データを読み込み、最大5枠の得点と、最大3枠の講評/改善点を入力して同じシートへ保存するためのGAS Webアプリです。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages