さて、ここまでもここからもスプレッドシート(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);
}
先に答えを格納しておいて、後で呼び出す形にできたことでスッキリしました。
ちなみに、ここまでのコードを書くに当たって、私もさらさらっと一発で書いているわけではありません。
うまくいかなかったら、他のやり方を試したり、他人のコードを見てみたり、どこがうまくいってないのか確認するために、バラしてみたりと色々試行錯誤しながら進めて完成させています。
説明を省いてはいるものの、色々試せるようにコードを書いているので、違う書き方で同じように動くのか?
こう動かしたい場合はどうするのか?
脱線してみてください。
コメント