お世話になります!
添付画像のフィールド配置になっているアプリがあり
上段の中央に スリムキーケース
という値の入ったフィールドがあります。
受注ごとにここの商品名は異なるのですが
画面一番下にある工数情報テーブルの作業内容(プルダウン)、
工数(数値)
へ商品ごとに決まった値を入れたいです。
この画像はキーケースですが
作業内容、工数は何かがない限りここの値が大きく変化することは
ないのでレコードを追加したときに
自動的に入っていると助かると現場の声があり、
方法がお分かりになればご教授いただけますと幸いです。
宜しくお願いいたします。
19件のコメント
以下のような形でしょうか。
4~7行目のフィールドコード、8行目以降の連想配列を設定したい分だけ追加して使用して下さい。
mls-hashimoto さま
お世話になります!
ありがとうございます。
大変助かりました。近日中に開発環境で、実施してみます!
mls-hashimoto さま
お世話になります!
下記のように組んでみました。
シンプル名刺入れ、スリム長財布
ともに一番下の仕上げ5分、裁断5分のみ
テーブルの1行目に反映されて、他の行は追加されません。。。
おかしなところがあれば、お教えいただいてもよろしいでしょうか?
恐れ入りますがよろしくお願いいたします。
(function() {
'use strict';
let itemName = '商品名'; // 商品名のフィールドコード
let subTable = '工数情報'; // サブテーブルのフィールドコード
let workDescription = '作業内容'; // 作業内容のフィールドコード
let workload = '工数'; // 工数のフィールドコード
let fieldValues = {
'シンプル名刺入れ': ['内装', 5],// 左に「作業内容」の値 右に「工数」の値
'シンプル名刺入れ': ['裁断', 15],
'シンプル名刺入れ': ['仕上げ', 5],
'スリム長財布(カード収納13段)': ['仕上げ', 10],
'スリム長財布(カード収納13段)': ['内装', 8],
'スリム長財布(カード収納13段)': ['裁断', 5],
// 他にあれば同じように記載 ['すき', 90],
};
// 1行目の内容(空白の場合のみ値を変更)
kintone.events.on([
'app.record.create.change.' + itemName, 'app.record.edit.change.' + itemName
], (event) => {
let record = event.record;
if (!record[itemName].value || !fieldValues[record[itemName].value]) return event;
let rowWorkDescription = record[subTable].value[0].value[workDescription];
let rowWorkload = record[subTable].value[0].value[workload];
if (!rowWorkDescription.value) rowWorkDescription.value = fieldValues[record[itemName].value][0];
if (!rowWorkload.value) rowWorkload.value = fieldValues[record[itemName].value][1];
return event;
});
// 行追加時の内容
kintone.events.on([
'app.record.create.change.' + subTable, 'app.record.edit.change.' + subTable
], (event) => {
let record = event.record, row = event.changes.row;
if (!row || !fieldValues[record[itemName].value]) return event;
row.value[workDescription].value = fieldValues[record[itemName].value][0];
row.value[workload].value = fieldValues[record[itemName].value][1];
return event;
});
})();
追伸
コンソールはいつもの画面が出てきてくれず
こちらの画面を現在見られる状況です。
エラーの赤字とかがみられないのですが共有させていただいます。
Riorioさま
そもそも以上のような動作を想定していたのですが、どうやら違うようですね。
こういった動作のご希望でしょうか?
mls-hashimoto さま
ご連絡いただきまして誠にありがとうございます!
そうですね、
各商品、作業内容と工数はほとんど決まっているので
商品名が入ったら、その商品の決まった作業内容と工数がテーブルに追加されている
ということが理想で、もし工数が増えてしまった場合は手動でそこだけ分数を変えるなど対応する
流れを描いております。
シンプル名刺入れ と商品名が入れば
内装 5
裁断 5
仕上げ 5
キーケース と商品名が入れば
内装 7
裁断 5
仕上げ 10
などでございます。説明が足りておらず申し訳ございませんが
何卒、よろしくお願いいたします。
※必要な情報ではないかもしれませんが
現在、商品名が入ると、金額が入るフィールドがあるのですが
そこには自動で金額が入るJSを組んでおります。
Riorioさま
内容について承知しました。以下のような形で可能かと思います。
8行目以降を必要な数だけ追加して下さい(配列の数だけ行を作成します)。
追記:初期値を設定しているフィールドはありますか?その場合は違う処理も必要です。
mls-hashimoto さま
お世話になります!
開発環境では理想通りの動きとなりました!初期値は幸いなかったので
このままで大丈夫そうです。
本番環境で近々テストを実施しまてみます!
大変ありがとうございました!
mls-hashimoto さま
お世話になります!
反映されるタイミングについて、お教えいただきたいのですが
現在、商品名フィールドに入力された、または書き換えた状況で
値が反映されるようになっておりまして、これはこれで完結できました。
もう一つ、データの書き込みをしたときの反映はkintoneではできないと思うのですが
一括で登録した後に反映されるようにするための方法として
編集ボタンを押したときなど反応させることは可能でしょうか?
このアプリで、商品名が入って、単価フィールドに値段が反映されるようにしている
jsは一括登録後に反映できるように下記のように組んであるのですが
先ほど、同じようにkintone.events.onの後に
入れてみたのですが反応がなく、どのようにすればよいのかご教授いただけますでしょうか?
恐れ入りますがよろしくお願いいたします。
商品名により単価が反映されるjs(イベントの発火の部分は太文字にしました)
(function() {
"use strict";
var events = [
"app.record.create.show", "app.record.edit.show", "app.record.index.edit.show","app.record.index.edit.submit",
"app.record.create.change.商品名", "app.record.edit.change.商品名", "app.record.index.edit.change.商品名"
];
kintone.events.on(events, function(event) {
var record = event.record;
record['UNROOF単価']['disabled'] = true;
if (record['商品名'].value === 'スリムキーケース')
record['UNROOF単価'].value = 4490;
else if (record['商品名'].value === 'シンプルラウンド長財布(バイカラー)')
record['UNROOF単価'].value = 8940;
else if (record['商品名'].value === 'シンプルラウンド長財布')
record['UNROOF単価'].value = 8940;
else if (record['商品名'].value === 'スリム長財布(カード収納13段)')
record['UNROOF単価'].value = 8940;
else if (record['商品名'].value === 'シンプル名刺入れ')
record['UNROOF単価'].value = 4990;
else if (record['商品名'].value === 'ENISHI 2つ折り財布')
record['UNROOF単価'].value = 13040;
else if (record['商品名'].value === 'ENISHI ラウンド長財布')
record['UNROOF単価'].value = 14540;
else if (record['商品名'].value === 'ENISHI スマホケース(iPhoneSE第2世代/7/8)')
record['UNROOF単価'].value = 5040;
else if (record['商品名'].value === 'ENISHI スマホケース(iPhone11)')
record['UNROOF単価'].value = 5040;
else if (record['商品名'].value === 'ENISHI スマホケース(iPhone11Pro)')
record['UNROOF単価'].value = 5040;
else if (record['商品名'].value === 'ENISHI スマホケース(iPhone12/12Pro)')
record['UNROOF単価'].value = 5040;
else if (record['商品名'].value === 'ENISHI スリム長財布')
record['UNROOF単価'].value = 14540;
else if (record['商品名'].value === 'ENISHI 名刺入れ')
record['UNROOF単価'].value = 5995;
else
record['UNROOF単価'].value = '';
return event;
});
})();
テーブルで反映したいタイミングの例(反応がなかったパターンです)
下記でNGだったので、間違えているのかそもそもテーブルではこのタイミングは
出来ないのか、恐れ入りますがご教授いただけますでしょうか?
宜しくお願いいたします。
(function() {
'use strict';
let itemName = '商品名'; // 商品名のフィールドコード
let subTable = '工数情報'; // サブテーブルのフィールドコード
let workDescription = '作業内容'; // 作業内容のフィールドコード
let workload = '工数'; // 工数のフィールドコード
let fieldValues = {
'シンプル名刺入れ': [
{
value: '内装',
workload: 5
},
{
value: '裁断',
workload: 15
},
{
value: '仕上げ',
workload: 5
}
],
'スリム長財布(カード収納13段)': [
{
value: '仕上げ',
workload: 10
},
{
value: '内装',
workload: 8
},
{
value: '裁断',
workload: 5
}
],
'スリムキーケース': [
{
value: '仕上げ',
workload: 10
}
],
};
kintone.events.on([
'app.record.create.change.' + itemName, 'app.record.edit.change.' + itemName,
'app.record.create.show'+ itemName, 'app.record.edit.show'+ itemName, 'app.record.index.edit.show'+ itemName,
'app.record.index.edit.submit'+ itemName, 'app.record.index.edit.change.'+ itemName
], (event) => {
let record = event.record;
let tableColumns = [];
for (let fieldCode in record[subTable].value[0].value) {
tableColumns.push({
fieldCode: fieldCode,
fieldType: record[subTable].value[0].value[fieldCode].type
});
};
if (fieldValues[record[itemName].value]) {
let tableValue = [];
Object.keys(fieldValues[record[itemName].value]).forEach((field, index) => {
let addRow = {
value: {}
};
tableColumns.forEach((column) => {
addRow.value[column.fieldCode] = {
type: column.fieldType
};
switch(column.fieldCode) {
case workDescription:
addRow.value[workDescription].value = fieldValues[record[itemName].value][index].value;
break;
case workload:
addRow.value[workload].value = fieldValues[record[itemName].value][index].workload;
break;
default:
if (column.fieldType.match(/CHECK|SELECT|FILE/)) {
addRow.value[column.fieldCode].value = [];
} else {
addRow.value[column.fieldCode].value = '';
}
};
});
tableValue.push(addRow);
});
record[subTable].value = tableValue;
}
return event;
});
})();
Riorioさま
イベントの記述自体は
を
に変更で問題ありません。変数「itemName」には商品名が代入されているので「app.record.edit.show.商品名」といったイベントは存在せず何も起こりません。またサブテーブルは一覧画面での編集には対応していないため一覧(index)イベントでは使用できません。
ただし、このコードをそのまま実行した場合、編集する度にサブテーブルがリセットされることになります。回避するため「サブテーブルが何も入力されていない場合」に処理を行う必要があります。以下のような形で良いでしょう。
また、データの書き込みとは、csvの読み込み等による一括レコード登録でしょうか?こちらはExcel等で必要な計算をしておけば実現できるかと思います(但し複雑な計算式を組み込む必要があります)。
mls-hashimoto さま
お世話になります!
ご連絡ありがとうございます!
下記JSで早速組んでみました。
データの書き込み=一括登録の意味で用いさせて頂きました。
エクセルor csvのデータを日々30件くらい一括でこのアプリに入れるということになります。
その時に商品名
は入ってるので、編集画面を開いた瞬間に金額は反映される形となっておりまして
同時にテーブルもポンと入ってくれるイメージでいるのですが
下記でやってみたのですが、入ってくれません。
何か、おかしなところがございますでしょうか?
恐れ入りますが、ご確認いただけますと幸いです。
(function() {
'use strict';
let itemName = '商品名'; // 商品名のフィールドコード
let subTable = '工数情報'; // サブテーブルのフィールドコード
let workDescription = '作業内容'; // 作業内容のフィールドコード
let workload = '工数'; // 工数のフィールドコード
let fieldValues = {
'シンプル名刺入れ': [
{
value: '内装',
workload: 5
},
{
value: '裁断',
workload: 15
},
{
value: '仕上げ',
workload: 5
}
],
'スリム長財布(カード収納13段)': [
{
value: '仕上げ',
workload: 10
},
{
value: '内装',
workload: 8
},
{
value: '裁断',
workload: 5
}
],
'スリムキーケース': [
{
value: '仕上げ',
workload: 10
}
],
};
kintone.events.on([
'app.record.edit.show',
'app.record.create.change.' + itemName, 'app.record.edit.change.' + itemName
], (event) => {
let record = event.record;
let tableColumns = [];
for (let fieldCode in record[subTable].value[0].value) {
tableColumns.push({
fieldCode: fieldCode,
fieldType: record[subTable].value[0].value[fieldCode].type
});
};
let isTableChange = record[subTable].value.some((row) => {
return !Object.keys(row.value).some((fieldCode) => {
return row.value[fieldCode].type.match(/CHECK|SELECT|FILE/) ? row.value[fieldCode].value.length: row.value[fieldCode].value;
});
});
if (fieldValues[record[itemName].value] && isTableChange) {
let tableValue = [];
Object.keys(fieldValues[record[itemName].value]).forEach((field, index) => {
let addRow = {
value: {}
};
tableColumns.forEach((column) => {
addRow.value[column.fieldCode] = {
type: column.fieldType
};
switch(column.fieldCode) {
case workDescription:
addRow.value[workDescription].value = fieldValues[record[itemName].value][index].value;
break;
case workload:
addRow.value[workload].value = fieldValues[record[itemName].value][index].workload;
break;
default:
if (column.fieldType.match(/CHECK|SELECT|FILE/)) {
addRow.value[column.fieldCode].value = [];
} else {
addRow.value[column.fieldCode].value = '';
}
};
});
tableValue.push(addRow);
});
record[subTable].value = tableValue;
}
return event;
});
});
Riorioさま
コードの最終行末尾に()を追加して下さい。
↓
mls-hashimoto さま
お世話になります!
ご連絡ありがとうございます!
何度も何度も申し訳ございません。
()入れさせていただいたのですが
編集画面では単価は入るもののやはりテーブルが入りません。
下記が詳細画面を表示したときと
編集画面に入ったときのキャプチャです。
恐れ入りますがご確認のほどお願いいたします。
※詳細画面表示
※編集画面
Riorioさま
isTableChangeの変数を変更しました。
mls-hashimoto さま
たびたびのご連絡誠にありがとうございます!
isTableChangeの変数を変更したVerにしてみましたが
やはり編集画面を開いたときの反応がなく、
入力されている商品名をもう一度入れなおす作業をすると
テーブルが反応する状況でございます。
以下で間違いないかと思うのですが。。。
(function() {
'use strict';
let itemName = '商品名'; // 商品名のフィールドコード
let subTable = '工数情報'; // サブテーブルのフィールドコード
let workDescription = '作業内容'; // 作業内容のフィールドコード
let workload = '工数'; // 工数のフィールドコード
let fieldValues = {
'シンプル名刺入れ': [
{
value: '内装',
workload: 5
},
{
value: '裁断',
workload: 15
},
{
value: '仕上げ',
workload: 5
}
],
'スリム長財布(カード収納13段)': [
{
value: '仕上げ',
workload: 10
},
{
value: '内装',
workload: 8
},
{
value: '裁断',
workload: 5
}
],
'スリムキーケース': [
{
value: '仕上げ',
workload: 10
}
],
};
kintone.events.on([
'app.record.edit.show.',
'app.record.create.change.' + itemName, 'app.record.edit.change.' + itemName
], (event) => {
let record = event.record;
let tableColumns = [];
for (let fieldCode in record[subTable].value[0].value) {
tableColumns.push({
fieldCode: fieldCode,
fieldType: record[subTable].value[0].value[fieldCode].type
});
};
let isTableChange = record[subTable].value.every((row) => {
return !Object.keys(row.value).some((fieldCode) => {
return row.value[fieldCode].type.match(/CHECK|SELECT|FILE/) ? row.value[fieldCode].value.length: row.value[fieldCode].value;
});
});
if (fieldValues[record[itemName].value] && isTableChange) {
let tableValue = [];
Object.keys(fieldValues[record[itemName].value]).forEach((field, index) => {
let addRow = {
value: {}
};
tableColumns.forEach((column) => {
addRow.value[column.fieldCode] = {
type: column.fieldType
};
switch(column.fieldCode) {
case workDescription:
addRow.value[workDescription].value = fieldValues[record[itemName].value][index].value;
break;
case workload:
addRow.value[workload].value = fieldValues[record[itemName].value][index].workload;
break;
default:
if (column.fieldType.match(/CHECK|SELECT|FILE/)) {
addRow.value[column.fieldCode].value = [];
} else {
addRow.value[column.fieldCode].value = '';
}
}
});
tableValue.push(addRow);
});
record[subTable].value = tableValue;
};
return event;
});
})();
Riorioさま
申し訳ありません。勘違いをしていました。setTimeoutの処理を追加しています。
mls-hashimoto さま
お世話になります!
出来ました!ありがとうございます。
明日、本番環境で試してみますが基本変わらないはずなので
できると思います。
settimeoutの処理をしないといけないのは
なぜなのでしょうか?
Riorioさま
無事にできたようで何よりです。
setTimeoutを入れたのは、詳細画面のスクリーンショットを見た時に気付きましたが、csv等から取り込んだ場合、サブテーブルのデータをcsvに含んでいない場合はサブテーブルの値が全くない状態になります(1行目のデータをコピーして2行目以降を作っていくコードですが、1行目自体がないので走りませんでした)。kintone側で1行目のデータが作られるのを待つために追加しました。当方ではそこまでテストしていなかったため気付くのが遅くなりました…。
mls-hashimoto さま
ご連絡誠にありがとうございます!
確かにcsvデータには一行目は含まれず
初めて商品名が入ったときに反応が入るという形になりますので
そういうことなのですね。
大変勉強になりました。
ありがとうございます!!