Upgrade to Pro — share decks privately, control downloads, hide ads and more …

kintoneでランダム取得を作ってみた(imoniCamp 2022-07-27)

kintoneでランダム取得を作ってみた(imoniCamp 2022-07-27)

2022-07-27に開催された、imoniCamp でのLT資料です。
解説記事はこちら
https://note.com/shokun1108/n/n7ef33c6eba22

Shotaro Matsuda

July 27, 2022
Tweet

More Decks by Shotaro Matsuda

Other Decks in Programming

Transcript

  1. 0
    © 2022 Project Asunote
    kintoneで
    ランダム取得を作ってみた
    プロジェクト・アスノート 松⽥ 正太郎
    2022-07-27

    View full-size slide

  2. 1
    © 2022 Project Asunote
    プロジェクト・アスノート代表

    View full-size slide

  3. 2
    © 2022 Project Asunote
    今回の事例の概要
    • 製造業の現場作業における、危険予知セルフチェック
    • チェック項⽬マスタアプリにセルフチェック項⽬を登録してある(作業分類、
    ⾏動分類ごとに複数のチェック項⽬がある)
    • ⽇々のセルフチェックにおいては、
    各分類ごとに、マスタからランダムでピックアップした項⽬について
    セルフチェックを⾏い、結果をミーティングで共有し、安全についてのディス
    カッションを⾏う
    Ø 毎回全項⽬をチェックするのは、⼯数的にも⾮現実的
    Ø いつも同じチェック項⽬だと、マンネリ化してしまうため、ランダムでチェック項⽬を変化
    させたい
    カスタマイズを⾏う理由

    View full-size slide

  4. 3
    © 2022 Project Asunote
    アプリ構成
    チェック項⽬マスタアプリ
    セルフチェックアプリ

    View full-size slide

  5. 4
    © 2022 Project Asunote
    "QQT

    View full-size slide

  6. 5
    © 2022 Project Asunote
    kintoneで他のアプリからデータを取ってくる⽅法
    ルックアップ
    REST API
    ü キーワード検索による絞り込みが活⽤可
    ü ランダム取得の実現のためには、ルックアップ連携
    キーを指定する必要がある
    ü 分類内の連携キーを全件取得し、その中から1つを
    ランダムに選出し、ルックアップフィールドにセッ
    トし、取得処理を⾏う(⼿動)
    ü チェック項⽬マスタから、各分類内のレコードをラ
    ンダムに1件取得する
    ü REST APIによる直接取得であれば、直接フィール
    ドにデータを取得してくることができる。
    ルックアップ取得処理も不要。
    今回はこちらを使うことにした

    View full-size slide

  7. 6
    © 2022 Project Asunote
    ランダム取得実現の⽅針
    狙い撃ちで
    1件取得
    取ってきてから
    選び出す
    ü 狙いのレコードを予め決める必要がある
    ($id指定)
    ü 対象レコードidを全件取得【GET①】
    そこからランダムに1つを選出
    ⽬的レコードを再度取得【GET②】
    基本はレコードの取得(GET)
    GET
    レコードの取得
    (1件)
    レコードの⼀括取得
    (クエリ利⽤)
    ü OFFSETを利⽤
    ü クエリで対象分類のレコード件数を取得
    【GET①】
    OFFSET値をランダムに⽣成
    OFFSET指定で⽬的レコードを1件取得
    【GET②】
    レコードの⼀括取得
    (クエリ利⽤)
    ü クエリで対象分類の複数レコードを取得
    【GET①】
    ü 取得した複数レコードから1つを選び出

    View full-size slide

  8. 7
    © 2022 Project Asunote
    kintoneへの負荷
    狙い撃ちで
    1件取得
    取ってきてから
    選び出す
    ü 狙いのレコードを予め決める必要がある
    ($id指定)
    ü 対象レコードidを全件取得【GET①】
    そこからランダムに1つを選出
    ⽬的レコードを再度取得【GET②】
    GET
    レコードの取得
    (1件)
    レコードの⼀括取得
    (クエリ利⽤)
    ü OFFSETを利⽤
    ü クエリで対象分類のレコード件数を取得
    【GET①】
    OFFSET値をランダムに⽣成
    OFFSET指定で⽬的レコードを1件取得
    【GET②】
    レコードの⼀括取得
    (クエリ利⽤)
    ü クエリで対象分類の複数レコードを取得
    【GET①】
    ü 取得した複数レコードから1つを選び出

    View full-size slide

  9. 8
    © 2022 Project Asunote
    制約等の確認
    取ってきてから
    選び出す
    レコードの⼀括取得
    (クエリ利⽤)
    ü クエリで対象分類の複数レコードを取得
    【GET①】
    ü 取得した複数レコードから1つを選び出

    ü レコードの⼀括取得APIで⼀度に取得できるレコード数︓500
    ü 今回は取得対象アプリのレコード数が少ないため、カーソルAPIの
    利⽤等は考慮せず。
    ü レコード数が多い(多くなることが想定される)アプリの場合は、考
    慮する必要がありますね。

    View full-size slide

  10. 9
    © 2022 Project Asunote
    コーディングの⽅針
    1. 処理を動かすタイミング 新規レコード追加画⾯表⽰後イベント
    2. 対象分類のレコードを⼀括取得
    レコード⼀括取得API(分類をクエリで指定)
    ★REST APIによるレコード取得は⾮同期処理なので、
    kintone Promise または async/await を使う必要がある
    3. 取得した複数レコードから1つを
    選び出す
    レコードの⼀括取得で得られたデータは、複数レコードが
    配列になっている。そこから1つをランダムに取り出すた
    めの処理を関数化(selectRandom関数)
    4. 取得したレコードのデータを
    フィールドに転記
    event オブジェクトに代⼊し return event;
    ※Promiseやasync/awaitを使わないと、レコード取得が
    完了する前に return event が実⾏されてしまう

    View full-size slide

  11. 10
    © 2022 Project Asunote
    1. 処理を動かすタイミング
    kintone.events.on(createEvents, async (event) => {
    });
    コーディングの全体設計図
    2. 対象分類のレコードを⼀括取得
    const resp = await kintone.api(getURL, 'GET', param);
    3. 取得した複数レコードから1つをランダムに選び出す
    const result = selectRandom(resp.records);
    4. 取得したレコードからデータをフィールドに転記
    event.record[ʻチェック項⽬ʼ].value = result[ʻチェック項⽬ʼ].value;
    return event;
    レコード取得は⾮同期処理
    await で後続処理に待ってもらう
    resp.records はレコードの配列
    レコード追加画⾯表⽰後イベントで動作
    ハンドラーの関数で async宣⾔
    配列の要素からランダムに1つを選び
    出す処理を作成
    分類が複数あるので関数化
    eventオブジェクトのフィールドの値を
    書き換えて、eventオブジェクトを
    returnした場合、その値でフィールド
    の値を更新

    View full-size slide

  12. 11
    © 2022 Project Asunote
    selectRandom関数
    Math.random() ︓0以上1未満の乱数を⽣成
    Math.floor() : 切り捨て
    配列要素数がN個の場合、
    求めたい値︓ 0 〜 N-1
    N * 0.xxx (0〜0.9999)
    = 0 〜 N-1.999999
    →切り捨て→ 0〜N-1
    配列の要素からランダムで1つを取得する処理

    View full-size slide

  13. 12
    © 2022 Project Asunote
    $PEJOH

    View full-size slide