アメリエフの技術ブログ

Amelieff Staff Blog

misawatの「適度にGASを使う」④

はじめに

「がんばえ〜!!ぷいきゅあ〜!!」

f:id:miwa-t:20200828135925p:plain:w250
ふれっしゅぴーちはーとしゃわー!!

・・・、娘氏がとうとうこんな歳になりました。 どうも。そろそろプリキュアを履修しなければならないmisawatです。

今回は空前絶後の大ヒット、全米が泣いた(と思うことにする)、「misawatの適度にGASを使う」シリーズの最終回です。 前回の記事はこちら。

staffblog.amelieff.jp

最後のテーマは、

複雑な処理、条件分岐あり→機能カテゴリごとにスクリプトファイルを分割し、main関数から実行

要は、Pythonで言うところのスクリプトファイルを分けて書いていくようなことを、GASではどうするかって話です。

概要

今回は以下の条件分岐ありのプログラムを書きます。

  1. 1~10までの乱数を発生させる
  2. 奇数ならツンデレ美少女(妄想)がデレてくれる。
  3. 偶数なら腹筋カウントがランダムで増える


1はメイン関数にあたり、「プログラムの本流」
2は「メッセージを返す機能」
3は「計算して返り値を表に反映させる機能」

こんな役割分担がなされています。 もちろん、この程度のプログラムなら一つのファイルに書きなぐってしまえばよいのですが、ここでは練習も兼ねて機能ごとに独立したファイルに書いてみましょう。

手順

まず、表を作りスクリプトエディタに移動します。

f:id:miwa-t:20200828143045p:plain
初期状態

次にmain関数を書きます。 流れとしては、
「乱数の発生」
「2で割ったときの余りを基準に偶数奇数の判断」
「奇数ならツンデレ関数を呼び出し」
「偶数なら腹筋カウント関数を呼び出し」
「関数終了」
といった流れです。実際に書くと以下の通り。

f:id:miwa-t:20200828160104p:plain
main関数
この段階では 「comeOnTsundere」関数と「hukkinPlus」関数は未実装なのでもちろん動きません。

本来であれば、このmain関数より上の行に、上記2つの関数を実装するのですが、 機能ごとにファイルを分けて記述していきます。

f:id:miwa-t:20200828160208p:plain
新しいスクリプトファイルを作ります

f:id:miwa-t:20200828160344p:plain
tsundere.gsとhukkin.gsが作成されました。
tsundere.gsとhukkin.gsのファイルが作成されました。 ※ この時点で中身はありません。

これの中身を書いていきましょう。 まずはtsundere.gsですが、
関数名は「comeOnTsundere」
処理内容は「事前に登録されたツンデレワードをメッセージボックスに返す」です。
実際書くとこうなります。

f:id:miwa-t:20200828153047p:plain
ツンデレ降臨

main関数と同様の手段で1-3の乱数を発生させ、それに応じたセリフを流すってだけですね。

次にhukkin.gsを実装します。
関数名は「hukkinPlus」
処理内容は「乱数を発生させ、腹筋回数を通告、その値をB1セルに書き込む」です。
実際書くとこうなります。

f:id:miwa-t:20200828160902p:plain
ブンブンの刑に処す

これで実装は完了です。

要点と検討

各ファイルの兼ね合いですが、GASは少し特殊で、 gsファイル名(main.gs, tsundere.gs, hukkin.gs)に関わらず、相互に直接関数が呼び出されます。 要は全ての関数がグローバルな扱いなんですね。

なので、この状態で、main関数をRunすると、 奇数の場合、comeOnTsundereという関数がどこかにないか、gsファイルを跨いで探しに行きます

ここで気になるのが、同じ関数名が、同一gs内、あるいは他のgsファイル内両方にあった場合、どちらが優先されるのかです。
実験してみました。

実験方法はmain関数の上部に以下のようなコードを追加する。

function comeOnTsundere() {
  Logger.log('同一ファイル');
  var word1 = '別にあんたのためじゃないんだからね!!';
  var word2 = 'ちょっと、隣座りなさいよ!!';
  var word3 = 'ちょっとは良いところあるじゃない!!';
  
  var pattern = Math.floor(Math.random()*4)
  
  if(pattern === 1){
    var result = Browser.msgBox(word1);
  }else if(pattern === 2){
    var result = Browser.msgBox(word2);
  }else{
    var result = Browser.msgBox(word3);
  }
}

tsundere.gsのcomeOnTsundereに以下のコードを追加します。

function comeOnTsundere() {
  Logger.log('別ファイル');
  var word1 = '別にあんたのためじゃないんだからね!!';
:
:
:

この状態でmain関数を実行するとどちらのcomeOnTsundereが読み込まれるのかがログからわかります。

結果は・・・


f:id:miwa-t:20200828161144p:plain
ツンデレを頂戴したあとにログを見てみたら・・・

意外や意外、「別ファイルが優先される」みたいです。
要は同一ファイルよりもグローバルな変数(関数)が先に参照されるんですね。 (あれ、こう書くと普通っぽいぞ・・・)

最後に

最初に投稿してからちょうど1年位くらいの時を経て、「misawatの適度にGASを使うシリーズ」感動のフィナーレです! 皆さんありがとうございました!!






f:id:miwa-t:20200828161550p:plain
関数スタート


f:id:miwa-t:20200828161703p:plain
!!!


f:id:miwa-t:20200828161739p:plain
地獄だよっ!!


f:id:miwa-t:20200828161815p:plain
・・・(゜∀。)ワヒャヒャヒャヒャヒャヒャ


f:id:miwa-t:20200828163431p:plain
プルプルプルプル…


(完)