自社マスコットキャラで遊べる検索ツールを作ってみた

#みんな～！大人気キャラクターの『えにぃ』と『プラ子』が来てくれたよ！
もし初めてこのキャラを知ったあなた。
今話題の**<font color="oRANGE">大人気キャラクター</font>**なのでぜひ覚えて帰ってくださいね。

今回、検索ツールを作成した経緯ですが、今では完全廃止されてしまったMicrosoft2000頃のofficeアシスタント…イルカのカイル君に成り代わる便利なツールを、弊社マスコットキャラクター『**<font color="DeepSkyBlue">えにぃ</font>**』『**<font color="DeepSkyBlue">プラ子</font>**』を起用して作ってみよう！というものがありました。


![パワポ用0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/7d47472d-65a7-f996-f558-233573a7bdfa.jpeg)
※今回用意した絵はすべて私が描きました。

#実装した機能
まず、htmlで検索ツールを作成してから、以下3点の機能を実装することにしました。

- **おみくじ**
作成ツール：HTML
HTMLで作成した検索ツール内の検索ボックス内に単語を入力し検索を実行すると、画面上でおみくじが引けます。

- **ミニゲーム（ジャンケン）**
作成ツール：HTML
HTMLで作成した検索ツール内の検索ボックス内に『**<font color="red">ｼﾞｬﾝｹﾝ</font>**（半角カタカナ）』と入力すると、画面上でジャンケンバトルが始まります。勝敗の結果で『**<font color="ORANGE">えにぃ</font>**』の台詞も変わります。

- **Excelからのマクロ連携**
作成ツール：VBA
作成した検索ツールとExcelをマクロで連系させ、Excel上のメニュータブからワンクリックでツールへ移動できるようにしました。


#まずは検索ツールをつくろう
htmlで検索ツールを作成します。
トップの画面に、検索バー、検索実行ボタン、おみくじ機能をスキップするチェックボックスを作成します。
![qiita1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/da0c3945-661b-6533-6ca9-e070c5eb0dd8.jpeg)
検索後のトップ画面の絵変わり
![qiitaなるほど.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/2077dbd0-e3e4-05d2-c567-61b00d237f6c.jpeg)


```ruby:検索ツール
<body><center>
  
  <br>
  <img id="anypic" src="pic/before.png" width="500px" height="250px" >
  <br>

  <form name="searchForm" method="get" action="http://www.google.co.jp/search" target="_blank">
    <input id="searchword" type="text" name="q" size="31" maxlength="255" value="">
    <input id="execbutton" type="button" name="btng" value="検索">
    <input type="checkbox" id="kujiskip" value="1">おみくじ機能をスキップ
    <input type="hidden" name="hl" value="ja">
  </form>
  
  <script>
  
    /* 再検索時の画像戻し */
    $("#searchword").focus(function() {
      document.getElementById("anypic").src="pic/before.png";
    });
    
    /* 検索ボタン押下時の分岐処理 */
    $("#execbutton").on('click',function() {
      if (document.getElementById("searchword").value == 'ｼﾞｬﾝｹﾝ') {
        document.getElementById("game").style.display="block";
        return false;
      }
      if ($("#kujiskip").prop('checked')) {
        document.getElementById("anypic").src = "pic/after.png" ;
        setTimeout(search,500);
      } else {
        myFunc();
      }
    });
    
</script>
</body><center>
```


#おみくじ機能
検索ボタンをクリックした際に、おみくじ機能が実行されるようにします。
動きとしては、「検索ボタン押下」⇒「おみくじの結果待ちの画像をランダム表示」⇒「おみくじ結果画面表示」⇒「Google検索実行」とします。

**【用意した画像（絵）】**

- おみくじ結果待ちのランダム画像×10枚
- おみくじの結果画像×5枚

![qiita2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/c2c901b1-79c8-81d1-9c5a-9af10d258fea.jpeg)
![qiita3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/5ed122cc-60eb-cc36-d836-bb7ffe387bb9.jpeg)

```ruby:おみくじの画像指定
    /* 画像配列たち */
    numImg = new Array("pic/no/0.png","pic/no/1.png","pic/no/2.png","pic/no/3.png","pic/no/4.png",
                       "pic/no/5.png","pic/no/6.png","pic/no/7.png","pic/no/8.png","pic/no/9.png");
    resultImg = new Array("pic/result/凶.png","pic/result/小吉.png",
                          "pic/result/中吉.png","pic/result/吉.png","pic/result/大吉.png");
    janImg = new Array("pic/janken/j_gu.png","pic/janken/j_ch.png","pic/janken/j_pa.png");
```
```ruby:おみくじ実行から結果待ちまで
   /* おみくじ結果待ちの画像シャッフル */
    function countDown(sec){
      return new Promise((resolve, reject) => {
        setTimeout(()=>{
          imgNo = Math.floor( Math.random() * numImg.length);
          document.getElementById("anypic").src = numImg[imgNo];
          resolve();
        }, sec);
      });
    }

    /* おみくじ実行 */
    function omikuji(){
      return new Promise((resolve, reject) => {
        setTimeout(()=>{
          imgNo = Math.floor( Math.random() * resultImg.length);
          document.getElementById("anypic").src = resultImg[imgNo];
          resolve();
        }, 100);
      });
    }

    /* Formのsubmit */
    function search(){
      return new Promise((resolve, reject) => {
        setTimeout(()=>{
          document.searchForm.submit();
          resolve();
        }, 500);
      });
    }

    /* 画像切り替え */
    function changeImg(){
      return new Promise((resolve, reject) => {
        setTimeout(()=>{
          resolve();
        }, 1000);
      });
    }

    /* 画像シャッフル～おみくじ～検索 */
    async function myFunc(){
      var time = 4000;
      var changeTime = 500;
      var processTime = 0;
      while (time > changeTime + processTime) {
        if (changeTime > 100) {
          changeTime = changeTime - 50;
        }
        await countDown(changeTime);
        processTime = processTime + changeTime;
      }
      
      await omikuji();
      await changeImg();
      await search();
    }
```

![qiitaおみくじ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/4841f63e-a26d-deb9-2a62-aabd97722894.jpeg)
![Qiita用.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/e7f9a70e-46eb-50c3-ab6e-6af8fca42900.gif)


#ミニゲーム機能
特定のワードを入力した際にだけ実行する機能を実装します。<font color="DarkGray">（ゲームの裏技みたいで楽しー！）</FONT>
検索ボックス内に**『<font color="Red">ｼﾞｬﾝｹﾝ</font>**（半角カタカナ）』と入力し検索ボタンをクリックした際にのみジャンケンバトルが始まるようにします。

**【用意した画像（絵）】**

- ジャンケンの手札（グー/チョキ/パー）×3枚
- ジャンケン王の顔×1枚
![qiita4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/72475370-fbea-5da9-f6d9-2405b72d542c.jpeg)

```ruby:ジャンケンの実行と勝負方法
  <div id="game" style="display:none">
    <p><font size="+1">＼ジャンケンするえに！／</font></p>
　　<img src="pic/janken/jyankenou.png" width="175" height="175"><br>
    <img id="jancom" src="pic/janken/j_gu.png" width="100px" height="100px" style="transform: scale(-1, -1);">

    <p id="comCall">最初はグー、ジャンケン…</p>
    <div class="sample1">
        <input type="radio" name="jan" id="jan1" value="0" checked>
            <label for="jan1"><img  src="pic/janken/j_gu.png" width="100px" height="100px"></label>
        <input type="radio" name="jan" id="jan2" value="1">
            <label for="jan2"><img  src="pic/janken/j_ch.png" width="100px" height="100px"></label>
        <input type="radio" name="jan" id="jan3" value="2">
            <label for="jan3"><img  src="pic/janken/j_pa.png" width="100px" height="100px"></label>
    </div>
    <button type="button" value="poi" name="poi" id="poi" onclick="janken()">ぽい</button> 
    <div id="oneMoreButton" style="visibility:hidden;">
        <button type="button" value="oneMore" name="oneMore"  id="oneMore" onclick="oneMore()">もう一回？</button> 
    </div>
  </div>
```

![qiitaｼﾞｬﾝｹﾝﾄｯﾌﾟ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/1e9a03bd-12f0-3331-9532-8f26716c2912.jpeg)

```ruby:勝敗後の動き
    /* じゃんけん勝ち負け判定 */
    function janJudge(janVal, comVal) {
      if (janVal == comVal) {
        return 0;
      }
      if (janVal == '0' && comVal == '1') {
        return 1;
      } else if (janVal == '1' && comVal == '2') {
        return 1;
      } else if (janVal == '2' && comVal == '0') {
        return 1;
      }
      return -1;
    }
    
    /* じゃんけん実行 */
    function janken() {
      var janVal = $('input:radio[name="jan"]:checked').val();
      var janComVal = Math.floor( Math.random() * janImg.length);
      document.getElementById("jancom").src = janImg[janComVal];
      var janResult = janJudge(janVal, janComVal);
      if (janResult == 0) {
        aiko();
      } else if (janResult == 1) {
        win();
      } else {
        lose();
      }
    }
    
    /* あいこ時の表示処理 */
    function aiko() {
      $("#comCall").text("あいこで…");
    }

    /* 勝利時の表示処理 */
    function win() {
      $("#comCall").text("君の勝ち！真のジャンケン王！");
      document.getElementById("oneMoreButton").style.visibility ="visible";
      document.getElementById("poi").disabled = true;
    }
    
    /* 敗北時の表示処理 */
    function lose() {
      $("#comCall").text("なんで敗けたか、明日までに考えてくるえに");
      document.getElementById("oneMoreButton").style.visibility ="visible";
      document.getElementById("poi").disabled = true;
    }
    
    /* 再じゃんけんの表示処理 */
    function oneMore() {
      $("#comCall").text("最初はグー、ジャンケン…");
      document.getElementById("jancom").src = janImg[0];
      document.getElementById("oneMoreButton").style.visibility ="hidden";;
      document.getElementById("poi").disabled = false;
    }
```
![qiitaｼﾞｬﾝｹﾝ結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/bbaca223-f49f-fdcf-eb9f-e4c3f6081438.jpeg)

#Excelとの連携
上記二つの機能を兼ね備えた検索ツールを、Excelからワンクリックで実行できるようにマクロを連携します。
開発タブからVBAでマクロを入力し、メニュータブに新規タブを追加しマクロを登録します。
アクティブセルから、登録したマクロをクリックすることで検索ツール起動と同時にGoogleChromeでの検索を実行させます。

```ruby:ExcelVBA
Sub test()
   Dim sApl
   Dim sWord
   Dim sUrl
   Dim sUrl2
   
'   使用するブラウザ：Chrome
   sApl = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
   

'   検索する言葉のセル
   sWord = ActiveCell.Value


'   おみくじ用のURLの指定
   sUrl = "C:Users\Owner\Desktop\SearchTool\SearchTool.html"
'　 google検索のURLの指定
   sUrl2 = "www.google.co.jp/search?q="
   
    
'   各URLの呼び出し
   Call Shell(sApl & " " & sUrl)
   Call Shell(sApl & " " & sUrl2 & sWord)
   
End Sub
```
![qiitaExcel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605467/d0788504-7f77-c995-a341-61132acc07c0.jpeg)


#終わりに :coffee:
遊べる検索ツールの目的としては、作業の合間にブレイクタイムを取り入れてほしい、というものがあります。
作業に少し疲れたら、「おみくじ」や「ジャンケン」などのミニゲームをして数分間リフレッシュしてみませんか？

そして、弊社マスコットキャラクター『**<font color="ORANGE">えにぃ</font>**』『**<font color="ORANGE">プラ子</font>**』のこともよろしくお願いします！
コラボ案件もお待ちしております！