ドロップダウンフィールドの演算式について

いつも大変お世話になります。

https://gist.github.com/fddcddhdd/eee42d9d2f573ba1b17e

を参考に検索窓をつけているのですが、

検索するフィールドタイプをドロップダウンで行いたいのですが、

ドロップダウンの演算子を in へ変更したのですが

クエリの指定が不正です。

というエラーが表示されるため検索ができない状況です。

 

var str_query = '?query='+ FIELD_CODE1 +' like "' + keyword1 + '" '+ AND_OR +' '+ FIELD_CODE2 +' in "' + keyword2 + '"';

if(keyword1 == "" && keyword2 == ""){
str_query = "";
}else if(keyword1 != "" && keyword2 == ""){
str_query = '?query='+ FIELD_CODE1 +' like "' + keyword1 + '"'
}else if(keyword1 == "" && keyword2 != ""){
str_query = '?query='+ FIELD_CODE2 +' in "' + keyword2 + '"'
}

 

「FIELD_CODE2」にレコード番号を指定したときは

like→= に変更し利用できました。

今回は「FIELD_CODE2」がドロップダウンフィールドのため

like→in へ変更しましたがエラーとなり他に

変更する箇所がありますでしょうか。

ご教授のほどよろしくお願い致します。

 

全文

// 設定値
const FIELD_CODE1 = "事業所名";
const FIELD_CODE1_NAME = "事業所名: ";
const AND_OR = "or"; // 必ず小文字
const FIELD_CODE2 = "区分"; //ドロップダウンフィールド
const FIELD_CODE2_NAME = "区分: ";

// 一覧表示のタイミングで実行
(function () {
"use strict";
kintone.events.on("app.record.index.show", function (event) {
// GET引数に格納された直前の検索キーワードを取得して再表示する
var result = {};
var query = window.location.search.substring( 7 ); // URL固定部分(?query=)は無視

// クエリ検索条件の区切り記号 (and/or) で分割
var parameters = query.split( AND_OR );

// フィールドコード名と検索キーワードに分割する
for( var i = 0; i < parameters.length; i++ ){
var element = parameters[i].split( 'like' );
var paramName = decodeURIComponent( element[0] );
var paramValue = decodeURIComponent( element[1] );

// スペースと""をtrimして、文字列だけにしてから、配列に格納
result[paramName.replace(/^\s+|\s+$/g, "")] = paramValue.replace(/^[\s|\"]+|[\s|\"]+$/g, "");
}

// 検索キーワードその1
var search_word1 = document.createElement('input');
//$(search_word1).addClass('kintoneplugin_edit-input-text');
search_word1.onkeypress = function(e) {
if (e.keyCode && e.keyCode == 13) {
keyword_search();
}
}
if(result[FIELD_CODE1] !== undefined){
search_word1.value = result[FIELD_CODE1]; // GET引数に、直前の検索キーワードがあったら格納しておく
}

// 検索キーワードその2
var search_word2 = document.createElement('input');
//$(search_word2).addClass('kintoneplugin_edit-input-text');
search_word2.onkeypress = function(e) {
if (e.keyCode && e.keyCode == 13) {
keyword_search();
}
}
if(result[FIELD_CODE2] !== undefined){
search_word2.value = result[FIELD_CODE2]; // GET引数に、直前の検索キーワードがあったら格納しておく
}

// 検索ボタン
var search_button = document.createElement('button');
//$(search_button).addClass('kintoneplugin-button-normal');
search_button.innerHTML = '🔍';
search_button.onclick = function () {
keyword_search();
};

// キーワード検索の関数
function keyword_search(){
var keyword1 = search_word1.value;
var keyword2 = search_word2.value;
var str_query = '?query='+ FIELD_CODE1 +' like "' + keyword1 + '" '+ AND_OR +' '+ FIELD_CODE2 +' in "' + keyword2 + '"';

if(keyword1 === "" && keyword2 === ""){
str_query = "";
}else if(keyword1 !== "" && keyword2 === ""){
str_query = '?query='+ FIELD_CODE1 +' like "' + keyword1 + '"'
}else if(keyword1 === "" && keyword2 !== ""){
str_query = '?query='+ FIELD_CODE2 +' in "' + keyword2 + '"'
}

// GET変数を使って、検索結果へジャンプ!
document.location = location.origin + location.pathname + str_query
}

// キーワード入力部品を、kintoneヘッダ部分に埋め込む(重複を避けるため、最初に要素をクリアしておく)
var aNode = kintone.app.getHeaderSpaceElement()
for (var i =aNode.childNodes.length-1; i>=0; i--) {
aNode.removeChild(aNode.childNodes[i]);
}
var label = document.createElement('label');
label.appendChild(document.createTextNode(FIELD_CODE1_NAME));
label.appendChild(search_word1);
label.appendChild(document.createTextNode(' '+ AND_OR +' '));
label.appendChild(document.createTextNode(FIELD_CODE2_NAME));
label.appendChild(search_word2);
label.appendChild(document.createTextNode(' '));
label.appendChild(search_button);
kintone.app.getHeaderSpaceElement().appendChild(label);

return event;
});

})();

 

inの右側は複数指定できるように括弧で括る必要があります。
https://developer.cybozu.io/hc/ja/articles/900001057206-kintone-API-%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E5%9F%BA%E6%9C%AC

よって、

FIELD_CODE2 +' in ("' + keyword2 + '")'

のようにしてあげると動くのではないでしょうか。

たねまき様

お世話になります

ご返信ありがとうございます。

ご指摘の通り()でくくることで検索結果を表示することができました。

ただ検索ボタンを押した後にドロップダウン選択肢が保持されないようです。

選択肢を保持させることは可能でしょうか?

よろしくおねがいします。

 

<↓選択時>

<↓検索後>

 

画面遷移後は選択内容を保持できないので、
app.record.index.showのタイミングでURL内のクエリ文字列をURIデコードし、
そこから選択内容に該当する文字列を取得して、
ドロップダウンにセットする処理が必要ですね。

たねまき様

 

お世話になります。

ご連絡ありがとうございます。

ご指摘の箇所。見様見真似で入れてみたのですが・・・

console.log(result)の値がこの様になってます。

  1. 323156&query=エリア: “("南部")”
  2. 323156&query=エリア in (“南部”): “undefined”
  3. Address: “那覇市”
  4. Address like “那覇市”: “undefined”

1番で"南部"となっていないのが原因でしょうか?

replaceの箇所が悪いのかと思いますが、どうして良いのかわからずで

ご教授いただけないでしょうか。

お手数をおかけいたしますがよろしくおねがいします。

 

★の箇所を追記

for( var i = 0; i < parameters.length; i++ ){
var element = parameters[i].split( 'like' );
var paramName = decodeURIComponent( element[0] );
var paramValue = decodeURIComponent( element[1] );

★var element2= parameters[i].split('in')
★var paramName2 = decodeURIComponent( element2[0] );
★var paramValue2 = decodeURIComponent( element2[1] );

// スペースと""をtrimして、文字列だけにしてから、配列に格納
result[paramName.replace(/^\s+|\s+$/g, "")] = paramValue.replace(/^[\s|\"]+|[\s|\"]+$/g, "");
★result[paramName2.replace(/^\s+|\s+$/g, "")] = paramValue2.replace(/^[\s|\"]+|[\s|\"]+$/g, "");

}

 

 

申し訳ございません、説明が足りませんでした。
クエリ文字列の取得はkintone.app.getQueryCondition()を使うと余計な文字列が入らなくて済みます。
https://developer.cybozu.io/hc/ja/articles/201942004-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97

括弧とダブルクォーテーションはreplaceで除外してみてください。

たねまき様

ご連絡ありがとうございます。

var condition = kintone.app.getQueryCondition();

//console.log(condition);//エリア in (“南部”) and Address like “那覇市”

 

扱いがわからず。

前回の★の箇所で()を外して対応できました。

// GET引数に格納された直前の検索キーワードを取得して再表示する
var result = {};
var query = window.location.search.substring( 20 ); // URL固定部分(?query=)は無視 viewIdを含めるので変更
console.log(result)

// クエリ検索条件の区切り記号 (and/or) で分割
var parameters = query.split( AND_OR );

// フィールドコード名と検索キーワードに分割する
for( var i = 0; i < parameters.length; i++ ){
var element = parameters[i].split( 'like' );
var paramName = decodeURIComponent( element[0] );
var paramValue = decodeURIComponent( element[1] );
console.log(paramName)

★var element2= parameters[i].split('in')
★var paramName2 = decodeURIComponent( element2[0] );
★var paramValue2 = decodeURIComponent( element2[1] );


// スペースと""をtrimして、文字列だけにしてから、配列に格納
result[paramName.replace(/^\s+|\s+$/g, "")] = paramValue.replace(/^[\s|\"]+|[\s|\"]+$/g, "");
★result[paramName2.replace(/^\s+|\s+$/g, "")] = paramValue2.replace(/^[\s|\"|\(]+|[\s|\"|\)]+$/g, "");

}