kintoneをカスタマイズし、テーブルの空判定を行う

kintone
この記事は約5分で読めます。

こんにちは。中谷です。

今回はkintoneの機能をJavaScriptによってカスタマイズする際に、テーブルの空判定を行うときの実装方法についてです。

実装する機能

今回はレコードの新規作成/編集を行う際、「指定したテーブル内のフィールドにデータを追加し保存するとき、自動的に別のフィールドにデータを追加する」という機能を実装します。

目的としては、入力の手間を減らすのと、自動的に追加した値の内容によって一覧表示の分類をするためです。

イメージとしてはこちらです。

例:「テーブルA」の「文字列A」に値を入力し保存を行うと、
「分類」に “A” という値が自動で追加される。

実装の流れ

今回は、拡張機能の導入方法やコーディングガイドラインなどの紹介は省略します。

完成形のコードはこちらです。

(function () {
    "use strict";

    kintone.events.on([
        "app.record.create.submit",
        "app.record.edit.submit",
    ],
        function (event) {
            const data = event.record;

            const tableA = data.テーブル_A.value;
            const tableB = data.テーブル_B.value;

            const strA = tableA[0].value["文字列_A"].value;
            const strB = tableB[0].value["文字列_B"].value;

            if (strA && strB) {
                data.system.value = "A, B";
            } else if (strA) {
                data.system.value = "A";
            } else if (strB) {
                data.system.value = "B";
            } else if (!strA && !strB) {
                data.system.value = "";
            }

            return event;
        });
})();

内容について上から順に解説します。

・4~8行目
kintone.events.on()に引数を二つ指定します。第一引数では第二引数で指定する処理が実行されるイベント、第二引数では処理の内容を指定します。
今回は第一引数のイベントに、①レコード内容を新規保存するとき、②レコード内容を編集するときの2つを指定します。第二引数のfunction(event)で処理の宣言を行います。9行目以降ではその処理内容について見ていきます。

・9~15行目
ここでは変数を定義し、今回取り扱うレコードのデータを取得します。
何をするにもまずはデータを取得する必要があるので、9行目で一旦レコードの中身を全て取得します。10行目以降ではフィールドコードが「文字列A」と「文字列B」に格納されている値を取得しています。

(kintoneのrecordの型について)
前提として、kintoneで扱うrecordはObjectというデータ型になっています。Object型は、record.フィールドコード.valueというように . (ドット) で数珠つなぎにしてデータを取得します。試しに、イベントに「レコード詳細画面を開いたとき」を追加し、上記の例のデータ構造をconsole.log()で実際に見てみましょう。

レコードのデータ構造

テーブルの空判定を行うときの注意点

標準機能においてテーブルは非常に便利な機能ですが、データ構造がやや複雑になるためJSでカスタマイズを行う際にはその扱いに注意が必要です。詳細についてはcybozu developer networkにて解説されていますが、今回はテーブルの値の空判定を行う際にハマってしまいました。

結論としては、レコード保存時にテーブル内にデータが何も入っていなくても、テーブルには1行分のデータが入っています。さらに言えば、データが1行追加されている状態でも、テーブルの長さは「1」です。
つまり空判定を行うには、その「1」の中身が「ユーザーが入力したデータなのかどうか」を判断する必要があります。

僕は初め、空判定を行う際にrecord.フィールドコード.value.lengthによって、lengthが0かどうかで空判定をしようとしていたため上手くいきませんでした。今回はvalueがあるかどうかによって空判定を行っています。

・16行目以降
あとは条件を指定してあげるだけです。テーブルAとBどちらにも値が存在するときは “A, B” 、どちらか一方のときは “A” or “B”、どちらも空のときは何も入れません。因みに、「何も入れない」という処理を追加しないと、レコード編集時にテーブルの値が入っている状態から削除を行った際、分類の中に文字列が残ってしまいます。
最後に、操作したeventの中身を返り値として処理は終了です。

kintoneのフィールドタイプは様々

今回取り扱ったテーブルに限らず、kintoneのデータ構造はフィールドタイプによって変化するため、それぞれの特徴を把握しながら機能のカスタマイズを行う必要がありそうです(例:チェックボックスに値を入れるときは[“A”]や[“A, B”]とする必要があります)。
実装で困ったときはkintone開発者向けのコミュニティもあるので、そちらを活用してみるのも良いかもしれませんね。

おわりに

弊社ではkintoneを活用することで社内情報をDB化しようと、徐々に移行業務が始まりつつあります。
来期中を目安に移行の完了を目指しており、僕は9月よりアサインされました。

僕の役割として初めはアプリの実装がメインでしたが、最近では他部署が管理している情報から要件の把握や移行のスケジュールを組んだり、引継ぎや運用フォローなど業務範囲が広がってきています。
ソフトウェア開発ほどの規模ではありませんが、要件定義~運用・保守の流れを一通り体験できるのでとても勉強になります。その分覚えなければいけないことは沢山ありますが。。。
直近の課題としては要件定義の進め方とスケジュールの立て方です。

ではまた次回!

タイトルとURLをコピーしました