serval 取扱説明書
トーナメント・リーグ戦管理システム — Google Apps Script ウェブアプリ
servalとは
serval はロボット競技大会を対象としたトーナメント・リーグ戦管理ウェブアプリです。 Google スプレッドシートをデータベースとして利用し、Google Apps Script(GAS)のウェブアプリとしてブラウザ上で動作します。インストール不要、サーバー不要。
- シングル・ダブルエリミネーション形式のトーナメント管理
- リーグ戦(総当たり)の得点管理
- 修理タイマー・試合タイマー
- 別画面(観客向け表示)のリアルタイム同期
- LINE通知(次の試合の呼び出し)
- X(旧Twitter)への試合結果シェア
システム構成
大会シリーズ(ブック)ごとに独立した GAS プロジェクトを1つ用意します。 各ブックの中に第1回・第2回…の各トーナメントが入る、2階層の構造です。 すべてのブックは serval ポータル から一元管理します。
| 用語 | 説明 |
|---|---|
| ブック(Book) | GASプロジェクト1つ=大会シリーズ1つ。例:「中島杯」全体。データは1つのスプレッドシートで管理される |
| トーナメント(Tournament) | ブック内の各回。例:中島杯の第7回・第6回・…。「第N回」と「トーナメント名(docKey)」をペアで登録する |
| GASウェブアプリ(/exec) | トーナメント管理アプリ本体。URLに ?doc=JimaCup7 のように docKey を付けて各回のデータを区別する |
| Googleスプレッドシート | GASに自動紐付けされるデータ保存先。「Store」シートに全回分のデータを保存 |
| ポータル(sin1.studio/serval/) | ブック一覧・トーナメント追加の管理画面。GitHub Pagesで配信 |
?doc=JimaCup7 を付けてアクセスします。
新規ブックの作り方(新しい大会シリーズを登録する)
-
GASプロジェクトをコピー作成
script.google.com にアクセスします。 既存の serval プロジェクト(例: TournamentManager)を開き、左上メニュー「…」→「コピーを作成」を選択します。 新しいスプレッドシートとGASプロジェクトが自動で作成されます。 -
ウェブアプリとしてデプロイ
コピーしたGASを開き、右上「デプロイ」→「新しいデプロイ」を選択。 種類「ウェブアプリ」を選び、次のように設定します:- 説明:任意(例: 中島杯)
- 次のユーザーとして実行:自分(例: sin1@sin1.studio)
- アクセスできるユーザー:全員(Googleアカウント不要)
/execの URL をコピーします。 -
スクリプトプロパティを設定
GASエディタの左側「⚙ プロジェクトの設定」→「スクリプトプロパティ」を開きます。 「プロパティを追加」で以下を設定してください:プロパティ名 値 用途 ADMIN_TOKEN任意のパスワード ポータルからの書き込み認証 LINE_TOKENLINE Notifyトークン LINE通知(任意) LINE_CALL_URL呼び出しサーバーのURL LINE呼び出し(任意) -
ポータルでブックを作成・URLを登録
serval ポータル を開き、「+ 新規ブック」をクリックします。 ブック名(例: 中島杯)を入力し、コピーした/execURLを「GAS WebアプリURL」欄に貼り付けて保存します。 準備中カードが作成され、黄色バーに変わります。 -
ブックカードにトーナメントを追加
ポータルのブックカード下部の「第 __ 回 トーナメント名」欄に入力して「+ 追加」をクリックします。 例:第7回、トーナメント名JimaCup7→ 「第7回 / JimaCup7 / 開く / 管理」の行が表示されます。 「開く」は?doc=JimaCup7付きのURL、「管理」は?doc=JimaCup7&admin付きのURLを開きます。
トーナメントの追加(同じブックの次の回を登録する)
中島杯の第6回・第8回など、同じ大会シリーズの新しい回を追加するには、同じGASに新しいトーナメントを登録するだけです。 新たにGASをコピーする必要はありません。同じスプレッドシートに回ごとのデータが別キーで保存されます。
-
ポータルで対象のブックカード(例: 中島杯)を開く
-
カード下部の追加行に「第
8回JimaCup8」のように入力して「+ 追加」をクリック -
「開く」ボタンから
?doc=JimaCup8付きのURLを開いて、新しいトーナメントの選手登録・設定を行う
GASのコード更新手順(servalのバージョンアップ時)
serval 本体のコード(Code.gs / app.html など)が更新された場合、各ブックのGASにも反映が必要です。
-
更新済みの serval プロジェクト(TournamentManager)から更新内容を確認
-
各ブックのGASプロジェクトを開き、該当するファイルを差し替えてコードを貼り替える
-
「デプロイ → デプロイを管理 → 編集(鉛筆)→ バージョン:新バージョン → デプロイ」で反映
-
スクリプトプロパティ(
ADMIN_TOKEN等)は引き継がれるため、通常は再設定不要
初期設定
GASウェブアプリを開き、右上の歯車アイコンから「設定」を開きます。
| 項目 | 説明 |
|---|---|
| 大会名 | 試合結果の表示やXシェアに使われます |
| 試合時間 | 1試合あたりの制限時間(秒)。デフォルト 120秒 |
| 修理時間 | 修理タイマーのデフォルト上限(秒)。デフォルト 300秒 |
| フリガナ表示 | ON にすると、漢字・英字を含む選手名にフリガナを表示 |
| 別画面(観客用) | 表示する情報を選択。URL末尾に ?board を付けてアクセス |
選手・機体登録
左サイドバーの「選手」タブから登録します。
- 選手名:表示名(漢字・英字可)
- フリガナ:カタカナ。漢字・英字名がある場合のみ表示されます
- 所属:チーム名・学校名など(任意)
- 番号:LINE通知で使う呼び出し番号(数字のみ)
- シード:トーナメントの山の組み分けに影響します
トーナメント進行
対戦組み合わせ生成
「トーナメント」タブを開き「組み合わせを生成」ボタンをクリックします。登録済みの選手から自動的にブラケットが生成されます。
試合の進行
- 対象の試合の「▶ 開始」ボタンをクリックしてタイマーを開始
- 試合終了後、「1本目」「2本目」「3本目」の結果を入力
- 勝者機体を選択して「確定」
- 次の試合に勝者が自動的に進出
リーグ戦進行
「リーグ」タブで総当たり戦を管理します。各対戦の勝敗ポイントを入力すると自動的に順位表が更新されます。
別画面表示(観客用)
GASウェブアプリのURLの末尾に ?board を付けてアクセスすると、観客向けの表示専用画面になります。
https://script.google.com/macros/s/…/exec?board
運営画面での操作がリアルタイムで別画面に反映されます。別画面に表示する情報は設定から選べます。
| 表示オプション | 内容 |
|---|---|
| 次の試合 | 次に行われる試合の選手名・機体名 |
| 現在の試合 | 進行中の試合のタイマー・スコア |
| 修理時間 | 修理中の機体名と経過時間 |
| 順位表 | リーグ戦の現在の順位 |
修理タイマー
試合終了後に修理時間を計測できます。試合の右カラムの「修理開始」ボタンで計測開始。設定で指定した上限時間に達すると別画面の表示から自動的に消えます。
LINE通知
次の試合に呼ばれる選手にLINEで自動通知します。
設定手順
-
LINE Notify でトークンを取得(「トークへの通知」で自分のトークに送るのが簡単)
-
呼び出しサーバーを起動。line-call-system を PC でローカル起動し、cloudflared などで外部公開URLを取得。
-
GASのスクリプトプロパティに設定:
LINE_TOKEN:LINE NotifyのトークンLINE_CALL_URL:呼び出しサーバーの外部URL(例:https://xxxx.trycloudflare.com)
-
選手の「番号」欄に呼び出し用の番号(数字のみ)を登録
アナウンス
「設定 → アナウンス」に短いテキストを入力すると、別画面の「応援」ボタンと試合キューの間に表示されます。 休憩時間のお知らせや「14時まで 自由練習」などを一時的に表示するのに使います。空にすると非表示になります。
バナー広告
「設定 → バナー」から画像URLと表示時間を設定できます。別画面で試合と試合の間にバナーが自動的に表示されます。
X(Twitter)シェア
試合確定後に「Xシェア」ボタンが表示されます。試合結果の画像を生成してXに投稿できます。 Renderにデプロイされたシェアサーバーが画像生成を担当します。
ポータル管理
serval ポータル からブックの一覧表示・編集・削除と、各ブック内トーナメントの追加・削除ができます。
- ブックカード:「編集」でブック名・GAS URL・メモを更新、「削除」でポータルから非表示(ソフトデリート)
- トーナメント行:「開く」→選手閲覧モード、「管理」→管理者モード(パスワード認証あり)、「×」で行を削除
- 「削除済みも表示」チェックで削除済みブックを表示し「復元」できます。GASのデータ自体は削除されません。
ポータルの書き込み操作(作成・更新・削除・トーナメント追加)には管理者パスワードが必要です。 初回アクセス時にプロンプトが表示され、ブラウザのlocalStorageに保存されます。
データ管理
全データはGASに紐付いたGoogleスプレッドシートの「Store」シートに保存されています。 Googleドライブ上でそのまま閲覧・ダウンロード・バックアップができます。
トラブルシュート
| 症状 | 対処 |
|---|---|
| 画面が白いまま / 古いバージョンが表示される | Ctrl+Shift+R でキャッシュをクリアして再読み込み |
| 「init is not defined」エラー | GASのスクリプトにSyntaxErrorがある可能性。管理者に報告 |
| LINE通知が来ない |
|
| 別画面が更新されない | 別画面は定期的にポーリングしています。ネットワーク状況を確認し、ページを再読み込みしてください |
| ポータルにアクセスできない(CORS エラー) | レジストリGASのデプロイが最新か確認。GASを再デプロイ(バージョン更新)してください |