Google Apps Script SpreadsheetでGNT同時着弾タイマーを作る

Google Apps Script SpreadsheetでGNT同時着弾タイマーを作る

#1.前書き

GNT(ガンダムネットワーク大戦)はバンダイナムコのブラウザMMOリアルタイム戦略ゲームです
一つの敵の部隊に対して味方の複数の部隊を同時に戦闘させるとかなり有利にゲームを進めることができます
これを相手が受けてくれると戦闘に勝ちやすくなり戦略を有利に進めることができます
ですがこの同時に戦闘させるのはかなり熟練しないとタイミングを合わせることができないのです
これを簡単にできるようにするためのプログラムをスプレッドシートのマクロで作りました

作成にかかった時間は色々調べながら約6時間ほどで出来上がりました
この時にいろいろ気づいた点などがあるので作成方法も含めて様々な人に紹介することにしました


#2.はじめに

スプレッドシートで空白を選択すると空のスプレッドシートができます
![gnt_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/d598987c-15cf-7e84-c480-ed49b166c3aa.png)

#3.デザイン

シートには図形とチェックボックスをそれぞれ一つずつ配置しました

ボタン風の図形は「挿入」→「図形描画」を選択すると図形描画のフォームが現れるのでメニューから図形を選択さらにプルダウンメニューから「図形」→「ベベル（面取り）」を選択するとボタン風の図形ができます
さらにこれに「スタート」の文字を書きます

![gnt_031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/32820aaa-9614-e165-cd3f-6ac3c5edd055.png)
![gnt_032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/a648f347-880c-c319-4603-9bd287063475.png)


できた図形を右クリックすると選択できるようになり大きさの変更やスクリプトを割り当てることができるようになります
なぜ右クリックなのかというと左クリックすると通常は割り当てられてる関数が実行されてしまうので右クリックで選択する癖をつけた方がいいでしょう

![gnt_033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/82dbf6b6-4e9e-bc0c-4910-801d5fe98a4d.png)
![gnt_034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/8ac779e6-4863-c5c3-e5e3-438e33aa6743.png)
![gnt_035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/70d9b39f-afc5-ff36-4205-5152e9e5ea8e.png)


スクリプトの割り当てには「StartTimer」と入力します
この「StartTimer」は後でスクリプトエディタで作成する関数です

セルの結合は複数セルを選択し下図の赤丸のボタンを押すと結合されます
(結合されたセルを元に戻す時もこのボタンを押します)

![gnt_036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/c85d4cd6-d83a-3c93-e1ad-1b323f962c99.png)

チェックボックスを配置します
チェックボックスはメニューの「挿入」→「チェックボックス」で配置できます
ここではシートの「E10」に配置します

グリッド線は消去しておくときれいに見えます
グリッド線を消すにはメニューの「表示」→「グリッド線」で消せます
すると次の画像のようになります

![gnt_037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/2813bb75-1397-6f10-41eb-36131ca8684c.png)


デザインはここまでです

#4.プログラムコード

プログラムコードを書くにはメニューの「ツール」→「スクリプトエディタ」を選択します
するとAps Script画面になりコードを書くことができるようになります
プログラミング言語はJavaScriptです

プログラミングコードは以下


```Javascript:code
function StartTimer(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var cD5=sheet.getRange("D5").getValue();
  var cF5=sheet.getRange("F5").getValue();
  var dMe=new Date(0,0,0,0,Number(cD5),Number(cF5));
  var cD7=sheet.getRange("D7").getValue();
  var cF7=sheet.getRange("F7").getValue();
  var dTarget=new Date(0,0,0,0,Number(cD7),Number(cF7));
  var diffTime=dTarget-dMe;
  if(diffTime<=0){
    Browser.msgBox("設定時間がマイナスです\n先行部隊着弾時間は自部隊所要時間より長くないといけません");
    return;
  }
  sheet.getRange("D14").setValue(Math.floor(diffTime/(60*1000)));
  sheet.getRange("F14").setValue(diffTime%(60*1000)/1000);
  var saveTime=new Date();
  sheet.getRange("E10").uncheck();
  SpreadsheetApp.flush();
  while(sheet.getRange("E10").isChecked()==false){
    var now= new Date();
    var diffNowTime=now-saveTime;
    var diffTime2=diffTime-diffNowTime;
    sheet.getRange("D14").setValue(Math.floor(diffTime2/(60*1000)));
    sheet.getRange("F14").setValue(Math.floor(diffTime2 % (60*1000)/1000));
    if(sheet.getRange("D14").getValue()<0){
      break;
    }
  }
}
```

#5.プログラムコードのアクセスの許可

![gnt_051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/8d5389c8-d79e-ff11-3245-549a19aa04b7.png)
![gnt_052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/81222a45-bbbc-4015-7274-2cf3f97291ce.png)
![gnt_053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/9c1b7f0e-aa55-4158-a24c-33bf73940039.png)
![gnt_054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214567/71ad80a0-6be3-d73c-adea-b0f72bf4322a.png)


赤丸のリンクやボタンを順に押していくと作成したスクリプトが使えるようになります
また、この時にGoogleから確認のメールが届きます(これは無視してかまいません)

#6.プログラムで使ったクラスやメソッドの簡単な説明

Number()　文字列を数値に変換します　他にparseIntがあります　それぞれ数値以外の文字が入ったときの挙動が変わります
Date　Dateクラスです　年月日を0に設定すると時間計算がしやすくなります
Math.floor　小数点切り捨てを行います
uncheck()　チェックボックスのチェックを外します
isChecked()　チェックボックスのチェックの状態を取得します

#7.動かしてみる

自部隊所要時間に8分53秒、先行部隊着弾に10分0秒をセットしてスタートボタンを押してください
出撃時刻がカウントダウンされるはずです
GNTではこの出撃時刻が0分0秒になったときに出撃ボタンを押すと同着攻撃ができます
先行部隊着弾時間はキリの良い時間の方が合わせやすいと思います

また先行部隊着弾時間が自部隊所要時間より短い場合はエラーメッセージが表示されカウントダウンは行われません

カウントダウンを途中で止めたい場合はストップチェックボックスをオンにしてください

※重要
スタートボタンの2度押しはしないでください
もし押してしまった場合はスクリプトのキャンセルのリンクを押すかストップチェックボックスをオンにしてください

#8.GoogleSpreadとExcelの違いの感想

GoogleSpreadはまだ資料も少なく機能もExcelに比べると少ないですね
ただしGoogleSpreadは簡単にWeb上でリンク共有できるのはいいですね

両方使えるならそれぞれの長所を活かして好きな方を選べばよいのではないのでしょうか