新規投稿
フォローする

カレンダー上での書式(文字色)変更

cybozu.com developer network > サンプル > kintone JavaScript API の「レコード一覧でステータスに応じて書式を設定する」を参考にカスタマイズを行っているのですが、一覧の表示形式がカレンダーの場合に書式設定が行われません。

コードは以下のように実装しているのですが、カレンダーではkintone.app.getFieldElements がとれないようです。
カレンダー形式では、書式設定はできないのでしょうか?


kintone.events.on('app.record.index.show', function (event) {
// レコード一覧の表示時にフィールド値の条件に応じて、文字色、フィールドの背景色を変更する
var elStatus = kintone.app.getFieldElements('title');
for (var i = 0; i < elStatus.length; i++) {
var record = event.records[i];

// タイトルに「test」が含まれていたら、文字色を赤く
if (record['title']['value'].indexOf("test") >= 0) {
elStatus[i].style.color = 'red';
elStatus[i].style.fontWeight = 'bold';
} else {
elStatus[i].style.color = 'black';
elStatus[i].style.fontWeight = 'normal';
}
}
});

1

7件のコメント

Avatar
落合 雄一

Ami Yamada様、はじめまして
cstapの落合です。

残念ながらカレンダービューではkintone.app.getFieldElementsをご利用できないようです。

kintoneが対応するのを待つ方が得策かと思いますが、どうしても必要な場合は下記のように無理やりやることも可能です。
しかし、バージョンアップにより動かなく可能性もありますので、あまりお勧めはできません。

(function() {
"use strict";

// カレンダービュー
kintone.events.on('app.record.index.show', function(event) {
// カレンダービューの表示時にフィールド値の条件に応じて、文字色、フィールドの背景色を変更する
var eles = document.getElementsByClassName("cellitem-value-gaia");
for (var i = 0, il = eles.length; i < il; i++) {
var ele = eles[i];
// eleに「test」が含まれていたら、文字色を赤く
if (ele.textContent.indexOf("test") >= 0) {
ele.style.color = 'red';
ele.style.fontWeight = 'bold';
} else {
ele.style.color = 'black';
ele.style.fontWeight = 'normal';
}
}
});
})();

2
Avatar
Ami Yamada

落合さま
回答ありがとうございます。やはり現状ではフィールド要素はとれないのですね。

カレンダーに表示しているフィールドであれば、教えていただいた方法で実装できました。
ご指摘のように将来的に動かなくなる可能性があること、タイトルで表示させていない(textContentでは取ってこられない)フィールドの値での表示切替ができないことから、kintone 側で対応していただけるのが一番よいのですが、とりあえずの回避策としてこの方法での検討を進めてみます。

0
Avatar
落合 雄一

タイトルで表示させていないフィールドの値での表示切替をすることも、無理やりやればできます。
しかし、この場合のコードはナンセンスというかスマートではないというか・・・かなり汚いコードでしか実現できそうにないのでさらにお勧めできません。

方法としては、上記のコードのfor文内を以下のような流れに変更すれば可能かと思います。

・eleの内容(6:34 PM test)から時間情報を取得
・eleの先祖要素の<td class="calendar-cell-gaia tue-calendar-gaia" id="2014-05-27-calendar-gaia">から日付情報を取得
・日時を作成
・event.recordsから日時(&タイトル)の一致するレコードを取得
・レコード情報が指定の条件に一致すれば、ele.styleを変更

どうしても必要な場合は、参考になさってください。

1
Avatar
斎藤 栄

Ami Tamada様

タイトルで表示させていない(textContentでは取ってこられない)フィールドの値での表示切替ができないことから

具体的なコードは書きづらいのですが、落合さんが書かれたコード内にあるclass
"cellitem-value-gaia"
の5階層上位に、

id="2014-05-28-calendar-gaia"

というような日付で始まるid要素があります。これは日付毎のセルにつけられたidですが、プログラム側で予め条件にあった要素を特定しておき、各日付内の何番目の要素の書式を変更する、というような処理も書けなくはないと思います。

カレンダー形式の場合に app.record.index.show イベントで取れるレコードの形式は、以下のページに記載されています。

https://developers.cybozu.com/ja/kintone-api/apprecindex-showjsapi.html

■eventオブジェクトのプロパティ(PC用)
records
viewType が calendar の場合はキーを日付文字列、値をレコードオブジェクトの配列としたオブジェクト。
例)
{
"2013-12-01": [record1, record2],
"2013-12-20": [record1]
}

上記のレコード情報より、書式を変更したいものの判定を行った上で、日付及びその中の何番目かという情報を変数に持っておき、例えば

document.getElementById('2014-05-28-calendar-gaia');

のような形でid要素を指定し、その5階層下の何番目の要素の書式を変更する、というようなプログラムが書けると思います。

私は書式変更はしたことないのですが、なんらかのデータが存在する日付の日付部分の文字列にリンクを張り、それを押すと、その日のデータだけが絞りこまれた通常の一覧画面に遷移するようなカスタマイズをしたことがあります。

もちろんここに書いた内容も将来的に動かなくなる可能性があるものですので、十分にお気をつけ下さい。

2
Avatar
Ami Yamada

落合さま

たびたびありがとうございます。
JavaScript 初学者なので、とても参考になります。
確かにその方法ならとれそうです、が、文章で読んだだけでも無理矢理感がすごいですね。
どうしても!ということになった時のための手段として、覚えておきたいと思います。

0
Avatar
Ami Yamada

斎藤さま

詳しいご説明をどうもありがとうございます。
cellitem-value-gaia の上に、calendar-cell-gaia があることを確認しました。
書式変更の対象となるかどうかの判定を先に済ませておいて、カレンダー上に表示されている各日の calendar-cell-gaiaを取得 → 書式設定 という流れでいけそうですね。
教えていただいたページも拝見しました。調べていた時に見落としていたようなので、とても助かりました。ありがとうございます。

0
Avatar
Maru

こちらを参考に作成してみたのですが、複数条件時の書き方がわかりませんでした。
カレンダーのタイトルに「AA」を含む場合は赤、「BB」を含む場合は青、「CC」を含む場合は緑、それ以外は黒、としたいです。

(function() {
"use strict";

// カレンダービュー
kintone.events.on('app.record.index.show', function(event) {
// カレンダービューの表示時にフィールド値の条件に応じて、文字色、フィールドの背景色を変更する
var eles = document.getElementsByClassName("cellitem-value-gaia");
for (var i = 0, il = eles.length; i < il; i++) {
var ele = eles[i];
// eleに「〇〇」が含まれていたら、文字色を変更
if (ele.textContent.indexOf("AA") >= 0) {
ele.style.color = 'red';
ele.style.fontWeight = 'bold';
}
if (ele.textContent.indexOf("BB") >= 0) {
ele.style.color = 'blue';
ele.style.fontWeight = 'bold';
}
if (ele.textContent.indexOf("CC") >= 0) {
ele.style.color = 'green';
ele.style.fontWeight = 'bold';
} else {
ele.style.color = 'black';
ele.style.fontWeight = 'normal';
}
}
});
})();

上記だと、一番最後の「CC」は条件が適用されるのですが、「AA」や「BB」は色がelseの場合と判断され、黒の表示になってしまいます。

初心者となり初歩的な質問となりますが、アドバイスいただけないでしょうか。
よろしくお願いします。

0
サインインしてコメントを残してください。