新規投稿
フォローする

テーブル内のチェックボックスの値で別のフィールドの入力制御

お世話になっております。6月からkintone管理者としてアプリを作成しているのですが、ここに来て高度なことをしたいと考えています。

テーブルの中にあるETCにチェックを入れると、入口ICと出口ICが使用可能になるようにしたいのです。

https://developer.cybozu.io/hc/ja/community/posts/360042672011

https://developer.cybozu.io/hc/ja/community/posts/360045255552

などのページを参考にロジックを書いてみましたがうまく動作しません。

テーブル内のチェックボックスの値をうまく取得できていないようなのです。

どうかお力添えをお願いします。

0

5件のコメント

Avatar
TK

こんばんは。

実際に書いたコードとか、エラーが出てるならエラー内容を貼ったほうが原因が見つかりやすいです!

event.changes.rowで変更のあった行が拾えます。

https://developer.cybozu.io/hc/ja/articles/201941984-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%BF%BD%E5%8A%A0%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88#step11

そこのチェックボックスのlengthで判断するのがいいと思いました!

(function() {
"use strict";
// レコード新規追加イベントのみ
kintone.events.on("app.record.create.change.ETC利用", function(event) {
var row = event.changes.row.value;
if(row.ETC利用.value.length > 0) {
row.入口IC.disabled = false;
row.出口IC.disabled = false;
}else{
row.入口IC.disabled = true;
row.出口IC.disabled = true;
}
return event;
});

kintone.events.on(["app.record.create.show", "app.record.create.change.Table"], function(event) {
var record = event.record;
record.Table.value.forEach(function(val) {
if(val.value.ETC利用.value.length === 0) {
val.value.入口IC.disabled = true;
val.value.出口IC.disabled = true;
}
});

return event;
});
})();

フィールドコードは適時変えてください!

1
Avatar
田川俊弥

TKさん、ありがとうございます。

思い通りの動作になりました。

アドバイスもありがとうございます。今後の手助けとなります。

ありがとうございます。

0
Avatar
進藤 真樹

お世話になっております。現在kintoneを試用中で、自社で実現したいことが可能か否か試させていただいているところです。

やりたいことの一つがまさにこの「テーブル内のチェックボックスの値で別のフィールドの入力制御」でしたので、この情報に辿り着きました。

当方、1レコード中にこの事例のようなテーブルを複数持ち、各テーブルにチェックボックスを設置してテーブルごとの入力制御をしたいと考えております。

イメージとしては工程管理で、各工程が完了したらその工程のデータを編集不可にしたい、というニーズです。

その場合のスクリプトの書き方ですが、テーブルが10個あるとしたら、4行目からラスト2行目までを繰り返し10回記述する必要がありますでしょうか?

そうなると手間が大きくメンテナンス性も劣るので、効率的な記述方法があるといいなと思った次第です。

JavaScript初心者につき、かなり低レベルな質問でしたら恐縮ですが、アドバイスいただけるとありがたいです。

よろしくお願いいたします。

0
Avatar
TK

おはようございます。

 

>その場合のスクリプトの書き方ですが、テーブルが10個あるとしたら、4行目からラスト2行目までを繰り返し10回記述する必要がありますでしょうか?

 

そうですね、ある程度の関数化はしますがテーブルの数だけ記述したほうが可読性が上がるかな、と考えております。

ただ、メンテナンスなどで対応する箇所が増えるのは確かです。

 

>当方、1レコード中にこの事例のようなテーブルを複数持ち、各テーブルにチェックボックスを設置してテーブルごとの入力制御をしたいと考えております。

>そうなると手間が大きくメンテナンス性も劣るので、効率的な記述方法があるといいなと思った次第です。

 

下記のコードはTableとチェックボックスのフィールドコードのみ記述を変えれば動くロジックとなっておりますが、

ネストが深くなってぱっと見て何しているか分かりにくいですし、機能追加などもしづらいかなと思ってます。

どちらの方法でコードを書くかは正直難しいところかなと思います。

(function () {

"use strict";

const targetEvents = function (fieldCode) {

let arr = [];

fieldCode.map(function (cur) {

arr.push("app.record.create.change." + cur);

arr.push("app.record.edit.change." + cur);

});

return arr;

};

/***************************************************************************/

// チェックボックスのフィールドコードを追加してください

const events = ["チェック_1", "チェック_2", "チェック_3"];

/***************************************************************************/

kintone.events.on(targetEvents(events), function (event) {

const row = event.changes.row.value;

const str = String(event.type).match(/(?<=change.)(.*)/)[0];

for (let item in row) {

row[item].disabled = false;

if (row[str].value.length > 0) {

if (item !== str) {

row[item].disabled = true;

}

}

}

return event;

});

kintone.events.on("app.record.edit.show", function (event) {

const record = event.record;

/***************************************************************************/

// 対象のサブテーブルのフィールドコードと、チェックボックスを追加してください

const targetTable = {

"Table_1": {

value: "チェック_1"

},

"Table_2": {

value: "チェック_2"

},

"Table_3": {

value: "チェック_3"

}

};

/***************************************************************************/

const tables = Object.keys(targetTable).map(function (cur) {

return {

[cur]: record[cur].value

};

});

for (let item in tables) {

Object.values(tables[item]).forEach(function (val) {

Object.values(val).forEach(function (val2, index) {

let v = Object.values(targetTable)[item].value;

let r = Object.keys(targetTable)[item];

if (val2.value[v].value.length > 0) {

Object.keys(val2.value).map(function (cur) {

record[r].value[index].value[cur].disabled = true;

});

record[r].value[index].value[v].disabled = false;

}

});

});

}

return event;

});

})();
TKにより編集されました
0
Avatar
進藤 真樹

TKさま、ありがとうございました。

いただいたコードを参考にさせていただきつつ、どちらの方法で書くか、社内で考えてみたいと思います。

今後とも、よろしくお願いいたします。

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