serval 取扱説明書

トーナメント・リーグ戦管理システム — Google Apps Script ウェブアプリ

servalとは

serval はロボット競技大会を対象としたトーナメント・リーグ戦管理ウェブアプリです。 Google スプレッドシートをデータベースとして利用し、Google Apps Script(GAS)のウェブアプリとしてブラウザ上で動作します。インストール不要、サーバー不要。

システム構成

大会シリーズ(ブック)ごとに独立した 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で配信
ポイント
1つのGASプロジェクト = 1ブック(大会シリーズ)。中島杯の第7回・第6回はすべて同じGASとスプレッドシートで管理します。 第N回のデータは docKey(例: JimaCup7)で区別され、GAS URLに ?doc=JimaCup7 を付けてアクセスします。

新規ブックの作り方(新しい大会シリーズを登録する)

  1. GASプロジェクトをコピー作成
    script.google.com にアクセスします。 既存の serval プロジェクト(例: TournamentManager)を開き、左上メニュー「…」→「コピーを作成」を選択します。 新しいスプレッドシートとGASプロジェクトが自動で作成されます。
  2. ウェブアプリとしてデプロイ
    コピーしたGASを開き、右上「デプロイ」→「新しいデプロイ」を選択。 種類「ウェブアプリ」を選び、次のように設定します:
    • 説明:任意(例: 中島杯)
    • 次のユーザーとして実行:自分(例: sin1@sin1.studio)
    • アクセスできるユーザー:全員(Googleアカウント不要)
    「デプロイ」をクリックし、承認ダイアログが出た場合は「アクセスを承認」→ Googleアカウントを選択 →「詳細」→「(プロジェクト名)に移動」→「許可」の順に操作します。 表示された /exec の URL をコピーします。
  3. スクリプトプロパティを設定
    GASエディタの左側「⚙ プロジェクトの設定」→「スクリプトプロパティ」を開きます。 「プロパティを追加」で以下を設定してください:
    プロパティ名用途
    ADMIN_TOKEN任意のパスワードポータルからの書き込み認証
    LINE_TOKENLINE NotifyトークンLINE通知(任意)
    LINE_CALL_URL呼び出しサーバーのURLLINE呼び出し(任意)
  4. ポータルでブックを作成・URLを登録
    serval ポータル を開き、「+ 新規ブック」をクリックします。 ブック名(例: 中島杯)を入力し、コピーした /exec URLを「GAS WebアプリURL」欄に貼り付けて保存します。 準備中カードが作成され、黄色バーに変わります。
  5. ブックカードにトーナメントを追加
    ポータルのブックカード下部の「第 __ 回 トーナメント名」欄に入力して「+ 追加」をクリックします。 例:第 7 回、トーナメント名 JimaCup7 → 「第7回 / JimaCup7 / 開く / 管理」の行が表示されます。 「開く」は ?doc=JimaCup7 付きのURL、「管理」は ?doc=JimaCup7&admin 付きのURLを開きます。
ヒント
デプロイ後に「コードを修正してもウェブアプリに反映されない」場合は、「デプロイ → デプロイを管理 → 編集(鉛筆アイコン)→ バージョン:新バージョン → デプロイ」で更新できます。

トーナメントの追加(同じブックの次の回を登録する)

中島杯の第6回・第8回など、同じ大会シリーズの新しい回を追加するには、同じGASに新しいトーナメントを登録するだけです。 新たにGASをコピーする必要はありません。同じスプレッドシートに回ごとのデータが別キーで保存されます。

  1. ポータルで対象のブックカード(例: 中島杯)を開く
  2. カード下部の追加行に「第 8 回 JimaCup8」のように入力して「+ 追加」をクリック
  3. 「開く」ボタンから ?doc=JimaCup8 付きのURLを開いて、新しいトーナメントの選手登録・設定を行う
注意
同じGAS内でデータが共存するため、docKey(例: JimaCup8)は他の回と重複しないようにしてください。 容量が逼迫してきたら(管理画面のデータサイズバーが70%超)、新しいGASを別途コピーして新ブックとして登録してください。

GASのコード更新手順(servalのバージョンアップ時)

serval 本体のコード(Code.gs / app.html など)が更新された場合、各ブックのGASにも反映が必要です。

  1. 更新済みの serval プロジェクト(TournamentManager)から更新内容を確認
  2. 各ブックのGASプロジェクトを開き、該当するファイルを差し替えてコードを貼り替える
  3. 「デプロイ → デプロイを管理 → 編集(鉛筆)→ バージョン:新バージョン → デプロイ」で反映
  4. スクリプトプロパティ(ADMIN_TOKEN 等)は引き継がれるため、通常は再設定不要

初期設定

GASウェブアプリを開き、右上の歯車アイコンから「設定」を開きます。

項目説明
大会名試合結果の表示やXシェアに使われます
試合時間1試合あたりの制限時間(秒)。デフォルト 120秒
修理時間修理タイマーのデフォルト上限(秒)。デフォルト 300秒
フリガナ表示ON にすると、漢字・英字を含む選手名にフリガナを表示
別画面(観客用)表示する情報を選択。URL末尾に ?board を付けてアクセス

選手・機体登録

左サイドバーの「選手」タブから登録します。

トーナメント進行

対戦組み合わせ生成

「トーナメント」タブを開き「組み合わせを生成」ボタンをクリックします。登録済みの選手から自動的にブラケットが生成されます。

試合の進行

  1. 対象の試合の「▶ 開始」ボタンをクリックしてタイマーを開始
  2. 試合終了後、「1本目」「2本目」「3本目」の結果を入力
  3. 勝者機体を選択して「確定」
  4. 次の試合に勝者が自動的に進出
ヒント
1-1(引き分け)の場合でも機体選択ボタンが有効です。3本目の勝者を選んで確定できます。

リーグ戦進行

「リーグ」タブで総当たり戦を管理します。各対戦の勝敗ポイントを入力すると自動的に順位表が更新されます。

別画面表示(観客用)

GASウェブアプリのURLの末尾に ?board を付けてアクセスすると、観客向けの表示専用画面になります。

https://script.google.com/macros/s/…/exec?board

運営画面での操作がリアルタイムで別画面に反映されます。別画面に表示する情報は設定から選べます。

表示オプション内容
次の試合次に行われる試合の選手名・機体名
現在の試合進行中の試合のタイマー・スコア
修理時間修理中の機体名と経過時間
順位表リーグ戦の現在の順位

修理タイマー

試合終了後に修理時間を計測できます。試合の右カラムの「修理開始」ボタンで計測開始。設定で指定した上限時間に達すると別画面の表示から自動的に消えます。

LINE通知

次の試合に呼ばれる選手にLINEで自動通知します。

設定手順

  1. LINE Notify でトークンを取得(「トークへの通知」で自分のトークに送るのが簡単)
  2. 呼び出しサーバーを起動。line-call-system を PC でローカル起動し、cloudflared などで外部公開URLを取得。
  3. GASのスクリプトプロパティに設定:
    • LINE_TOKEN:LINE Notifyのトークン
    • LINE_CALL_URL:呼び出しサーバーの外部URL(例:https://xxxx.trycloudflare.com
  4. 選手の「番号」欄に呼び出し用の番号(数字のみ)を登録
注意
公共WiFiで再認証が発生するとcloudflaredのトンネルURLが失効します。大会中は安定したネットワーク環境を推奨します。

アナウンス

「設定 → アナウンス」に短いテキストを入力すると、別画面の「応援」ボタンと試合キューの間に表示されます。 休憩時間のお知らせや「14時まで 自由練習」などを一時的に表示するのに使います。空にすると非表示になります。

バナー広告

「設定 → バナー」から画像URLと表示時間を設定できます。別画面で試合と試合の間にバナーが自動的に表示されます。

X(Twitter)シェア

試合確定後に「Xシェア」ボタンが表示されます。試合結果の画像を生成してXに投稿できます。 Renderにデプロイされたシェアサーバーが画像生成を担当します。

ポータル管理

serval ポータル からブックの一覧表示・編集・削除と、各ブック内トーナメントの追加・削除ができます。

ポータルの書き込み操作(作成・更新・削除・トーナメント追加)には管理者パスワードが必要です。 初回アクセス時にプロンプトが表示され、ブラウザのlocalStorageに保存されます。

データ管理

全データはGASに紐付いたGoogleスプレッドシートの「Store」シートに保存されています。 Googleドライブ上でそのまま閲覧・ダウンロード・バックアップができます。

容量上限について
GASのHTMLサービスには1プロジェクトあたり約25KBの上限があります。servalは試合数が増えると容量が増加します。管理画面のデータサイズバーで使用率を確認してください。70%を超えたら新規ブック(GASを新たにコピー)への移行を検討してください。

トラブルシュート

症状対処
画面が白いまま / 古いバージョンが表示される Ctrl+Shift+R でキャッシュをクリアして再読み込み
「init is not defined」エラー GASのスクリプトにSyntaxErrorがある可能性。管理者に報告
LINE通知が来ない
  1. LINE_TOKENLINE_CALL_URL が正しく設定されているか確認
  2. cloudflaredのトンネルが生きているか確認(公共WiFi再認証後は失効する)
  3. 選手の「番号」欄が数字のみになっているか確認
別画面が更新されない 別画面は定期的にポーリングしています。ネットワーク状況を確認し、ページを再読み込みしてください
ポータルにアクセスできない(CORS エラー) レジストリGASのデプロイが最新か確認。GASを再デプロイ(バージョン更新)してください