Kintone一覧画面に検索窓を追加する
Kintoneの一覧画面に特定のフィールドに対しての入力欄を作成し対象レコードを抽出する。ビル情報として名称や住所などのレコードが管理されているアプリから条件にあったレコードを抽出する。
<前提条件>
・検索窓は「ビル名」用「ビルコード」用として2つ設置
・2つの検索窓のORとAND条件の設定ができる
・KIntone制約で「ビル名」は1文字では検索出来ない(最低でも2文字以上)
・英数字検索が単語単位(cyで、cybozeがヒットしない!)
// 検索対象のフィールド設定
const FIELD_CODE1 = "ビル名"; // 部分一致検索をするフィールド
const FIELD_CODE1_NAME = "ビル名(2文字以上)"; // 検索欄に表示するラベル名
const FIELD_CODE2 = "ビルコード"; // 検索する対象のフィールド(完全一致)
const FIELD_CODE2_NAME = "ビルコード"; // 検索欄に表示するラベル名
// 検索条件(AND または OR)
// 変更すると検索ロジックが動作しなくなるため、必ず小文字の "and" または "or" を指定
const AND_OR = "and";
(function () {
"use strict";
// 一覧画面が表示されたときに実行(Kintoneのイベントをトリガー)
kintone.events.on("app.record.index.show", function (event) {
const result = {};
// URLのクエリパラメータを取得(検索キーワードを復元するため)
const urlParams = new URLSearchParams(window.location.search);
const query = urlParams.get("query");
if (query) {
// クエリ文字列を "and" または "or" で分割し、検索対象のフィールドごとに分ける
query.split(new RegExp(`\\s*${AND_OR}\\s*`)).forEach((param) => {
// "like" を基準にフィールド名と検索キーワードを分離し、デコード
const [field, value] = param.split("like").map((s) => decodeURIComponent(s.trim().replace(/^"|"$/g, "")));
if (field && value) {
result[field] = value; // 抽出した検索キーワードをオブジェクトに格納
}
});
}
// 検索入力フィールドの作成
function createSearchInput(value = "") {
const input = document.createElement("input");
input.value = value; // 過去の検索ワードをセット(なければ空)
input.addEventListener("keypress", function (e) {
if (e.key === "Enter") {
keyword_search(); // Enterキーで検索を実行
}
});
return input;
}
const search_word1 = createSearchInput(result[FIELD_CODE1]); // ビル名の検索欄
const search_word2 = createSearchInput(result[FIELD_CODE2]); // ビルコードの検索欄
// 検索ボタンの作成
const search_button = document.createElement("button");
search_button.textContent = "search"; // ボタンの表示名
search_button.addEventListener("click", keyword_search); // クリック時に検索実行
// 検索実行関数(検索ボタンまたはEnterキー押下で実行)
function keyword_search() {
const keyword1 = search_word1.value.trim(); // ビル名の入力値
const keyword2 = search_word2.value.trim(); // ビルコードの入力値
let str_query = "";
if (keyword1 && keyword2) {
// 両方の条件を満たすレコードを検索
str_query = `?query=(${FIELD_CODE1} like "${keyword1}") ${AND_OR} (${FIELD_CODE2} like "${keyword2}" or ${FIELD_CODE2} like "${keyword2}F")`;
} else if (keyword1) {
// ビル名のみで検索
str_query = `?query=${FIELD_CODE1} like "${keyword1}"`;
} else if (keyword2) {
// ビルコードのみで検索("F" を含むパターンも検索対象)
str_query = `?query=(${FIELD_CODE2} like "${keyword2}" or ${FIELD_CODE2} like "${keyword2}F")`;
}
location.href = location.origin + location.pathname + str_query; // 検索結果のページへ遷移
}
// 検索フォームを Kintone のヘッダーエリアに追加
const headerSpace = kintone.app.getHeaderMenuSpaceElement();
headerSpace.innerHTML = ""; // 既存の要素をクリア(重複防止)
// 検索バーのラベルと要素を組み立てる
const label = document.createElement("label");
label.appendChild(document.createTextNode(FIELD_CODE1_NAME + " ")); // ラベル(ビル名)
label.appendChild(search_word1); // 検索入力欄(ビル名)
label.appendChild(document.createTextNode(` ${AND_OR} `)); // AND/OR 条件の表示
label.appendChild(document.createTextNode(FIELD_CODE2_NAME + " ")); // ラベル(ビルコード)
label.appendChild(search_word2); // 検索入力欄(ビルコード)
label.appendChild(document.createTextNode(" ")); // スペース調整
label.appendChild(search_button); // 検索ボタン
// Kintoneのヘッダー部分に検索フォームを追加
headerSpace.appendChild(label);
return event;
});
})();
NOTICES
- 記事内容は実装させたものがほとんどですが自己責任で参考にしてください。