arithmetic-timeattack

設置手順

アプリ1つにつき、Google スプレッドシートを1つ用意する。 (ハブ / 九九 / 長さ で計3つ)

1. まずハブを作る

名簿の正本になるので、ハブから作る。

  1. 新しいスプレッドシートを作成(名前は任意)
  2. 拡張機能 > Apps Script を開く
  3. 3ファイルを貼る
Apps Script 上の名前 中身
コード.gs(既定) apps/hub/Code.gs
links(HTML) apps/hub/links.html
teacher(HTML) apps/hub/teacher.html
Analysis(.gs) apps/hub/Analysis.gs(単元横断分析)
analysis(HTML) apps/hub/analysis.html(単元横断分析)
Archive(.gs) apps/hub/Archive.gs(過年度:名簿の年度保存・個人情報の消去)
regroup(HTML) apps/hub/regroup.html(資料:くり上がり/くり下がり解説。?page=regroup で開く)

HTML は ファイル > + > HTML で追加。拡張子は入力しない(links とだけ)。

  1. 関数 setup を1回実行して承認する
  2. roster シートに児童を入力する
email 学年 組 番号 氏名
taro@example-school.ed.jp 3 2 1 山田 太郎

学年・組の表記ゆれ(「2」と「2組」の混在)は別クラス扱いになるので統一する。

記録・分析の対象になるのは、email と氏名の両方が入っている児童だけ。 名簿にない児童(転入直後など)や氏名が空の行の児童もアプリは開け、 「おためし」として全モードを使えるが、記録は一切されない。

  1. デプロイ(下記)

2. 単元アプリを作る

単元ごとに 1〜4 を繰り返す。

  1. 新しいスプレッドシートを作成
  2. 拡張機能 > Apps Script に5ファイルを貼る
Apps Script 上の名前 中身
Core(.gs) common/Core.gs
Unit(.gs) apps/grade<学年>/<単元>/Unit.gs
index(HTML) common/index.html
teacher(HTML) common/teacher.html
coop_shared(HTML) common/coop_shared.html(協力プレイの共有部品。index・teacher に挿入される)
  1. setup を1回実行して承認する
  2. roster シートの A1 に次を入れ、ハブの名簿を参照させる
=IMPORTRANGE("ハブのスプレッドシートURL","roster!A:E")

初回だけ「アクセスを許可」を押す。以後、学年やクラスの変更は ハブを直すだけで全アプリに反映される。

  1. デプロイ
  2. 教師画面(?page=teacher)の「公開モード」タブで、公開するモードにチェックを入れる

6 を忘れると児童の画面にモードが1つも出ない。 初期状態は全モードがオフで、 学年による自動の解禁は無い(docs/ARCHITECTURE.md「モードの公開」)。

3. デプロイの設定

デプロイ > 新しいデプロイ > 種類:ウェブアプリ

この組み合わせのときだけ、児童のメールアドレスが取得でき、 かつ児童はスプレッドシートへの権限を持たない(=成績を書き換えられない)。

誰が教師になるか

@edu.nishi.or.jp のアカウントは、名簿になくても教師として扱う(児童は @kyoiku.edu.nishi.or.jp)。 別ドメインの教師を足すときだけ、教師画面の「この画面を開ける教師」に1件ずつ書く。

誰が児童として使えるか

ログインできれば誰でも使える。名簿にないアカウントは「おためし」として 全モードを遊べるが、記録・分析(log / summary / weak_child など)の対象にはならない。 記録されるのは、名簿に email と氏名の両方が登録されている児童だけ。

4. ハブにリンクを登録する

ハブの教師画面(?page=teacher)を開き、単元アプリの児童用 URL を追加する。 リンクの「出る学年タブ」で、そのリンクがどの学年タブに出るかを決める (選ばないと全学年タブに出る)。

児童の画面は学年タブで切り替える。名簿にある児童が見られるのは 自分の学年のタブに加えて、教師画面の「見せるタブ」で選んだ学年のタブ (例:3年生に4年タブを見せる=3年生の行で「4年」を選ぶ)。 名簿にない児童(おためし)は全タブを見られる。

資料(児童画面の右下)

リンクの「置き場」を 右下の「資料」 にすると、タイルには出ず、児童画面の右下の「資料」ボタンの中に並ぶ。 公開/非公開と学年タブはタイルと同じに効く。資料の URL は /exec で終わらなくてよい(他サイトでもよい)。 「+ ハブの資料…」からは、ハブ自身が配るページ(くり上がり/くり下がり解説)を1押しで足せる。 資料が1件も出ない児童には「資料」ボタン自体が出ない。

links シートには10列目 place(空=タイル、doc=資料)が増える。古いシートは「保存して反映」を1回押すと見出しが付く(押すまでは全部タイル扱い)。

児童にはハブの URL だけを配ればよい。

5. 単元横断分析を使う(任意)

要件と基準の根拠は docs/ANALYSIS_REQUIREMENTS.md。ハブの スプレッドシートの所有者だけ が使う前提で作ってある。

  1. ハブで setup を所有者のアカウントで実行する(夜間集計 nightlyAnalysis のトリガーが毎日1時台にできる)
  2. 各単元の教師画面を一度開く(単元の meta シートができる。型の名前をハブへ渡すため)
  3. ハブ設定の「単元リンク」で、各単元の 「記録シート」欄にその単元のスプレッドシートの URL を入れて保存する
  4. ハブの教師画面の上に出る「単元横断分析」を開き、「今すぐ集計」を押す

6. 児童への配布

Classroom か Chromebook のブックマークにハブの URL を登録し、 全画面(□キー)で使わせる。

バージョンアップ

  1. ファイルを貼り替える
  2. 再デプロイ(デプロイを管理 → 編集 → バージョン「新しいバージョン」 → デプロイ)

setup の再実行は不要。シートの新設は次に誰かが開いた時点で自動的に行われる。

モードの公開をフラグ単位からモード単位に変えた版に上げるときは、class_config の 設定が一度リセットされる。 列名が allow_<フラグ> から mode_<番号> に変わるため、 古い列は読まれない。貼り替えたあと、教師画面でクラスごとに公開するモードを入れ直す。

作り直した版に移すとき(同じアプリの写しを新しく作った場合)

ファイルを貼り替えるのではなく、スプレッドシートごと作り直したときは、 古い入口を必ず閉じる。

ゴミ箱に入れただけでは、古い URL が開けなくなるとは限らない。 デプロイはスプレッドシートではなくスクリプトプロジェクトに紐づいており、 ゴミ箱の中のファイルも完全削除までは残る。 児童の閲覧履歴とブックマークからは、今までどおり開ける可能性がある。 古い写しと新しい写しは画面が同じなので、開けてしまえば児童も教師も見分けられない。 「たぶん開けないはず」を前提にせず、下の手順で入口そのものを潰す。

このとき起きること:

手順:

  1. ハブの教師画面で、リンクの URL を新しい /exec に差し替える
  2. Chromebook のブックマークを差し替える(配るのはハブの URL だけにしておくと、ここが1か所で済む)
  3. 古い写しの Apps Script を、案内だけのページに置き換える。 古いプロジェクトのファイルを全部消し、下の1枚だけにして再デプロイする (デプロイを管理 → 編集 → 新しいバージョン → デプロイ)
/** 旧版の入口。新しいページへ案内するだけ */
var NEW_URL = 'ここに新しい /exec の URL';

function doGet() {
  return HtmlService.createHtmlOutput(
    '<div style="font-family:system-ui,sans-serif;text-align:center;' +
    'padding:3rem 1.2rem;line-height:2.2">' +
    '<p style="font-size:1.3rem;font-weight:800">この ページは ふるく なりました。</p>' +
    '<p><a target="_top" style="font-size:1.2rem;font-weight:800" href="' + NEW_URL + '">' +
    'あたらしい ページを ひらく</a></p></div>'
  ).addMetaTag('viewport', 'width=device-width, initial-scale=1');
}

古い写しを完全に削除するのは、記録を新しい写しへ移し終えてから。 削除すると log と summary も消える。

教師画面の見出しには、いま操作している写しの名前と、児童に配る URL が出る。 公開しても反映されないときは、まずそこが児童の開いている URL と同じか確かめる。

協力モードのグループ分け

「色づかい:グループ」で使うグループは、単元のスプレッドシートの 「グループ分け」シートに置かれる(教師画面の「グループを編集…」で一度「保存」すると作られる)。 以前の版の 「組分け」シートがあれば、最初に開いた時に名前と見出しを「グループ分け」に付け替えて、そのまま使う(中身は消えない)。

自動で動くもの

時刻 内容
毎日 23時台 weak_child / weak_class を自動集計
毎日 1時台 daily シートの前日分を掃除
毎日 1時台(ハブ) 単元横断分析:各単元の log の新しい行だけを an_facts に足し込む
毎日 2時台(単元・ハブ) 4/1 だけ:roster を値のまま roster_前年度 に写す。単元は roster を空にして IMPORTRANGE の式を戻す。ハブは roster を消さない

集計は log を全走査するので、児童が使わない時間帯に回している。 授業直後にすぐ見たいときだけ、教師画面「分析」タブの「シートを今すぐ集計」を押す。

過年度

見る

名簿の年度保存

個人情報の消去(児童001 などへの置き換え)

  1. ハブの教師画面「過年度」タブで、年度の「この年度を消去」を押し、「2025年度を消去」のように入力する(所有者だけ)
  2. 全単元の記録が、年度の中で共通の番号(学年→組→番号の順)に置き換わる。学年・組・番号は残る。roster_年度 は削除される
  3. 時間切れで止まったら、もう一度押す(番号の対応表 ar_work_年度 が残っているので、同じ番号で続きから進む。終わると消える)

版の履歴には書き換える前の値が残る。 完全に消すには、消去のあとで各スプレッドシート(ハブ・各単元)について:

  1. ファイル > コピーを作成 で写しを作る(写しには版の履歴が引き継がれない)
  2. 写しに Apps Script を移し、「作り直した版に移すとき」の手順でデプロイを付け替える(単元の写しを作ったら、ハブの links の「sheet」欄も新しい写しに直す)
  3. 元のスプレッドシートをゴミ箱に入れ、ゴミ箱から完全に削除する

ほかに残るもの:手立ての内容・メモに手で書いた氏名(an_support・an_decisions)、グループ分け シート。必要なら手で消す。

トラブル対応

症状 対処
「おためしモード:きろくされません」と出る その児童が roster に無いか、氏名が空。roster の email と氏名を確認(反映は最大5分)
「ログイン情報を取得できません」 実行=自分/アクセス=ドメイン内 を再確認
「現在、ファイルを開くことができません」 スプレッドシートの URL に ?page=teacher を付けている。/exec の URL を使う
ハイスコアが更新されない 次回起動時に自動で送り直される
順位が誰にも出ない roster の学年・組の表記ゆれを確認
児童画面が「まだ もんだいが ひらいて いません」 そのクラスで公開中のモードが0件。教師画面「公開モード」タブでチェックを入れて保存(初期状態は全オフ)。保存後、開いたままの端末にも15秒ほどで出る
児童画面が「よみこみ中…」から進まない 通信が返っていない。ネットワークか /exec の URL を確認する(公開モード0件は上の別文言になる)
一部の児童だけ動く/公開が効く児童と効かない児童がいる 古い写しと新しい写しが混在している。教師画面の見出しに出る URL と、児童が開いている URL を突き合わせる(上の「作り直した版に移すとき」)
「サーバーが こんでいます」 同時実行が上限に達している。時間を置くと自動で取り直す。頻発するならクラスを2つに分けて開始をずらす
IMPORTRANGE が空 単元側の roster セルで「アクセスを許可」を押す

最初に必ず確認すること

名簿に自分だけを入れて、担任アカウントで1回通す。 Session.getActiveUser().getEmail() はドメイン設定によって空を返す事例がある。 ここが通らないと設計全体が成立しないので、40人に配る前に確かめる。