(GAS) プロレスファンプログラミング

ノンプログラマーが書く、プログラミングブログ。 Google Apps Script を使ったプロレスファン向けツール作成

欠場日と復帰日から欠場期間を計算する

KAIENTAI DOJO の吉田綾斗選手が復帰!
参考リンク : CLUB-K SUPER in TKPガーデンシティ千葉 | KAIENTAI DOJO


復帰を祝して…
何日欠場したかをGoogle スプレッドシートで表示するサンプル。
スクリプトは使わず、スプレッドシートのみで表示する。

欠場日~現在の日数を表示するサンプル

f:id:otani3:20180225203726j:plain
B列に欠場した日を入力する。
C列に復帰した日を入力する。
現在日時を入力するGoogleスプレッドシートのショートカットは Ctrl + :
このショートカットを使うと入力される「2018/02/25」の形式で入力するのがポイント。

D列に欠場日から現在日時までの日数を計算する式を入力する。

TODAY関数の構文

TODAY()

TODAY関数は現在の日付に対応するシリアル値を返す。
日時のシリアル値の差を計算すると、間の期間が日数で表示される。

表示結果

f:id:otani3:20180225204031j:plain
長期欠場の選手が何日間欠場しているかがわかる。

欠場期間を表示するサンプル

f:id:otani3:20180225204543j:plain
B列の欠場日とC列の復帰した日で差を計算する。
ただし、現在も欠場中でC列の復帰した日が空欄の場合は表示をしない。

D列に欠場期間を計算する式を入力する。

IF関数の構文

IF(論理式, TRUE値, FALSE値)

倫理式が成り立つ場合はTRUE値、それ以外はFALSE値を表示する。

=if(C2="","",C2-B2)

今回は C2 = "" つまりC2が空欄の時は""となり、空欄になる。それ以外の場合は C2-B2 つまり欠場期間を表示する。

表示結果

f:id:otani3:20180225205033j:plain
D列を見ると、吉田綾斗選手は238日間欠場していたことがわかる。
その他の選手はC列の復帰した日が空欄なので、D列の欠場期間も空欄になっている。


今回のサンプルに使用させていただいた選手以外にも欠場中の選手はいる。
早くリングに立つ姿を見たいという気持ちと、焦らないで治療してほしいという気持ちの間で揺れる。

税抜価格を計算する関数

税抜価格を計算する

プロレスグッズを通販やメルカリ等で販売する場合は、通販システムやメルカリの管理画面で価格を入力する。ほとんどの通販システムでは税込価格を入力するが、たまに税抜価格を入力する通販システムがある。
税抜価格を入力すると自動で「小数点切り捨て」の税込価格が設定される通販システムを利用する際に、使える関数のサンプル。

プロレスファン向きというより、運営向きか。

サンプル

税込の価格が決まっている場合に、税抜価格を計算する。

//税抜き価格を入力すると、小数点以下を切り捨てした税込み価格が設定される通販システム用の関数
//税込み価格から、通販システムに入力すべき価格を計算する
function 入力する価格(Price_with_TAX){

  var TAX_RATE           //消費税率
  var Price_without_TAX; //税抜き価格

  TAX_RATE = 1.08;

  //税抜き価格を計算。小数点以下を切り捨てる。
  Price_without_TAX = Math.floor( Price_with_TAX / TAX_RATE );

  //上で計算した税抜き価格を通販システムに入力した場合、問題が発生しないか確認
  if ( Math.floor( Price_without_TAX * TAX_RATE ) == Price_with_TAX ){
    //OKならそのままの価格をreturn
    return Price_without_TAX;
  } else if ( Math.floor(( Price_without_TAX + 1 ) * TAX_RATE ) == Price_with_TAX ){
    //+1したものがOKなら、+1した価格をreturn
    return ( Price_without_TAX + 1 );
  }
}

Mathで使って切り捨て、切り上げ

Math.ceil() で切り上げ
Math.floor() で切り捨て
正の値の場合はこれでOK。販売価格は正の値になる。

スプレッドシートの入力例

f:id:otani3:20180220230754j:plain
B列に税込価格。C列に入力する価格を計算する関数を入力。

結果

f:id:otani3:20180220230803j:plain
通販システムに入力すべき価格が表示される。
Tシャツを税込3000円で売るためには、通販システムに税抜の2778円を入力する。
税込107円のところが空欄なのは、この通販システムでは設定できない事を示している。
小数点以下を切り捨てる場合、絶対に税込107円にできない。
99円を設定すると税込106円になり、100円を設定すると税込108円になる。間の107円にはできない。

まとめ

いったん税抜価格にしたものに、税率(1.08)をかけて元に戻るか確認する。OKならその数値を返す。
設定できない価格(107円等)の場合は、何も返さない。
税率が変わった場合、変数TAX_RATEに代入する値を変える以外にも手直しが必要になる。税率が8%の現在は、+1での確認が通用する。

消費税が上がったら、その時にどうするか考えよう。

IWGP US ヘビー級チャンピオンを表示する自作スプレッドシート関数

GASでは自作スプレッドシート関数を簡単に作れる。
今回は、新日本プロレスの 「IWGP US ヘビー級チャンピオン」を表示する関数を作る。
数値を入れると、歴代王者の中から、入力された数値の代のチャンピオンを返す。

サンプル

function IGWP_US_Heavy(num) {
  if (num == 1) {
    return "ケニー・オメガ"
  }else if (num == 2){
    return "ジェイ・ホワイト"
  }
}

num で受け取った変数が1か2だった場合、その数値に対応した歴代チャンピオンの名前をreturnする。

スプレッドシートでの入力例

A列に、上から順に1~5の数値を入力しておく。
B列に、スクリプトエディタで作成した自作関数を入力する。
f:id:otani3:20180219214638j:plain

結果

f:id:otani3:20180219214655j:plain
1と2のB列には王座の名前が表示される。3以降のB列は空欄になっている。

まとめ

自作関数がGoogleスプレッドシートで使えるのは便利。
現時点(2018年2月)で、IWGP US ヘビー級チャンピオンは第2代までしかいないので、コードも短くて済んだ。
1000代以上続くアイアンマンヘビーメタル級王座も同じようにif と else をつなげていけば作れるけど、工夫したほうがいい。

GASで hello world

プロレスファン向けのツール作成ブログ、
VBAだけのつもりだったけど、どうやらGoogle Apps Script (GAS)の方が相性がよさそう。
今回はGASでhello world を書くところまで行ってみよう。

VBAと比較したGASの特徴

  • VBAは、MacだとIE関連のコードが使えないのが不便。GASでの開発はOSを選ばない。WindowsでもMacでもOK。
  • VBAクラウドでは動作しない。GASは完全クラウド志向。
  • VBAMicrosoftアプリケーションを操作しやすい。GASはGoogle製品を操作しやすい。
  • VBAのベースはBASIC。GASのベースはJavaScript
  • VBAの書籍はそれなりに多い。GASの書籍はほとんどない。
  • GASは実行時間6分、メール送信数100件という制約がある。

プロレスファン向けツールを作るなら、GASの方が面白そう。実行時間の壁があるのでVBAと使い分けよう。

GASの使い方

Google Documentのスプレッドシートを開く。
「ツール」から「スクリプトエディタ」を開く

GASでのhello worldのサンプル

function myFunction() {
  Browser.msgBox('hello, world!')  ;
}

実行ボタンをクリックすると「認証が必要です」と表示される。
「許可を確認」をクリック
f:id:otani3:20180214005131j:plain

「このアプリは確認されていません」と出たら、左下の「詳細」をクリック
f:id:otani3:20180214005919j:plain

hello world(安全ではないページ)に移動」と出るのでクリック。(このhello worldはファイル名)
「許可」をクリックして進んでいくと、スプレッドシートhello worldと表示される。

実行結果

f:id:otani3:20180214010340j:plain


GASは言語の更新が非常に速い。
ここで紹介している情報も、すぐに古くなる可能性が高い。