kintoneSIGNPOSTアプリにパターン番号ランダム表示機能を追加したい

# はじめに
- ｲｼｲｹﾝﾀﾛｳです。ハケをつくっている会社の兼業情シスでkintoneを触る係をしてます
- kintone認定資格は3つとも取得済です
- その他にITストラテジストやシステム監査技術者などの国家資格をいくつか取得しています
- kintoneのカスタマイズは社内向けのみで、プラグインは作ってません（作れません）
[![main_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/564c7de8-6fc7-61c7-a97f-f8d0a7c9943d.jpeg)](https://www.maru-t.co.jp/painting_brush/)
![associate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/0a8e56b0-b57c-607c-b89b-19e793c78717.png) ![appdesignsp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/12705b5d-9006-2e8c-f9de-56ec7a22b611.png) ![customization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/d318907a-f190-2542-82da-e6ee22e1498b.png)

# やりたいこと
kintoneSIGNPOSTでパターン番号を見てパターン名を当てるゲームのために、パターン番号をランダム表示し、その後答え合わせができるようにしたい

# 元アプリ
- キンコミに投稿した[こちら](https://kincom.cybozu.co.jp/chats/bgbw02whdnh2kxcm)を元にします

# 仕様
- 一覧画面と詳細画面にランダムにパターン番号をアラート表示するボタンを追加します
- アラートを閉じたときに、表示されたパターンの詳細画面を開きます

# 事前準備
- 「PC用のJavaScriptファイル」と「スマートフォン用のJavaScriptファイル」それぞれに以下を「URL指定で追加」してください（バージョンは必要に応じ適宜調整してください）
- パターン番号を表示するために [kintone rest api client](https://developer.cybozu.io/hc/ja/articles/900000767263-kintone-JavaScript-Client-kintone-rest-api-client-)  を使います（https://js.cybozu.com/kintone-rest-api-client/2.0.26/KintoneRestAPIClient.min.js）
- ボタンを配置するために [kintone ui component v1](https://developer.cybozu.io/hc/ja/articles/900005544623-kintone-UI-Component-v1) を使います（https://unpkg.com/kintone-ui-component/umd/kuc.min.js）
- アラート表示は [SweetAlert](https://developer.cybozu.io/hc/ja/articles/204790870-SweetAlert-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-kintone-%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AA%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%88%E3%81%86-) を使います（https://js.cybozu.com/sweetalert/v2.1.2/sweetalert.min.js）
- 次のJSファイルをそれぞれに「アップロードして追加」してください

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/99e32e54-a1c1-d88e-bbd8-513b3d849fa9.png)


# JavaScript記述

``` javascript:pc.js
/*
  ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ 
  ■                     kintoneSIGNPOST PC版
  ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ 
*/
(() => {
  'use strict';
/*
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
  ●         定数宣言、無名即時関数スコープ変数宣言
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
*/
  const client = new KintoneRestAPIClient();
/*
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
  ●                          イベント
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
*/
/*
  ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
    一覧画面表示時
    詳細画面表示時
  ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
*/
  kintone.events.on(['app.record.index.show', 'app.record.detail.show'], async (event) => {
    
    // 全レコードのレコード番号を、レコード番号の昇順で取得
    const paramGet = {
      'app': kintone.app.getId(),
      'fields': ['$id'],
      'query': 'order by $id asc'
    };
    const respGet = await client.record.getAllRecordsWithCursor(paramGet);
    
    // 全レコード数も控えておく
    const totalCount = respGet.length

    // ヘッダースペースを取得する
    let headerSpaceElement;
    if(event.type === 'app.record.index.show'){
      headerSpaceElement = kintone.app.getHeaderMenuSpaceElement();
    }else{
      headerSpaceElement = kintone.app.record.getHeaderMenuSpaceElement();
    }
    
    // ランダム表示ボタンを作る
    const buttonSwalPatternNumber = new Kuc.Button({
      text: 'ランダムにパターン番号を表示する',
      type: 'submit'
    });
    
    // ボタンをスペースに配置する
    headerSpaceElement.appendChild(buttonSwalPatternNumber);

    // クリック時の動作記述
    buttonSwalPatternNumber.addEventListener('click', event => {
      // 全レコード（0からtotalCount-1まで）からランダムに1つのパターン番号を選択する
      const patternNumber = Math.floor(Math.random() * totalCount);
      // STEP番号も伏せてパターン番号のみを表示する
      swal('●-' + ('00' + patternNumber).slice(-2)).then(() => {
        // OKクリック後に該当レコード詳細画面に遷移する
        location.href = location.origin + '/k/' + kintone.app.getId() + '/show?record=' + respGet[patternNumber].$id.value;
      });
    });
    
  });
  
})();

```
``` javascript:sp.js
/*
  ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ 
  ■             kintoneSIGNPOST SmartPhone版
  ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ 
*/
(() => {
  'use strict';
/*
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
  ●         定数宣言、無名即時関数スコープ変数宣言
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
*/
  const client = new KintoneRestAPIClient();
/*
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
  ●                          イベント
  ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
*/
/*
  ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
    一覧画面表示時
    詳細画面表示時
  ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
*/
  kintone.events.on(['mobile.app.record.index.show', 'mobile.app.record.detail.show'], async (event) => {
    
    // 全レコードのレコード番号を、レコード番号の昇順で取得
    const paramGet = {
      'app': kintone.mobile.app.getId(),
      'fields': ['$id'],
      'query': 'order by $id asc'
    };
    const respGet = await client.record.getAllRecordsWithCursor(paramGet);
    
    // 全レコード数も控えておく
    const totalCount = respGet.length

    // ヘッダースペースを取得する
    const headerSpaceElement = kintone.mobile.app.getHeaderSpaceElement();
    
    // ランダム表示ボタンを作る
    const mobileButtonSwalPatternNumber = new Kuc.MobileButton({
      text: 'ランダムにパターン番号を表示する',
      type: 'submit'
    });
    
    // ボタンをスペースに配置する
    headerSpaceElement.appendChild(mobileButtonSwalPatternNumber);

    // クリック時の動作記述
    mobileButtonSwalPatternNumber.addEventListener('click', event => {
      // 全レコード（0からtotalCount-1まで）からランダムに1つのパターン番号を選択する
      const patternNumber = Math.floor(Math.random() * totalCount);
      // STEP番号も伏せてパターン番号のみを表示する
      swal('●-' + ('00' + patternNumber).slice(-2)).then(() => {
        // OKクリック後に該当レコード詳細画面に遷移する
        location.href = location.origin + '/k/m/' + kintone.mobile.app.getId() + '/show?record=' + respGet[patternNumber].$id.value;
      });
    });
    
  });
  
})();

```
# おわりに

- IEでは動きません
- SPのJSを先に書いたのでPC側詳細画面ボタンのmargin無いです気になる方は修正してください
- そして例によって塗装用ローラーもつくってます
[![main_image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/d20f1b7b-355a-1524-829f-71fcd21bdfed.jpeg)](https://www.maru-t.co.jp/painting_roller/)