kintoneでサブテーブルの値に応じて背景色を設定したい。

kintoneでサブテーブルの値に応じて背景色を設定したい。
                 
最終更新日から90日以上経過しています。

kintoneにはフィールドのDOM要素を取得するAPIが用意されているが、
サブテーブルには対応していない。(API仕様についてはコチラを参照)

それでも実装するとなると、DOM要素をjQuery等で直接取得して処理をすることになる。
これは今後のkintoneのアップデートで動作しなくなる恐れが有る為、公式では非推奨の方法。

非推奨なので恐らく需要無さそうだけど、興味本位でサブテーブルに背景色を設定してみたら幾つか躓いた点も有ったのでメモ。

サブテーブルの列を非表示にする方法はこちら

完成形

最終的にやりたい事はこんな感じ。

サブテーブル中のフィールド(ここでは背景色(2列目)の値に応じて背景色を設定する。

コード

コードはこんな感じ。
色の設定部分は別途CSSを使って設定した方がお行儀良いのかも。。。

// サブテーブルフィールドのクラス名セレクタ
const TABLE_SELECTOR = '.subtable-5535672';
// 何列目に背景色を設定するか
const COLOR_COLUMN_INDEX = '1';

const setColor = function(colors) {
    // 1000ミリ秒毎にfindTargetElementを実行
    const intervalId = setInterval(findTargetElement, 1000);
    
    // 要素を見つける処理
    function findTargetElement() {
        const rows = $(TABLE_SELECTOR).find('tbody').find('tr');
        if($(rows).length > 0) {
            // 要素が見つかったらインターバル処理を中断
            clearInterval(intervalId);

            // 背景色を設定する行indexを対象に処理
            colors.forEach(function(index) {
                $(rows[index]).find('td:nth-child(' + COLOR_COLUMN_INDEX + ')').css('background-color', 'yellow');
            });
        }
    }
};

kintone.events.on("app.record.detail.show", function(e) {
    const colors = [];
    const rows = e.record['Table'];
    for(var i=0; i<rows['value'].length; i++) {
        // 背景色設定対象の行indexを格納
        if (rows['value'][i]['value']['背景色']['value'] === "設定する") {
            colors.push(i);
        }
    }
    
    // 背景色設定処理
    setColor(colors);
});

 

ポイント1:サブテーブルの要素の取得方法

冒頭に述べた通り、サブテーブル外のフィールドについては、そのフィールドのDOM要素を取得するAPIが用意されているが、サブテーブルのフィールドについては自力で取得するしかない。

今回は、jQueryで

 const rows = $(TABLE_SELECTOR).find('tbody').find('tr');

のように取得した。
尚、プログラム上部で定数で定義している

// サブテーブルフィールドのクラス名セレクタ
const TABLE_SELECTOR = '.subtable-5535672';

このセレクタは、環境によって異なるので書き換える必要がある。

Chromeの場合、F12の開発者ツールでDOM要素が解析されるので、クラス名を覗き見る事ができる。

 

ポイント2:サブテーブルの描画を待機する

レコード詳細表示イベント(kintone.events.on()部分)ではサブテーブルの描画は完了していない為、テーブルの行要素を取得しようとしても結果はnullになる。

そこでQiitaのコチラの記事を参考に、setIntervalを使用した。この部分。

// 1000ミリ秒毎にfindTargetElementを実行
const intervalId = setInterval(findTargetElement, 1000);

 

そして要素が発見できたら、clearIntervalでインターバル処理を中断するとの事。

// 要素が見つかったらインターバル処理を中断
clearInterval(intervalId);

setIntervalclearIntervalは使う機会無かったので、良い機会だった。

おわりに

実はサブテーブル周りの操作はkintone APIの動作対象外という事が多い。
今回の様にDOM操作を行えば実現可能だが、先々の事を考えると現実的ではない。
今後のアップデートに期待、、、かな?

 

kintoneカテゴリの最新記事