serval 取扱説明書

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

🔰 はじめての方へ

大会用のページ(doc)は開発者(sin1.studio)が事前に用意しています。GASのコピーや設定は不要で、受け取ったURLを開くだけで使い始められます。

事前に受け取るもの

もの用途共有範囲
管理用URL(末尾が &admin)運営スタッフが登録・進行に使うスタッフのみ
閲覧用URL観客・参加者がスマホで見る誰に共有してもOK
管理者パスワード管理用URLを開いたときに入力スタッフのみ(別途お知らせします)

当日までの準備

  1. 管理用URLを開いてパスワードを入力
    正しく入力すると、同じ端末・ブラウザでは次回から入力を省略できます。
  2. 大会名を入力
    画面上部中央の欄に入力します。観客の画面にも表示されます。
  3. 選手を登録
    「🏆 トーナメント設定」の「⬆ CSV読込」で名簿を一括登録します(サンプルCSVをExcelで編集すると簡単です)。選手数に合わせてトーナメント表とシード(不戦勝枠)が自動で作られます。項目の詳細は選手・機体登録へ。
  4. 組み合わせを調整
    選手の枠をドラッグ&ドロップで入れ替えられます。シードは枠をクリックして「シード設定」で変更します。
注意
シードを手で調整した後に、選手数・トーナメント数などの「構成」を変えると、シードが自動配置で振り直されます(実行前に確認が出ます)。構成は先に決めてから、最後にシードと並びを調整してください。

大会当日

  1. 結果を入力
    トーナメント表の試合をクリックすると右側に入力欄が出ます。勝者と勝ち方を選んで「送信」すると、勝ち上がりと演出が自動で行われます。
  2. 観客に公開
    閲覧用URL(QRコード化すると便利です)を共有します。会場のスクリーンには「📺 画面設定」から別画面を開いて映します(別画面表示)。
ヒント
1本先取と2本先取は、試合ごとにチェックした本数のまま送信できます。先取本数を2本に設定しておけば、序盤の試合は勝者に1つチェックして送信すると「1-0勝ち」(1本先取)、上位の試合は2つチェックすると「2-0/2-1勝ち」(2本先取)になります。切り替える回戦を事前に決める必要はありません(同点のときだけは送信できません)。
保存について
変更は数秒ごとに自動で保存され、観客の画面にも反映されます。念のため、準備の節目や大会の前後には「保存」ボタンと「⬇ バックアップ」(手元にファイルで保存)を使ってください。
お願い
管理用URLとパスワードはスタッフ内だけで共有し、SNSや配布物には載せないでください。観客に案内するのは閲覧用URLのみです。

ご自身のGoogleアカウントでデータを完全に分けて運用したい場合は、新規ブックの作り方を参照してください。

🤖 Serval Bot(操作をAIに質問する)

Serval Bot は、この取扱説明書を学習(RAG)したAIボットです。「結果はどこで入力する?」「2本先取の送り方は?」など、操作で迷ったときに日本語で質問できます。

以上をご理解のうえ、自己責任でご利用いただける方は以下からどうぞ(Google アカウントでのログインが必要です)。

🤖 Serval Bot を利用する(Gemini Notebook)

servalとは

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

詳しい機能は次の「できること」にまとめています。

できること

serval で実際にできることを、運用実績のステータス別にまとめます。分かりやすさを優先し、上記の概要と重なる項目もあえて含めています。詳しい操作は各項目のリンク先を参照してください。

実運用で検証済み

ブラケット作成

試合運営

複数ブロック・代表戦

別画面・配信連携

応援・推し投票

Xシェア・フォント

データ入出力

作成済みだが実戦での検証がまだのもの 未検証

まだ作れていない機能(今後の構想) 未実装

補足
「未検証」「未実装」の項目は今後変わる可能性があります。最新の実装状況は本ドキュメントの各セクション、または開発者に確認してください。

システム構成

大会シリーズ(ブック)ごとに独立した 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を別途コピーして新ブックとして登録してください(ver211以降は保存データを圧縮するため、通常の大会規模で逼迫することはほぼありません)。

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

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

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

画面の見かた(どこに何があるか)

管理画面(管理者としてログインした画面)は、大きく5つの場所に分かれています。

管理画面の全体。上部バー、左のメニュー、中央のトーナメント表、右のパネル、下の次の試合バー

場所何があるか
① 上部バー(画面のいちばん上)大会の切り替え・保存・バックアップ・別画面を開くボタン・閲覧モード切替
② 左のメニュー参加者リスト・トーナメント設定・各種設定・応援パネル・Xシェア・リセット
③ 中央のトーナメント表選手の枠と試合番号。枠をクリックで選手編集、試合番号(丸い数字)をクリックで結果入力
④ 右のパネル③で選んだ枠の選手情報、または選んだ試合の結果入力・タイマー
⑤ 下の「次の試合バー」次の試合・2番手・3番手。クリックでその試合を開けます

① 上部バーのボタン(左から順に)

ボタン働き
🌙(テーマ切替)画面の明るい/暗いを切り替えます(自分の画面だけ)
大会名の入力欄今開いている大会のキー(?doc= の値、例 khk26)。ふだんは触りません
📂 開く保存済みの大会の一覧から選んで開きます
✚ 新規新しい大会を作ります(今の大会は消えません)
保存今の状態をサーバーに保存します。自動でも保存されるので、押し忘れても大丈夫です。横の細いバーは保存容量の使用率です
⬇ バックアップ大会データをファイル(JSON)でパソコンに保存します。大会前後に1回取っておくと安心です
⬆ 復元バックアップしたファイルを読み込んで元に戻します(今の結果は置き換わります)
📺 別画1 / 📡 別画2 / 📺 別画3 / 📊 別画4会場モニター・配信用の別画面を新しいウィンドウで開きます。1=大型の縦型、2=横長バナー、3=追加の大型、4=WinMeter(勝敗メーター)。開いている別画面のボタンにマウスを乗せると、縮小表示が出ます
👁 閲覧観客と同じ「閲覧モード」で見え方を確認します
📋 ログエラーや通信の記録。困ったときに開発者へ見せてください
▸上部バーを折りたたみます

② 左のメニュー

ボタン開く画面と主な中身
👥 参加者リスト当日の受付用。受付チェック、状態(遅刻・早退・棄権・失格・出禁)、番号順/名前順/所属順/試合順/受付済み優先の並べ替え。棄権・失格にすると、その選手の試合に不戦勝が自動で入ります
🏆 トーナメント設定大会の形を決める画面。
・選手リスト(1行1名。「名前,所属,番号」とカンマ区切り可)と「⬆ CSV読込」
・「ランダム配置」「順に配置」
・同士討ち(同じ所属どうしの対戦)回避と、本人対決(同じ操縦者どうし)回避:しない/初戦だけ避ける/初戦と2回戦を避ける/できるだけ遠くで
・形式(トーナメント/リーグ戦)、先取本数(1〜5本先取)、トーナメント数(1〜4ブロック)、基本サイズ(4〜128)、シード数
・中央決勝(左右対向)、3位決定戦の有無、Excel連携の自動適用、複数ブロックの試合順
⚙ 表示設定タイマー(カウントダウン/カウントアップ、試合時間、修理時間)、時間のベル(30秒・10秒・0秒)と試聴、試合選択時の自動LINE呼び出し、アナウンス文、テーマ・表示倍率・枠サイズ、枠に出す内容(所属・番号・SEED・フリガナ)、次の試合一覧や応援ボタンの表示、フォント、選手ポップアップの表示項目、対戦カードの色
🏷 名称設定「機体名」「所属」「番号」などの呼び名を大会に合わせて変更(例:機体名→チーム名)
🎬 演出設定演出の表示と効果音を「管理画面」と「閲覧者・別画面」で別々にON/OFF。対戦カード演出(自動表示、二つ名を先に出す焦らし演出、表示項目、時間、効果音、通常/派手/ド派手/パチンコのテストプレイ、上位戦・決勝での自動使用)、勝ち上がり演出(自動再生、勝者線の点滅など)、動画用の書き出し
📢 バナー設定トーナメント表に置くバナー画像(A〜H)とリンク先。表示回数・クリック数も確認できます
📺 画面設定別画面1〜3とブラケット画面の見た目。背景、色、表示する内容(ブロック・回戦、試合番号、選手名、フリガナ、所属、タイプ、一言紹介、勝ち数、試合時間、修理時間、二つ名、写真、推しコメント)、赤と青の左右入れ替え、VSの表示と大きさ、入場演出、ウィンドウサイズ、フォント
📣 応援パネル推しランキング・応援ランキング・推しコメントの一覧
🐦 Xでシェアトーナメント表を画像にしてXに投稿
🗑 試合結果をリセット組み合わせはそのままで、結果だけを全部消します(確認あり)
🗑 全てリセット選手・結果を含めて全部消します(確認あり。先にバックアップを)
◂左のメニューを折りたたみます

③ 中央のトーナメント表

④ 右のパネル

選手の枠を選んだとき:機体名・フリガナ・所属・所属フリガナ・番号・代表者名・連絡先・タイプ1/2・一言紹介文・二つ名・写真URLを編集できます。ほかに「シード設定(通常/シード)」「この枠を空にする」「呼出(番号に登録済みのLINEへ連絡)」があります。

試合番号を選んだとき(上から順に):

⑤ 下の「次の試合バー」

次の試合・2番手・3番手が並びます。クリックするとその試合が④に開きます。試合の順番を入れ替えたいときは、④の「この試合を次の試合にする」「この試合をスキップする」を使います。

閲覧画面(観客のスマホ)

管理者でない人が開くと閲覧画面になります。トーナメント表が自動で更新され、選手名をタップすると選手の紹介、枠をタップすると推し投票ができます(設定による)。「❤ 応援!」ボタンやスマホを振ると応援ハートが送れます。

初期設定

大会を始める前に、左のメニューで次の順に確認すると迷いません。

  1. 🏆 トーナメント設定:選手リスト(またはCSV読込)、先取本数、ブロック数、3位決定戦の有無を決めて「ランダム配置」
  2. ⚙ 表示設定:試合時間・修理時間・時間のベル、枠に出す内容
  3. 🏷 名称設定:「機体名」などの呼び名(必要なときだけ)
  4. 🎬 演出設定・📺 画面設定:会場モニターや配信で使うときだけ

選手・機体登録

まとめて登録するときは左のメニューの「🏆 トーナメント設定」の選手リスト(またはCSV読込)、1人ずつ直すときはトーナメント表の枠をクリックして右のパネルで編集します。

CSV取込

「⬆ CSV読込」ボタンからExcel等で作成した選手名簿を一括登録できます。文字コードはUTF-8・Shift_JISの両方に対応(Excelで保存したCSVもそのまま読み込めます)。

サンプルファイル:sample_players.csv(対応する全項目を網羅した例です。ダウンロードして書式の参考にしてください)

選手名,フリガナ,所属,所属(フリガナ),番号,代表者名,連絡先,一言紹介,二つ名,写真URL
サンプルナイト,サンプルナイト,はるかぜ工業高校,ハルカゼコウギョウコウコウ,1,山田太郎,yamada@example.com,初出場です。よろしくお願いします,鋼鉄の意地,https://example.com/photos/sample-knight.jpg
テストランナー,,個人参加,,2,鈴木一郎,,,,
デモウォリアー,デモウォリアー,みなと大学ロボット研究会,ミナトダイガクロボットケンキュウカイ,3,,demo@example.com,ベスト8を目指します,,
シンプル号,,,,4,,,,,

1行目は見出し行です。以下の見出し名(いずれか1つでも完全一致すればOK)に対応しています。列の順序・列数は自由で、選手名以外は全て省略可能です(上のサンプルの4行目「シンプル号」のように選手名と番号だけでも読み込めます)。

項目使える見出し名(表記ゆれ)必須
選手名選手名/名前/ロボット名/機体名/氏名必須
フリガナフリガナ/ふりがな/よみ/読み/ヨミ/選手名(フリガナ)/機体名(フリガナ)など(全角・半角括弧どちらも可)任意
所属所属/チーム/チーム名/団体名任意
所属フリガナ所属(フリガナ)/団体名(フリガナ)など(全角・半角括弧どちらも可)任意
番号番号/No/no/ナンバー/ゼッケン任意
代表者名代表者名/代表者/操縦者/操縦者名任意
連絡先連絡先/メール/mail/電話/TEL/tel任意
一言紹介コメント/備考/一言/紹介文/紹介/一言紹介/PR任意
二つ名二つ名/二つ名・愛称/愛称/ニックネーム任意
写真URL写真URL/写真/画像URL/ロボット写真/機体写真URL任意
注意
見出し行の文字列が上表のどれとも一致しない場合、見出し行ごと1件のデータとして読み込まれてしまいます(例:「ロボット」「Tel」「チーム名(カナ)」などは非対応の表記のため誤認識します)。見出しは上表の表記をそのままコピーして使ってください。
注意
CSVを読み込むと、現在の選手一覧・配置・対戦結果はすべて置き換わります(元に戻せません)。既に対戦が進んでいる大会では実行前に「保存」しておくことを推奨します。

見出し行を省略し「選手名,所属」の2列だけを並べる簡易形式にも対応しています。また所属列自体を省略し、選手名の列に 選手名(所属名) の形式でまとめて書いた場合も自動的に選手名と所属に分割されます。

参加者リスト(受付チェック)

管理画面左の「👥 参加者リスト」ボタンから、大会当日の出欠・遅刻確認ができます。

トーナメント進行

対戦組み合わせ生成

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

試合の進行

  1. トーナメント表の試合(試合番号)をクリックすると、右側に結果入力欄が出ます
  2. 「1本目」の「開始」で試合時間を計り、終わったら「停止」。「↺」でその本の時間を初期値に戻せます
  3. 本を取った選手のチェックボックスに印を付けます。2本先取の試合で1本目のあとにチェックすると、別画面の時間は2本目の初期値に切り替わります
  4. 「送信」で確定すると、勝者が次の試合へ進み、演出が流れます(キーボードは Shift+R / Shift+B で加算、Shift+S で送信)
ヒント
チェックした本数のまま送信できます。先取本数を2本にしておけば、序盤は1つチェックして送信(1-0勝ち=1本先取)、上位は2つ(2-0/2-1勝ち)と使い分けられます。同点(0-0・1-1)のときだけは送信できません。

時間のベル

カウントダウンのとき、残り30秒で「チーン」、10秒で「チンチーン」、0秒で「チンチンチーン」と鳴り、0秒でタイマーが止まります。「⚙ 表示設定」のタイマー設定でそれぞれON/OFFでき、「🔔 ベルを試聴」で音を確認できます。

棄権・失格の試合

参加者リストで棄権・失格(出禁を含む)にした選手がいる試合を開くと、相手の「不戦勝」(両者なら「勝者なし」)が入力済みになります。内容を確認して「送信」してください。トーナメント表の選手枠には(遅刻)(棄権)などが表示されます(出禁は表示されません)。

複数ブロック・代表戦 NEW

設定でトーナメント数を2以上にすると、A・B…の各ブロックとは別に「代表トーナメント」(または代表リーグ戦)が右側に表示され、各ブロックの優勝者(代表)同士で全体の優勝を争います。

ブロック数代表の決め方
2ブロック代表2名によるトーナメント(決勝1試合のみ)
3ブロック「代表の決め方」設定でトーナメント方式(1ブロックが不戦勝で決勝進出)またはリーグ戦方式(総当たり3試合)を選択
4ブロック以上代表4名によるトーナメント(準決勝2試合+決勝)

代表の3位決定戦

設定の「代表にも3位決定戦を設ける」にチェックを入れると、全体3位を決める試合が追加されます。ブロック数によって対戦カードの意味が異なります。

ヒント
全体の順位表(優勝・準優勝・3位)は代表戦の結果に基づいて自動集計されます。大会成績のCSV出力(大会成績CSV出力)にもこの3位が反映されます。

リーグ戦進行

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

別画面表示(観客用)

管理画面上部の「📺 別画1」〜「📊 別画4」で、観客・配信向けの表示専用画面を別ウィンドウで開けます。開いている別画面のボタンにマウスを乗せると、1/4に縮小した画面が表示されます。

配信専用モード(別のPCで映す)

次のURLを開くだけで、管理画面なしでも別画面が表示され、サーバーから最新の状態を数秒ごとに取り込みます(結果の反映はおおむね4〜9秒)。

…/exec?board&doc=大会名   別画面1
…/exec?lane&doc=大会名    別画面2(横長)
…/exec?sub&doc=大会名     別画面3

同じPCで管理画面が配信している間はそちらを優先します(即時反映)。別画面4(WinMeter)は管理PCで開いてください。試合時間のタイマーや試合途中の本数も表示されます。

画面ごとの設定(「📺 画面設定」)

演出(勝ち上がり・対戦カード)はタップするといつでも省略できます。「🎬 演出設定」の表で、管理画面と閲覧者・別画面それぞれの表示・効果音をON/OFFできます(例:管理画面では演出を出さず、別画面にだけ出す)。

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

応援・推し投票 NEW

閲覧者が別画面(?board等)や閲覧モードで選手枠をタップすると、選手の詳細ポップアップに「☆ 推す」ボタンと一言応援欄が表示されます。

管理画面の「📣 応援パネル」では、推しランキング・応援ランキングに加え、「💬 推しコメント」タブで選手ごとのコメント一覧(新しい順・投稿日時付き)を確認できます。一覧は管理者のみ閲覧でき、投稿者を特定する情報は表示されません。

別画面1〜3の画面設定で「推しコメント」をONにすると、対戦中の2機に寄せられたコメントを別画面にも表示します(複数あれば6秒ごとに切り替え)。コメントは管理画面が約30秒ごとに取得するため、表示までに最大30秒ほどかかり、管理画面を開いている間だけ更新されます。

注意
推し投票・一言応援は端末のブラウザ(localStorage)に投票状態を記録する方式です。ブラウザを変える・データを消去すると再度投票できるようになります。

修理タイマー

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

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に保存されます。

大会成績CSV出力 NEW

GASウェブアプリのURLに ?result&doc=<docKey> を付けてアクセスすると、参加選手・機体の大会成績一覧をCSVファイルとしてダウンロードできます。

https://script.google.com/macros/s/…/exec?result&doc=JimaCup7
注意
doc= の指定を忘れると default という別データが返ってしまいます。必ず対象のトーナメント名(docKey)を指定してください。

CSVには以下の列が出力されます(1試合ごとの細かい情報は含みません)。

列内容
番号/ロボット名/フリガナ/操縦者名/所属/所属フリガナ/タイプ1/タイプ2/一言紹介選手・機体登録の内容そのまま
大会成績大会での最終成績(下表参照)
勝ち試合数/負け試合数/勝ち本数/負け本数大会を通じた通算成績

「大会成績」列の付き方はブロック数によって変わります。

構成成績表記
単独トーナメント(ブロック1つ)優勝・準優勝・3位・4位、それ以外は「ベストN」(Nはその回戦の実際の対戦人数)
複数ブロック(代表トーナメントあり)ブロックをまたいだ全体成績として 優勝・準優勝・3位・ベスト4・ベスト8・ベスト16 の6段階のみ付与。優勝〜3位・ベスト4は代表戦の結果、ベスト8は各ブロック決勝の敗者、ベスト16は各ブロック準決勝の敗者。それより浅い試合の敗者は空欄になります

データ管理

全データはGASに紐付いたGoogleスプレッドシートの「Store」シートに保存されています。 ver211以降のデータは圧縮して保存されるため、シートを直接開いても中身は読めません。内容の確認やバックアップは管理画面の「⬇ バックアップ」(JSON保存)を使ってください。

容量上限について
1大会(1つのdocKey)のデータは、圧縮後で約98万字まで保存できます(ver210以前は圧縮なしで約5万字)。servalは試合数が増えると容量が増加します。管理画面のデータサイズバーで使用率を確認してください。70%を超えたら新規ブック(GASを新たにコピー)への移行を検討してください。

トラブルシュート

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

更新履歴

主な更新のみを記載しています(軽微な修正は省略)。バージョン番号は管理画面左上の見出しに表示されます。

Ver内容
234試合や選手枠を選んだままでも、他の管理画面で入力・取り消しした結果を自動で取り込むよう改善(同じPCで開いた別画面に古い結果が残り続ける問題の対策。文字入力の途中は取り込みを待ちます)
233参加者リストの「出禁」を、管理者だけが読める別の保存先に分けて保存(閲覧者の画面には一切届きません)。以前のデータの出禁は、管理画面で開いたときに自動で移し替えます
232配信するプログラムを圧縮して軽量化(動作・画面は変わりません)
231サーバーの安定性を改善:読み込みを高速な一時保存から返し、保存が混み合ったときは一時退避して後から反映(「ロック取得タイムアウト」で保存・送信が止まる問題の対策)。閲覧画面は更新があったときだけ読み込むよう変更
230演出の表示・効果音を管理画面と閲覧者・別画面で個別に設定できるよう整理。棄権・失格の選手がいる試合に不戦勝を自動入力(送信は手動)。開いている別画面ボタンにマウスを乗せると縮小表示。カウントダウンの時間のベル(30秒・10秒・0秒、各ON/OFF)
229試合時間タイマーのリセットボタン、残り0秒での自動停止と通知。2本先取で1本目のあとに別画面の時間を2本目の初期値へ切り替え。結果の取り消し時に古い残り時間が残る不具合を修正
228演出をタップで省略。別画面のVSの表示ON/OFFと大きさ設定。演出・別画面の文字が途中で別のフォントに切り替わらないよう、フォントを先読み
227試合途中の本数(2本先取の1-0など)を別画面に表示
226別画面に「赤と青を左右入れ替え」設定
225参加者リストの状態をトーナメント表に表示(遅刻・早退・棄権・失格。出禁は非表示)
224配信専用モードの別画面でも推しコメントを表示
223全ての別画面で機体名を2pt小さく、二つ名・所属を1ptずつ大きく
222長い機体名を文字の高さを保ったまま横幅圧縮して表示
221配信専用モード:別画面のURLを開くだけで、管理画面なしでもサーバーから最新を取り込んで表示
220結果入力で、先取本数に達していなくてもチェックした本数のまま送信できるように(1個なら1本先取、2個なら2本先取の扱い。同点のときだけ案内を表示)
218対戦カード演出に「🎰 パチンコ」を追加(群予告→保留変化→リーチ→PUSH→大当り→キリン柄カード)
217セキュリティ強化:管理者パスワードをサーバー側で照合するように変更し、画面のソースからパスワードを削除。パスワード未設定時に誰でも書き込めた問題を修正
216対戦カード演出の「派手/ド派手」をベスト16以上(派手)と3位決定戦・決勝(ド派手)に自動適用できるように(「使用する(上位)/(決勝)」チェック)。派手は段階名(ベスト16/ベスト8/準決勝)をテロップ表示、煽り文言は複数パターンからランダム。二つ名を斜めの称号帯に1文字ずつ刻む表示に
215対戦カード演出のテストプレイに「通常/派手/ド派手」を追加(フラッシュ・激突・紙吹雪・昇格演出など。フラッシュは1秒3回以下に制限)
214データの読込に失敗したとき、空の状態で上書き保存しないよう保存を一時停止(正常に読めたら自動で再開)。保存時の通信エラーも画面に通知
213別画面1〜3に推しコメントの表示(チェックでON、複数は6秒ごとに切り替え)。別画面1・3のフリガナを選手名の直上へ移動
212「推し投票ランキング」を「応援パネル」に改名し、推しコメント一覧タブを追加
211保存データを圧縮して複数セルに分けて保存するように変更し、1大会あたりの容量上限を約20倍に拡大(khk26規模で使用率約1%)。保存に失敗したとき画面に通知するように修正。シードがある状態で選手数・トーナメント数などの全体設定を変えると、シードが自動配置で振り直されることを確認するダイアログを追加
210別画面1の試合切り替え演出を5方式(スライド/フリップ/ズーム/フェード/ライズ)+ランダムから選択可能に。画面設定からテストプレイ可能
209焦らし演出のカード枠サイズを完全固定(所属の有無等で色ラインと二つ名が重なる不具合を解消)。二つ名が移動しながら変化するアニメーションを復元
208焦らし演出の二つ名表示を縮小し「」を削除。対戦カード/勝ち上がりそれぞれに焦らし演出のON/OFFを独立設定(既定:対戦カードON・勝ち上がりOFF)
207別画面1〜4(WinMeter含む)に写真サイズ(小/中/大)の設定を追加
206演出設定に写真サイズ選択・対戦カード/勝ち上がりの表示順入れ替え・選手ポップアップの表示項目設定(番号/所属/フリガナ/タイプ/一言紹介/二つ名/写真)を追加。テストプレイは単体再生に変更
203〜205複数ブロック代表トーナメントの決勝で二つ名・写真(フリガナ/タイプ/一言紹介も)が反映されない不具合を修正。WinMeterの事前勝率をBP(バトルポイント)基準に変更
199〜202別画面1〜4の二つ名・写真表示ON/OFF、演出設定を共通/勝ち上がり/対戦カードに分割し表示項目を個別設定可能に、二つ名を先に見せる「焦らし演出」とテストプレイ機能を追加
191表示倍率UIと実データの乖離バグを修正(選択肢にない0.5倍指定時、UI表示上は100%でも実際は縮小されたままだった問題)。doPostにpageList APIを追加
189配信データ生成時、文字列中の https:// が正規表現によるコメント除去処理で誤って消失する不具合を修正(&#47;&#47; エスケープで対策)
187?result の2ブロック代表3位決定戦、成績表記をさらに1段深い方向に修正
186?result の2ブロック代表3位決定戦、敗者の成績表記を「ベスト4」に修正
184KHK杯型3位決定戦(2ブロック代表・repSize=2)を実装。大会成績CSV出力の3位対応、取説更新
123ブロックリーグ戦(総当たり)に対応
122WinMeter(勝敗メーター)を実装
121ポータルをservalトップページへ移動、GASのHTMLをapp.htmlとして分離、取説(本ページ)を新規作成。ダークモードをデフォルト化しテーマ切り替えボタンを追加
20GAS配信の白画面バグを解決(<script>の分割・iframe内URL不可視への__EXECURL__注入で対策)
補足
上記以外のバージョン(ver1〜19、21〜120、124〜183の大半、185、188、190、192〜198など)は、Googleスプレッドシート経由のGASデプロイが都度のGitコミットを伴わずに行われていたため、個別の変更内容を遡って正確に復元できません。ver199以降は継続的に記録しています。