6-6■コードを単純化してみよう!

第6章 Google Apps Script

さて、ここまでもここからもスプレッドシート(GAS)のことばかりで、エクセル(VBA)の話はしていません。

実際に使われているのがエクセルならVBA教えてくれ!って思うかも知れませんが、VBAの参考資料何てどこにでもあるし、GAS使えるようになっていればだいたい使えるようになります。

なので、一切VBAの説明は無いのでご了承ください。

 

今回は、前回のコードを見直すところからはじめてみましょう。

前回のコード、やっぱり長すぎて読み込みに時間がかかる心配があります。

コードはとにかく単純化することが大事です。

条件をもう少し掘り下げてみましょう。

この表で共通点を探して、そこは共通だから先に処理してしまうことでコードを短くしましょう。

当然目につくのはプレゼント無しの多さですよね。

いい子度が50点以下、もしくは0-3歳にはプレゼント無し。

ここまでを先に処理してしまうことで、16/40は片付きます。

残り24パターンのうち、プレゼントが重複している条件をそろえると、7個が当てはまります。

PC/スマートフォン/2000円/1000円/ゲーム/ゲームソフト/つみき

ですね。

つまり答えとして必要なのは、単独の10個+2個重複の7個+なし1個で、合計18分岐で済むということですね。

40分岐を18分岐で済ませられればかなり、単純化できたといえるのではないでしょうか。

function present2(){

var sex = “女”

var age = 18

var point = 60

switch (true){

//プレゼントなしを抽出

case age < 4 || point < 51 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、プレゼントなし”,sex,age.toFixed(0),point.toFixed(0));

break;

//つみきを抽出

case age > 4 && age < 7 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、つみきをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//PCを抽出

case age > 16 && point > 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、PCをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ゲームソフトを抽出

case sex === “男” && age > 7 && age < 11 && point > 71 && point < 91 || sex === “男” && age > 12 && age < 15 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ゲームソフトをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ゲームを抽出

case sex === “男” && age > 7 && age < 11 && point > 91 || sex === “男” && age > 12 && age < 15 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ゲームをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//スマートフォンを抽出

case sex === “女” && age > 12 && age < 15 && point > 91 || sex === “女” && age > 16 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、スマートフォンをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//1000円を抽出

case sex === “男” && age > 16 && point > 51 && point < 71 || sex === “女” && age > 12 && age < 15 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、現金1000円をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//2000円を抽出

case sex === “男” && age > 16 && point > 71 && point < 91 || sex === “女” && age > 12 && age < 15 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、現金2000円をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ミニカーを抽出

case sex === “男” && age > 4 && age < 7 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ミニカーをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//おもちゃロボを抽出

case sex === “男” && age > 4 && age < 7 && point > 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、おもちゃロボをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ボールを抽出

case sex === “男” && age > 7 && age < 11 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ボールをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//5000円を抽出

case sex === “男” && age > 12 && age < 15 && point > 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、現金5000円をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//人形を抽出

case sex === “女” && age > 4 && age < 7 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、人形をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ドールハウスを抽出

case sex === “女” && age > 4 && age < 7 && point > 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ドールハウスをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//ビーズセットを抽出

case sex === “女” && age > 7 && age < 11 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、ビーズセットをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//コスメセットを抽出

case sex === “女” && age > 7 && age < 11 && point > 71 && point < 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、コスメセットをプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//コスプレ衣装を抽出

case sex === “女” && age > 7 && age < 11 && point > 91 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、コスプレ衣装をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

//3000円を抽出

case sex === “女” && age > 16 && point > 51 && point < 71 :

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、現金3000円をプレゼント”,sex,age.toFixed(0),point.toFixed(0));

break;

}

}

だいぶスッキリしましたね。

でも、まだまだ簡易化しましょう。

そもそもの結論をインデックスに格納しておいて、式で呼び出すことにしましょう。

難しくなりましたが、まずはコードを見てみましょう。

function present3(){

var answer = [[“プレゼントなし”],[“つみきをプレゼント”,”PCをプレゼント”],

               [“ゲームソフトをプレゼント”,”ゲームをプレゼント”,”スマートフォンをプレゼント”],[“現金1000円をプレゼント”,”現金2000円をプレゼント”],[“ミニカーをプレゼント”,”おもちゃロボをプレゼント”,”ボールをプレゼント”,”現金5000円をプレゼント”],[“人形をプレゼント”,”ドールハウスをプレゼント”,”ビーズセットをプレゼント”,”コスメセットをプレゼント”,”コスプレ衣装をプレゼント”,”現金3000円をプレゼント”]];

var sex = “女”

var age = 18

var point = 100

var text

switch (true){

case age < 4 || point < 51 :

text = answer[0][0];

break;

case age > 4 && age < 7 && point > 51 && point < 71 :

text = answer[1][0];

break;

case age > 16 && point > 91 :

text = answer[1][1];

break;

case sex === “男” && age > 7 && age < 11 && point > 71 && point < 91 || sex === “男” && age > 12 && age < 15 && point > 51 && point < 71 :

text = answer[2][0];

break;

case sex === “男” && age > 7 && age < 11 && point > 91 || sex === “男” && age > 12 && age < 15 && point > 71 && point < 91 :

text = answer[2][1];

break;

case sex === “女” && age > 12 && age < 15 && point > 91 || sex === “女” && age > 16 && point > 71 && point < 91 :

text = answer[2][2];

break;

case sex === “男” && age > 16 && point > 51 && point < 71 || sex === “女” && age > 12 && age < 15 && point > 51 && point < 71 :

text = answer[3][0];

break;

case sex === “男” && age > 16 && point > 71 && point < 91 || sex === “女” && age > 12 && age < 15 && point > 71 && point < 91 :

text = answer[3][1];

break;

case sex === “男” && age > 4 && age < 7 && point > 71 && point < 91 :

text = answer[4][0];

break;

case sex === “男” && age > 4 && age < 7 && point > 91 :

text = answer[4][1];

break;

case sex === “男” && age > 7 && age < 11 && point > 51 && point < 71 :

text = answer[4][2];

break;

case sex === “男” && age > 12 && age < 15 && point > 91 :

text = answer[4][3];

break;

case sex === “女” && age > 4 && age < 7 && point > 71 && point < 91 :

text = answer[5][0];

break;

case sex === “女” && age > 4 && age < 7 && point > 91 :

text = answer[5][1];

break;

case sex === “女” && age > 7 && age < 11 && point > 51 && point < 71 :

text = answer[5][2];

break;

case sex === “女” && age > 7 && age < 11 && point > 71 && point < 91 :

text = answer[5][3];

break;

case sex === “女” && age > 7 && age < 11 && point > 91 :

text = answer[5][4];

break;

case sex === “女” && age > 16 && point > 51 && point < 71 :

text = answer[5][5];

break;

}

Logger.log(“性別が%Sで年齢が%S歳でいい子度が%S点の子には、%S”,sex,age.toFixed(0),point.toFixed(0),text);

}

先に答えを格納しておいて、後で呼び出す形にできたことでスッキリしました。

 

ちなみに、ここまでのコードを書くに当たって、私もさらさらっと一発で書いているわけではありません。

うまくいかなかったら、他のやり方を試したり、他人のコードを見てみたり、どこがうまくいってないのか確認するために、バラしてみたりと色々試行錯誤しながら進めて完成させています。

 

説明を省いてはいるものの、色々試せるようにコードを書いているので、違う書き方で同じように動くのか?

こう動かしたい場合はどうするのか?

脱線してみてください。

コメント

タイトルとURLをコピーしました