瀧ヶ平様
早速のご回答ありがとうございます。
JavaScriptについては、下記を参考に作成しました。
https://gist.github.com/fddcddhdd/95cf9a4d5090cf886055
同一のKintoneアプリ内で2種類の連動プルダウンを作成するためカスタマイズしたところで躓いています。
連動プルダウングループ1のプルダウンnameを「big_cat1」、連動プルダウングループ2のプルダウンnameを「big_cat2」として、下記のように値を設定しようとしていますが、実行時にエラーが発生し保存ができません。
event[“record”][BIG_CATEGORY_NAME][“value”] = $(‘select[name=“big_cat1”]’).val();
event[“record”][SMALL_CATEGORY_NAME][“value”] = $(‘select[name=“small_cat1”]’).val();
何らかの原因でプルダウン作成時に設定した「name」を参照する際に参照できない状態になっていると考えているのですが、そもそもプルダウン作成時点での設定の仕方に問題があるのでしょうか?
設定の仕方、参照の仕方についてご教授いただけないでしょうか?
よろしくお願いします。
以下、作成したJavaScriptの全文です。(長文です。すみません。)
(function () {
// 新規レコード追加・編集画面になったら
kintone.events.on([‘app.record.create.show’, ‘app.record.edit.show’, ‘app.record.detail.show’], function (event) {
var appId = kintone.app.getId();
//カテゴリーマスタ・アプリの情報
var MASTER_CATEGORY_APP_NO1;
var MASTER_BIG_CATEGORY_NAME;
var MASTER_SMALL_CATEGORY_NAME;
//プルダウンの値を格納するフィールド名(このJSを読み込んでいるアプリ)
var BIG_CATEGORY_NAME;
var SMALL_CATEGORY_NAME;
var BIG_CATEGORY_NAME2;
var SMALL_CATEGORY_NAME2;
//連動プルダウン設定
switch (appId) {
case 102:
//消費電力
//自販機種類-選択2
MASTER_CATEGORY_APP_NO1 = 103;
MASTER_BIG_CATEGORY_NAME = ‘Char1_USetPoint’;
MASTER_SMALL_CATEGORY_NAME = ‘Char1_SetPoint’;
//プルダウンの値を格納するフィールド名(このJSを読み込んでいるアプリ)
BIG_CATEGORY_NAME = ‘DD_Select1’;
SMALL_CATEGORY_NAME = ‘DD_Select2’;
BIG_CATEGORY_NAME2 = ‘自販機種類’;
SMALL_CATEGORY_NAME2 = ‘選択2’;
get_Record(event, MASTER_CATEGORY_APP_NO1, MASTER_BIG_CATEGORY_NAME, MASTER_SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME, SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME2, SMALL_CATEGORY_NAME2, 1);
//分野1-分野2
MASTER_CATEGORY_APP_NO1 = 89;
MASTER_BIG_CATEGORY_NAME = ‘Char1_USetPoint’;
MASTER_SMALL_CATEGORY_NAME = ‘Char1_SetPoint’;
//プルダウンの値を格納するフィールド名(このJSを読み込んでいるアプリ)
BIG_CATEGORY_NAME = ‘DD_Bunya1’;
SMALL_CATEGORY_NAME = ‘DD_Bunya2’;
BIG_CATEGORY_NAME2 = ‘分野1’;
SMALL_CATEGORY_NAME2 = ‘分野2’;
get_Record(event, MASTER_CATEGORY_APP_NO1, MASTER_BIG_CATEGORY_NAME, MASTER_SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME, SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME2, SMALL_CATEGORY_NAME2, 2);
break;
default:
break;
}
/*
MASTER_CATEGORY_APP_NO1 = 103;
MASTER_BIG_CATEGORY_NAME = ‘Char1_USetPoint’;
MASTER_SMALL_CATEGORY_NAME = ‘Char1_SetPoint’;
//プルダウンの値を格納するフィールド名(このJSを読み込んでいるアプリ)
BIG_CATEGORY_NAME = ‘DD_Select1’;
SMALL_CATEGORY_NAME = ‘DD_Select2’;
BIG_CATEGORY_NAME2 = ‘自販機種類’;
SMALL_CATEGORY_NAME2 = ‘選択2’;
get_Record(event, MASTER_CATEGORY_APP_NO1, MASTER_BIG_CATEGORY_NAME, MASTER_SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME, SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME2, SMALL_CATEGORY_NAME2, 1);
MASTER_CATEGORY_APP_NO1 = 89;
MASTER_BIG_CATEGORY_NAME = ‘Char1_USetPoint’;
MASTER_SMALL_CATEGORY_NAME = ‘Char1_SetPoint’;
//プルダウンの値を格納するフィールド名(このJSを読み込んでいるアプリ)
BIG_CATEGORY_NAME = ‘DD_Bunya1’;
SMALL_CATEGORY_NAME = ‘DD_Bunya2’;
BIG_CATEGORY_NAME2 = ‘分野1’;
SMALL_CATEGORY_NAME2 = ‘分野2’;
get_Record(event, MASTER_CATEGORY_APP_NO1, MASTER_BIG_CATEGORY_NAME, MASTER_SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME, SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME2, SMALL_CATEGORY_NAME2, 2);
*/
return event;
});
// レコード追加・編集保存前イベント
kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function(event) {
var appId = kintone.app.getId();
//連動プルダウン設定
switch (appId) {
case 102:
//消費電力
//自販機種類-選択2
BIG_CATEGORY_NAME = ‘DD_Select1’;
SMALL_CATEGORY_NAME = ‘DD_Select2’;
// プルダウンで選択されている値を、kintoneレコードに格納する
event[“record”][BIG_CATEGORY_NAME][“value”] = $(‘select[name=“big_cat1”]’).val();
//↑ここでエラーが発生している模様
event[“record”][SMALL_CATEGORY_NAME][“value”] = $(‘select[name=“small_cat1”]’).val();
//分野1-分野2
BIG_CATEGORY_NAME = ‘DD_Bunya1’;
SMALL_CATEGORY_NAME = ‘DD_Bunya2’;
// プルダウンで選択されている値を、kintoneレコードに格納する
event[“record”][BIG_CATEGORY_NAME][“value”] = $(‘select[name=“big_cat2”]’).val();
event[“record”][SMALL_CATEGORY_NAME][“value”] = $(‘select[name=“small_cat2”]’).val();
break;
default:
break;
}
return event;
});
})();
/**
* Kintoneと通信を行うクラス()
*/
KintoneRecordManager = (function() {
KintoneRecordManager.prototype.query = ‘’;
KintoneRecordManager.prototype.records = [];
KintoneRecordManager.prototype.appId = null;
KintoneRecordManager.prototype.query = ‘’;
KintoneRecordManager.prototype.limit = 100;
KintoneRecordManager.prototype.offset = 0;
function KintoneRecordManager(MASTER_CATEGORY_APP_NO1) {
this.appId = MASTER_CATEGORY_APP_NO1;
}
// すべてのレコード取得する
KintoneRecordManager.prototype.getRecords = function(callback) {
kintone.api(‘/k/v1/records’, ‘GET’, {
app: this.appId,
// query: this.query + (’ order by 優先度 asc limit ’ + this.limit + ’ offset ’ + this.offset ) //order by,limit, offsetの順番じゃないとダメ!
query: this.query + (’ order by Char1_UCode, Char1_Code asc limit ’ + this.limit + ’ offset ’ + this.offset ) //order by,limit, offsetの順番じゃないとダメ!
}, (function(_this) {
return function(res) {
var len=0;
Array.prototype.push.apply(_this.records, res.records);
len = res.records.length;
_this.offset += len;
if (len < _this.limit) {
_this.ready = true;
if (callback !== null) {
callback(_this.records);
}
} else {
_this.getRecords(callback);
}
};
})(this));
};
return KintoneRecordManager;
})();
function get_Record(event, MASTER_CATEGORY_APP_NO1, MASTER_BIG_CATEGORY_NAME, MASTER_SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME, SMALL_CATEGORY_NAME, BIG_CATEGORY_NAME2, SMALL_CATEGORY_NAME2, type) {
//別kintoneアプリからの取得クラス変数
var getRecordMethod;
// 元々ある大小のテキスト入力フィールドは非表示にする(表示・操作はプルダウンだけにしたい)
kintone.app.record.setFieldShown(BIG_CATEGORY_NAME, false);
kintone.app.record.setFieldShown(SMALL_CATEGORY_NAME, false);
// 既存レコードの場合、選択済のカテゴリーの値を、変数に格納する。
var big_cat_selected1;
var small_cat_selected1;
var big_cat_selected2;
var small_cat_selected2;
// 大小のプルダウンを表示するエリアを生成
var mySpaceField;
switch (type) {
case 1:
var big_cat_selected1 = event[“record”][BIG_CATEGORY_NAME][“value”];
var small_cat_selected1 = event[“record”][SMALL_CATEGORY_NAME][“value”];
mySpaceField = kintone.app.record.getSpaceElement(‘Space1’);
break;
case 2:
var big_cat_selected2 = event[“record”][BIG_CATEGORY_NAME][“value”];
var small_cat_selected2 = event[“record”][SMALL_CATEGORY_NAME][“value”];
mySpaceField = kintone.app.record.getSpaceElement(‘Space2’);
break;
}
// 別アプリである「カテゴリーマスタ」のデータを入れる連想配列を初期化
var hashItems = new Array();
//別kintoneアプリからの取得クラスを生成(リロードや二回目の編集を考慮して初期化)
getRecordMethod = new KintoneRecordManager(MASTER_CATEGORY_APP_NO1);
getRecordMethod.records = [];
getRecordMethod.offset = 0;
//全てのレコードセットをグローバル変数に格納(WebAPI経由なので1秒位かかる)
getRecordMethod.getRecords(function(records) {
// 0件なら何もしない
if (records.length == 0) {
mySpaceField.innerHTML = ‘マスタアプリにレコードがありません’;
return;
}
// マスタアプリのデータを、ローカルの連想配列に格納
switch (type) {
case 1:
for (var i = 0; i < records.length; i++) {
var record = records[i];
hashItems[i] = {
big_cat1: record[MASTER_BIG_CATEGORY_NAME][“value”],
small_cat1: record[MASTER_SMALL_CATEGORY_NAME][“value”]
};
}
hashItems[0] = {
big_cat1: “”,
small_cat1: “”
};
for (var i = 0; i < records.length; i++) {
var record = records[i];
hashItems[i + 1] = {
big_cat1: record[MASTER_BIG_CATEGORY_NAME][“value”],
small_cat1: record[MASTER_SMALL_CATEGORY_NAME][“value”]
};
}
// 新規作成なら(選択済が無ければ)、大・小カテゴリーの最初の選択肢を選択済にしておく
if(big_cat_selected1 == undefined) { big_cat_selected1 = hashItems[0][‘big_cat1’];}
if(small_cat_selected1 == undefined) { small_cat_selected1 = hashItems[0][‘small_cat1’];}
/*
//最初にプルダウンを、全てクリアする
for (var i=mySpaceField.childNodes.length-1; i>=0; i–) {
mySpaceField.removeChild(mySpaceField.childNodes[i]);
}
*/
//大・小カテゴリーのプルダウンを作成
var select1 = document.createElement(“select”); select1.name = “big_cat1”;
var select2 = document.createElement(“select”); select2.name = “small_cat1”;
//プルダウンオブジェクト・選択済項目・親カテゴリ・自カテゴリの定義配列
var arrCategory = new Array(
{“pulldown”:select1, “selected”:big_cat_selected1, “parent”:‘’, “self”:‘big_cat1’},
{“pulldown”:select2, “selected”:small_cat_selected1, “parent”:‘big_cat1’, “self”:‘small_cat1’}
);
break;
case 2:
for (var i = 0; i < records.length; i++) {
var record = records[i];
hashItems[i] = {
big_cat2: record[MASTER_BIG_CATEGORY_NAME][“value”],
small_cat2: record[MASTER_SMALL_CATEGORY_NAME][“value”]
};
}
hashItems[0] = {
big_cat2: “”,
small_cat2: “”
};
for (var i = 0; i < records.length; i++) {
var record = records[i];
hashItems[i + 1] = {
big_cat2: record[MASTER_BIG_CATEGORY_NAME][“value”],
small_cat2: record[MASTER_SMALL_CATEGORY_NAME][“value”]
};
}
// 新規作成なら(選択済が無ければ)、大・小カテゴリーの最初の選択肢を選択済にしておく
if(big_cat_selected2 == undefined) { big_cat_selected2 = hashItems[0][‘big_cat2’];}
if(small_cat_selected2 == undefined) { small_cat_selected2 = hashItems[0][‘small_cat2’];}
/*
//最初にプルダウンを、全てクリアする
for (var i=mySpaceField.childNodes.length-1; i>=0; i–) {
mySpaceField.removeChild(mySpaceField.childNodes[i]);
}
*/
//大・小カテゴリーのプルダウンを作成
var select1 = document.createElement(“select”); select1.name = “big_cat2”;
var select2 = document.createElement(“select”); select2.name = “small_cat2”;
//プルダウンオブジェクト・選択済項目・親カテゴリ・自カテゴリの定義配列
var arrCategory = new Array(
{“pulldown”:select1, “selected”:big_cat_selected2, “parent”:‘’, “self”:‘big_cat2’},
{“pulldown”:select2, “selected”:small_cat_selected2, “parent”:‘big_cat2’, “self”:‘small_cat2’}
);
break;
}
var SetCnt = 0;
//大・小カテゴリーのプルダウン作成
for(iCat=0; iCat <arrCategory.length; iCat++){
//カテゴリーマスタのレコード数だけループ(重複したフィールド値を1個にまとめる)
var first_value = “”;
for ( var i in hashItems ) {
// 親カテゴリーが無い or 親カテゴリーが一致なら
if(arrCategory[iCat][‘parent’] == ‘’ || arrCategory[iCat-1][‘selected’] == hashItems[i][arrCategory[iCat][‘parent’]]){
if(SetCnt == 0){
//先頭に空白を入れる
var option1 = document.createElement(‘option’);
option1.setAttribute(‘value’, ‘’);
arrCategory[iCat][‘pulldown’].appendChild(option1);
SetCnt = 1;
}
// かつ、自カテゴリの新しい値だったら、プルダウンに追加する
if(first_value != hashItems[i][arrCategory[iCat][‘self’]]){
var option = document.createElement(‘option’);
option.setAttribute(‘value’, hashItems[i][arrCategory[iCat][‘self’]]);
//既存レコードの選択済の値だったら、selectedにしておく
if(arrCategory[iCat][‘selected’] == hashItems[i][arrCategory[iCat][‘self’]]){
option.setAttribute(‘selected’, true);
}
option.innerHTML = hashItems[i][arrCategory[iCat][‘self’]];
arrCategory[iCat][‘pulldown’].appendChild(option);
// プルダウンに追加した値を、次の比較対象とする
first_value = hashItems[i][arrCategory[iCat][‘self’]];
}
} else {
//小カテゴリーになったらフラグを戻す
SetCnt = 0;
}
}
}
// 大カテゴリーを変更
select1.onchange = function(event) {
var first_value_small = “”;
// 小カテゴリーをクリア
for (var i=select2.childNodes.length-1; i>=0; i–) {
select2.removeChild(select2.childNodes[i]);
}
//カテゴリーマスタのレコード数だけループ
for ( var i in hashItems ) {
switch (type) {
case 1:
//新しい小カテゴリーが出てきたらプルダウンに追加する
if(this.value == hashItems[i][‘big_cat1’] && first_value_small != hashItems[i][‘small_cat1’]){
var option2 = document.createElement(‘option’);
option2.setAttribute(‘value’, hashItems[i][‘small_cat1’]);
option2.innerHTML = hashItems[i][‘small_cat1’];
select2.appendChild(option2);
first_value_middle = hashItems[0][‘small_cat1’];
}
break;
case 2:
//新しい小カテゴリーが出てきたらプルダウンに追加する
if(this.value == hashItems[i][‘big_cat2’] && first_value_small != hashItems[i][‘small_cat2’]){
var option2 = document.createElement(‘option’);
option2.setAttribute(‘value’, hashItems[i][‘small_cat2’]);
option2.innerHTML = hashItems[i][‘small_cat2’];
select2.appendChild(option2);
first_value_middle = hashItems[0][‘small_cat2’];
}
break;
}
}
}
// 画面に、大・小カテゴリーのプルダウンを表示する
mySpaceField.appendChild(select1);
mySpaceField.appendChild(select2);
// CSSを使って、見た目をkintoneっぽくする
//プルダウンオブジェクト・項目名の定義配列
var arrOutput = new Array(
{“pulldown”:select1, “fieldname”:BIG_CATEGORY_NAME2},
{“pulldown”:select2, “fieldname”:SMALL_CATEGORY_NAME2}
);
//親子関係カテゴリーのプルダウンを画面に表示する
for(iOutput=0; iOutput <arrOutput.length; iOutput++){
// 見た目がkintoeデフォルトと同じようになるように、CSS解析してセット(崩れる可能性あり)
var div_outer = document.createElement(‘div’);
div_outer.className = ‘control-gaia control-single-select-field-gaia’;
var span = document.createElement(‘span’);
span.innerHTML = arrOutput[iOutput][‘fieldname’];
span.className = ‘control-label-text-gaia’;
var div = document.createElement(‘div’);
div.className = ‘control-label-gaia’;
div.appendChild(span);
div_outer.appendChild(div);
arrOutput[iOutput][‘pulldown’].style.width = ‘400px’;
arrOutput[iOutput][‘pulldown’].style.cursor = “pointer”;
div_outer.appendChild(arrOutput[iOutput][‘pulldown’]);
mySpaceField.appendChild(div_outer);
}
});
}