Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

4 © 2022 Project Asunote "QQT

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

8 © 2022 Project Asunote 制約等の確認 取ってきてから 選び出す レコードの⼀括取得 (クエリ利⽤) ü クエリで対象分類の複数レコードを取得 【GET①】 ü 取得した複数レコードから1つを選び出 す ü レコードの⼀括取得APIで⼀度に取得できるレコード数︓500 ü 今回は取得対象アプリのレコード数が少ないため、カーソルAPIの 利⽤等は考慮せず。 ü レコード数が多い(多くなることが想定される)アプリの場合は、考 慮する必要がありますね。

Slide 10

Slide 10 text

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 が実⾏されてしまう

Slide 11

Slide 11 text

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した場合、その値でフィールド の値を更新

Slide 12

Slide 12 text

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つを取得する処理

Slide 13

Slide 13 text

12 © 2022 Project Asunote $PEJOH