Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

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. 2 © 2022 Project Asunote 今回の事例の概要 • 製造業の現場作業における、危険予知セルフチェック • チェック項⽬マスタアプリにセルフチェック項⽬を登録してある(作業分類、

    ⾏動分類ごとに複数のチェック項⽬がある) • ⽇々のセルフチェックにおいては、 各分類ごとに、マスタからランダムでピックアップした項⽬について セルフチェックを⾏い、結果をミーティングで共有し、安全についてのディス カッションを⾏う Ø 毎回全項⽬をチェックするのは、⼯数的にも⾮現実的 Ø いつも同じチェック項⽬だと、マンネリ化してしまうため、ランダムでチェック項⽬を変化 させたい カスタマイズを⾏う理由
  2. 5 © 2022 Project Asunote kintoneで他のアプリからデータを取ってくる⽅法 ルックアップ REST API ü

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

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

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

    ü クエリで対象分類の複数レコードを取得 【GET①】 ü 取得した複数レコードから1つを選び出 す ü レコードの⼀括取得APIで⼀度に取得できるレコード数︓500 ü 今回は取得対象アプリのレコード数が少ないため、カーソルAPIの 利⽤等は考慮せず。 ü レコード数が多い(多くなることが想定される)アプリの場合は、考 慮する必要がありますね。
  6. 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 が実⾏されてしまう
  7. 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した場合、その値でフィールド の値を更新
  8. 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つを取得する処理