hiroto
(ki)
1
ログインユーザー名:loginUserName ←ログインユーザーの表示名
フィルタをかけたいフィールド名:ユーザー名
var query = ‘ユーザー名 like "’ + loginUserName + ‘"’;
こちらでアプリを開くときフィルタをかけたいのですが、絞り込みが行われません。
kintoneでは、Javaによる一覧表示のフィルタは表示の絞り込みができないのでしょうか。
コンソールのログは、フィルタがかかっている状態ですが、ひょうじされているレコード数は絞られていません。
おそらく、APIによってレコードを取得しただけで表示に関する処理が考慮されていないのではないでしょうか?
ご要望の動作を満たすには大きく分けて2種類あるかなと思っています。
1.カスタマイズビューを使用する方法
参考: カスタマイズビューを作成してみよう - cybozu developer network
今されようとしている方法に近いのかもしれません。
2.URLのクエリーを書き換える方法
参考: URL内のクエリで、表示するレコードの条件を指定する - cybozu developer network
ざっくり書くと下記のようなコード
kintone.events.on(['app.record.index.show'], function (event) {
const queryStr1 = encodeURIComponent('fXXXX="テスト太郎"');
//上記「XXXX」にはフィールドの内部IDが入ります。
//F12開発者ツールでフィールドを確認するとクラス名などに使われていたりします。
const query = "?q=" + queryStr1;
if (!location.href.includes(query)) {
const newUrl = location.href + query;
// 新しいURLに遷移する
document.location.href = newUrl;
}
});
tenso
(てんそ)
3
デフォルトの一覧の設定で、絞り込みを「ユーザー名にログインユーザーを含む」にすれば標準機能でできないでしょうか。
クエリの書き換えでやる場合は以下のコードでできました。
(() => {
'use strict';
// レコード一覧画面が表示されたときのイベント
kintone.events.on(['app.record.index.show'], (event) => {
// 全ての見出しセルを取得
const headerCells = document.querySelectorAll('.recordlist-header-cell-gaia');
let fieldId = '';
headerCells.forEach((cell) => {
// フィールド名要素を取得
const fieldNameElement = cell.querySelector('.recordlist-header-label-gaia');
if (fieldNameElement) {
// フィールド名を取得
const fieldName = fieldNameElement.textContent;
// フィールド名(フィールドコードではない)が「ユーザー名」の場合
if (fieldName === 'ユーザー名') {
// フィールドの内部IDを取得
const classList = cell.className.split(' ');
classList.forEach((className) => {
if (className.startsWith('label-')) {
fieldId = className.split('-')[1];
}
});
}
}
});
// 現在のURLを取得
const currentUrl = window.location.href;
// ログインユーザーの情報を取得
const loginUser = kintone.getLoginUser();
// ログインユーザーIDをエンコードし、クエリストリングを作成
const queryStr1 = encodeURIComponent(`f${fieldId} in (" USER", "${loginUser.id}")`);
const query = '?q=' + queryStr1;
// URLにクエリを追加
const newUrl = currentUrl.split('?')[0] + query;
// 現在のアプリIDを取得
const appId = kintone.app.getId();
// URLがデフォルトと一致するか確認(サブドメインは環境に合わせて変える)
const urlPattern = new RegExp(`^https://サブドメイン\\.cybozu\\.com/k/${appId}/$`);
if (urlPattern.test(currentUrl)) {
// URLがデフォルトなら、内部IDを取得したフィールドをログインユーザーIDで絞り込んだURLにリダイレクト
document.location.href = newUrl;
}
return event;
});
})();
hiroto
(ki)
4
ユーザー選択を使わずに、ログインユーザー名でフィルタをかけたいのですが、うまくいきません。
この表示形式ではログイン情報によるフィルタリングはできないのでしょうか。
tenso
(てんそ)
5
フィールド名が「担当者名」の文字列(1行)フィールドを、ログインユーザーの表示名で絞り込みたいのでしょうか。
もしそうなら、上の私のコードを少し変えればできます。
// フィールド名(フィールドコードではない)が「ユーザー名」の場合
if (fieldName === 'ユーザー名') {
↓
// フィールド名(フィールドコードではない)が「担当者名」の場合
if (fieldName === '担当者名') {
// ログインユーザーIDをエンコードし、クエリストリングを作成
const queryStr1 = encodeURIComponent(`f${fieldId} in (" USER", "${loginUser.id}")`);
↓
// ログインユーザーの表示名をエンコードし、クエリストリングを作成
const queryStr1 = encodeURIComponent(`f${fieldId} in (" USER", "${loginUser.name}")`);
今、ログインユーザー名でフィルターをかけたい方の氏名はどの種類のフィールドで保有していますか?「ユーザー選択」ですか?「文字列(1行)」ですか?
「ユーザー選択」ならば、
てんそさんも言われている「アプリの設定」⇒「一覧」から標準設定で絞込が可能です。
「文字列(1行)」ならば、
JavaScriptを使用した制御が必要になりますが、もしなら「文字列(1行)」を「ユーザー選択」に変更して標準設定で絞込が出来るようにしたほうが後々メンテナンスが楽になると思うのでお勧めです。
system
(system)
Closed
7
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。