GoogleAppsScriptでカヌースラローム競技の集計ツールを無料で作って運用する

# カヌースラローム競技のルールと集計

カヌースラローム競技は、日本カヌー連盟のホームページで次のように紹介されています。

> 【引用】https://www.canoe.or.jp/disciplines/slalom/
> 流れの上流からもしくは逆に下流から吊るされたゲートを通過する技術とスタート地点からゴールまでにかかった所要時間の両方を競います。スキー競技と同様に1艇ずつスタートし、ゲートに接触したか、非通過のゲートが有るか否かによる減点ポイントと所要時間が計算され順位が争われます。

![コースの模型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/32925f7b-8c19-1ca9-9e79-fc2fdbf7d31d.png)

コースは、全長250mから400mであり、そのゲート数は、18ゲートから25ゲートです。
スタート審判、ゴール審判、ゲート審判（各ゲート１名）、区間審判（数ゲートに１名）が必要で、それぞれの審判から審判用紙を回収し、集計しなければなりません。

:::note warn
減点ポイントは、1ポイント=1秒に相当します！
- ゲート通過 0ポイント
- ゲートに接触 2ポイント
- 非通過 50ポイント
:::

昔から、審判補助員が審判用紙を回収したり、トランシーバーで情報伝達したり、自衛隊の通信係が手伝ってくれたり、有線を張り巡らしてデータ通信したりと、集計作業は、とっても大変です。

今では、スマホを誰でも持っていますし、河川でもインターネットに接続できるようになってきましたので、Google Apps Scriptを活用すれば、無料で集計ツールを運用できます（通信費は必要）。集計作業も円滑になりそうです。

:::note alert
機能制限
本集計ツールは、審判の入力と記録、記録されたデータの収集までの機能を提供します。
スタートリストの作成や成績表の作成には、別途、集計システムが必要です。
:::

# 準備

まずは、集計ツールの準備を行います。

## 必要なもの

集計ツールは、Google Apps ScriptとExcelで構成されていますので、次のものが必要です。
インターネット環境は運用時にも必要です。

- Googleアカウント
- Microsoft Excel
- Excelがインストールされたパソコン
- スマホ
- Webブラウザ
- インターネット環境

## アプリのコピー

次の手順で、ご自身のお手元に集計ツール一式をコピーします。

1. ソースコードのダウンロード
1. サンプルExcelファイルの生成
1. Google スプレッドシートのコピー
1. Webアプリケーションのデプロイ
1. 不要シートの削除
1. Google Cloud API の有効化
1. ExcelでのウェブアプリURLの入力
1. Excel集計シートの作成
1. Excelからスタートリストのアップロード

### ソースコードのダウンロード

GitHubからソースコードをダウンロードします（もしくは、クローンしてください）。
リンク： [canoe-slalom-judge-scoring-app](https://github.com/athletefirst/canoe-slalom-judge-scoring-app)

1. リンク先を開く（GitHub）
1. `Code`ボタンをクリックし、`Download ZIP`でファイルをダウンロードする
1. ダウンロードしたZIP形式ファイルを展開する（解凍する）

展開したフォルダ内には、集計ツールの開発環境とソースコード一式、及び、サンプルExcelファイルのソースコードが含まれています。

### サンプルExcelファイルの生成

ダウンロードしたソースコードには、Excel形式ファイル自体は含まれていませんので、次の手順でサンプルExcelファイル(`tutrial.xlsm`)を生成します。

1. 展開したフォルダ内の`./canoe-slalom-judge-scoring-app/example/excel-vba`フォルダを開く
1. `create_tutorial_workbook.vbs`ファイルを実行する（ダブルクリック）
1. 一旦、Excelが起動し、同一フォルダ内に`tutrial.xlsm`が生成される

:::note warn
【実行時エラーが発生する場合】
一般的に、`create_tutorial_workbook.vbs`ファイルを実行すると、Excelへのアクセスが拒否され、実行時エラーが発生します。
これを解除（許可）するため、Excelを起動し、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックボックスをオンにしてください。

参考：[プログラムから Office VBA プロジェクトへのアクセスが拒否される](https://support.microsoft.com/ja-jp/topic/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8B%E3%82%89-office-vba-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E6%8B%92%E5%90%A6%E3%81%95%E3%82%8C%E3%82%8B-960d5265-6592-9400-31bc-b2ddfb94b445)
:::

### Google スプレッドシートのコピー

本集計ツールでは、スマホから審判の記録を入力します。その機能は、GoogleスプレッドシートとApps Scriptとで実装されていますので、それをご自身のGoogleアカウントのGoogleドライブへコピーします。

1. WebブラウザでGoogleアカウントにログインする
1. 共有されているデモファイルを開く（デモファイル：[demo-canoe-slalom-judge-scoring](https://docs.google.com/spreadsheets/d/11MtofFlIIsIWjSPZiJrqmODz_ABNkvOysn2yKa6X9eI/edit?usp=sharing)）
1. メニューから`ファイル`-`コピーを作成`を選択する
1. 適当な`名前`と`フォルダ`を入力し、`コピーを作成`ボタンをクリックする
1. Google Apps Scriptも付随して、ご自身のGoogleドライブへコピーされる

**※ `名前`や`フォルダ`は、後から自由に変更できます。**

:::note info
ソースコードからのGoogleスプレッドシート構築
ダウンロードしたソースコードには、このGoogleスプレッドシートのApps Scriptのソースコードと開発環境も含まれています。改良したい場合は、ぜひ、開発環境を整え、ご自身で構築してみてください。
:::

### Webアプリケーションのデプロイ

コピーしたGoogle スプレッドシートをWebアプリケーションとして機能させるために、`デプロイ`が必要です。

1. コピーしたGoogleスプレッドシートを開く
1. メニューの`拡張機能`-`Apps Script`を選択する
1. `Apps Script`が開くので、`デプロイ`ボタンをクリックし、`新しいデプロイ`を選択する
1. 表示されたダイアログで、`デプロイ`ボタンをクリックし、`アクセスを承認`ボタンをクリックする
1. サインインを求められるので、ご自身のGoogleアカウントを選択する
1. 警告画面`Google hasn’t verified this app`が表示されるので、`Advanced`をクリックし、`Go to canoe-slalom-judge-scoring (unsafe)`をクリックする
1. アクセス権限を求められるので、`Allow`ボタンをクリックし、許可する
1. デプロイが完了すると`デプロイを更新しました。`と表示されるので、`ウェブアプリ`のURLをコピーする
1. 'ウェブアプリ'のURLをGoogleスプレッドシートの「URL」シートのG1セルに貼り付けておく（`base url`）

これで、ご自身のGoogleドライブ内のGoogleスプレッドシートがWebアプリケーションとして機能するようになりました。「URL」シートの各リンクアドレスにアクセスすると、時間やペナルティの入力ができます。

:::note info
URL の再確認方法
`デプロイ`で表示された `Web App`のURLは、次の手順で再表示することができます。
1. Googleスプレッドシートで、メニューの`拡張機能`-`Apps Script`を選択する
1. `Apps Script`が開くので、`デプロイ`ボタンをクリックし、`デプロイを管理`を選択する
1. `ウェブアプリ`のURLが表示される（コピーも可能）
:::

### 不要シートの削除

コピーしたGoogleスプレッドシートには、デモ用に記録されたデータ（シート）もコピーされています。
「URL」シートだけを残して、その他のシートは削除してください。

### Google Cloud API の有効化

本集計ツールでは、ExcelファイルからGoogleスプレッドシートにデータをアップロードしたりダウンロードしたりします。
そのため、[Google Cloud プロジェクトでの API の有効化](https://cloud.google.com/endpoints/docs/openapi/enable-api?hl=ja)が必要です。

[APIの有効化](https://cloud.google.com/endpoints/docs/openapi/enable-api?hl=ja#enabling_an_api) を参照し、有効化してください。
→ APIの有効化： https://cloud.google.com/endpoints/docs/openapi/enable-api?hl=ja#enabling_an_api

### ExcelでのウェブアプリURLの入力

サンプルExcelファイル(`tutrial.xlsm`)から、Googleスプレッドシートのウェブアプリにアクセスするために`ウェブアプリ`のURLの設定が必要です。次の手順で入力してください。

1. サンプルExcelファイル(`tutrial.xlsm`)を開く
1. メニューの`表示`-`マクロの表示`を選択する
1. マクロから`ResetWebAppUrl`を選択し、`実行`ボタンでマクロを実行する
1. 表示されたダイアログボックスに、`ウェブアプリ`のURLを入力する（コピー＆ペースト）

入力したURLは、`tutrial.xlsm.utf16le.json`ファイルに保存されます。URLを間違えた場合や変更した場合は、再度、本手順を行います。

### Excel集計シートの作成

Excel集計シートは、「スタートリスト」と「記録データ」の２つのシートで構成します。
次の手順でレースごとに、２つのExcel集計シートを作成します。

1. サンプルExcelファイル(`tutrial.xlsm`)を開く
1. メニューの`表示`-`マクロの表示`を選択する
1. マクロから`NewHeatSheet`を選択し、`実行`ボタンでマクロを実行する
1. 表示されたダイアログボックスに、レース名称を入力し、OKボタンをクリックする
1. スタートリストである「RUNNERS(xxxx)」シートと記録データである「RECORDS(xxxx)」シートとが作成される

:::note info
レース名称
コピーしたデモ用のGoogleスプレッドシートに合わせて、次の４つ分のレース名称のExcel集計シートを作成すると良いでしょう。
1. final
1. semi-final
1. heat-2nd
1. heat-1st
:::

### Excelからスタートリストのアップロード

Googleスプレッドシートにもレース名称に対応したシートを作成するため、サンプルExcelファイル(`tutrial.xlsm`)で、空のスタートリストをアップロードします。

1. サンプルExcelファイル(`tutrial.xlsm`)を開く
1. スタートリストである「RUNNERS(xxxx)」シートを選択し、表示する
1. メニューの`表示`-`マクロの表示`を選択する
1. マクロから`AppSync`を選択し、`実行`ボタンでマクロを実行する
1. 確認ダイアログボックスで、OKボタンをクリックする
1. Googleスプレッドシートにシートが追加されていることを確認する

この操作をすべてのスタートリストで行ってください。

:::note warn
アップロードできない場合
- ウェブアプリURLを再度入力しなおしてください。
- スタートリストである「RUNNERS(xxxx)」シートが選択された状態でマクロを実行してください
:::

# データ集計

次の手順で、一連のデータ集計を行います。

1. スタートリストの入力とアップロード
1. 審判入力区間の定義とURLの配布
1. 審判入力
1. 記録データのダウンロード

## スタートリストの入力とアップロード

スタートリストである「RUNNERS(xxxx)」シートをレース毎に入力します。
`Bib`には、ゼッケン番号を、`Tag`には、種目を入力し、`Bib`と`Tag`とで一意になるようにします（推奨）。
`#`列は、アップロード時に`Bib`と`Tag`とが結合された文字列が自動的に入力されます。この`#`列を検索キーにVLookUp関数を使って、別シートに印刷用のスタートリストや成績表をデータ参照で作成することを想定しています。

`Bib`は２行目から順番に詰めて入力してください。`Loocked`列は、審判入力を読み取り専用にするかどうかを設定できます。`Locked`列に何か値を入力すると審判入力で読み取り専用になり、アプリから編集できなくなります。

`Name`、`Team`、`Remarks`は、任意項目です。ご自由に使ってください。

スタートリストが入力出来たら、次の手順で、Googleスプレッドシートにアップロードしてください。

1. スタートリストである「RUNNERS(xxxx)」シートを選択し、表示する
1. メニューの`表示`-`マクロの表示`を選択する
1. マクロから`AppSync`を選択し、`実行`ボタンでマクロを実行する
1. 確認ダイアログボックスで、OKボタンをクリックする
1. Googleスプレッドシートにデータがアップロードされていることを確認する

アップロードは、何度でも繰り返すことができます。ただし、アプロード済みのデータを削除することはできませんので、削除したい場合は、Googleスプレッドシートで直接、データを削除してください。

## 審判入力区間の定義とURLの配布

スタートリストの入力と同時に、審判入力の区間を定義します。

- スタートタイム入力
- ゲート審判入力（区間審判）
- ゴールタイム入力

尚、ゴールタイムとして、所要時間を入力する場合は、スタートタイム入力は、不要です（DNSの入力のみ）。

この区間が決まれば、Googleスプレッドシートの「URL」シートに定義を入力してください（既存の入力例を参考に）。
各審判用のURLが計算表示されますので、これを入力担当者に配布し、スマホから入力します。URLは、２次元バーコード（QR）などにして印刷すると伝えやすいでしょう。

### 審判入力

各審判の入力担当者は、配布されたURLにアクセスし、データを入力します。

### 記録データのダウンロード

入力された記録データを記録データである「RECORDS(xxxx)」シートに、都度、ダウンロードします。

1. 記録データである「RECORDS(xxxx)」シートを選択し、表示する
1. メニューの`表示`-`マクロの表示`を選択する
1. マクロから`AppSync`を選択し、`実行`ボタンでマクロを実行する
1. 確認ダイアログボックスで、OKボタンをクリックする
1. 選択シートに記録データがダウンロードされていることを確認する

これを競技中、繰り返し行います。
ダウンロードした記録データを元にVLookUp関数などを駆使すれば、別シートで、種目別の成績表を作成することができます。

# おわりに

無料で利用できるGoogleスプレッドシートを使って、カヌースラローム競技の集計ツールを作成することができました。
カヌースラロームコースにおいてもスマホがあれば、インターネットに誰でも接続できるようになり、これらの技術を活用して、大会運営がより円滑になれば、幸いです。