入力用アプリの保存時に、フィールド名とフィールドの値を
管理用アプリのサブテーブルに保存したいです。
具体的には、入力用アプリには商品ごとに数を入力する数値フィールドがあります。
この数値フィールドに値があるものだけを管理用アプリのサブテーブルのフィールド「商品名」と「数量」に保存したいです。
「商品名」には、入力用アプリのラベル名が、
「数量」には、入力用アプリに入力された数値が入ります。
また、入力用アプリにある商品数以外の情報は
管理用アプリのサブテーブルの外に入力したいです。
ラベル名をフィールドの値にいれる方法と
サブテーブル外フィールド(繰り返しなし)とサブテーブル内フィールド(行数分繰り返す)に値を入れる時の記述方法がわかりません。
以下のサイトを参考にしました。
ラベル名の取得
https://developer.cybozu.io/hc/ja/articles/201941834-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E8%A8%AD%E8%A8%88%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97
↑取得はできましたが、フィールドの値へ1つずついれる方法がわかりませんでした
POSTの書き方
https://developer.cybozu.io/hc/ja/articles/202166160-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%99%BB%E9%8C%B2-POST-
↑ボディのサブテーブル部分のみをフィールドの値がある分だけ繰り返す方法がわかりませんでした
ご教授よろしくお願いします。
ラベル名を取得して行う場合、取得した後に該当するフィールドの抽出が必要なため、細かい調整が必要になると思います。
例えば商品名を配列で記載し、数量フィールドのフィールドコードを「商品名+数量」といったものに設定してループを回すのはいかがでしょうか。もし商品名にフィールドコードとして使えない文字が含まれる場合は、連想配列を使ったループでも可能と思われます。
(function() {
'use strict';
kintone.events.on([
'app.record.create.submit', 'app.record.edit.submit'
], function(event) {
var record = event.record;
return new kintone.Promise(function(resolve, reject) {
var fields = ['*ここに商品名を記載*',...];
var tableValue = [];
for (var i = 0; i < fields.length; i++) {
if (record[fields[i] + '数量'].value) {
tableValue.push({
'value': {
'*サブテーブル商品名のフィールドコード*': {
'value': fields[i]
},
'*サブテーブル数量のフィールドコード*': {
'value': record[fields[i] + '数量'].value
}
}
});
}
};
var body = {
'app': *対象のアプリid*,
'record': {
'*サブテーブルのフィールドコード*': {
'value': tableValue
},
//その他のフィールドをPOSTに含めるのであれば続けて記載'
},
};
if (tableValue.length > 0) {
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body, function(resp) {
resolve(event);
}, function(error) {
alert(JSON.stringify(error));
resolve(event);
});
} else {
resolve(event);
}
});
});
})();
mls-hashimoto様
ご回答ありがとうございます。
追加で質問させてください。
いただいたコードだと、商品名を配列に記載するため、
商品名のフィールドを追加した場合、コードも書き換えが必要になると思います。
できれば、コードの書き換えはフィールドの増減でおこなわなくて済むようにしたいです。
例えば、質問で記載した「ラベル名の取得」のコメントにあるコード(下記コード)を利用して、
ラベル名の設定を配列に入れ、フィールドコードに「数量」を含む、値があるものだけを取得することは可能でしょうか。
(function () {
‘use strict’;
kintone.events.on(“app.record.index.show”, function (event) {
//フォーム設計情報の取得
var body= {
“app”:143
};
kintone.api(kintone.api.url(‘/k/v1/form’, true), ‘GET’, body, function(resp) {
// success
console.log(resp);
for(var k=0; k<resp.properties.length; k++){
if(resp.properties[k].code === “DROP_DOWN”){
var box=resp.properties[k].options;
console.log(box);
}
}
}, function(error) {
// error
console.log(error);
});
});
})();
J さま
取得するフィールドのラベルと数量フィールドのラベル名かフィールドコードに法則があれば可能です。
但し、投稿されたコードを拝見する限り、ラベル名ではなくドロップダウンフィールドのオプション(選択肢)を参照しているようですが、そちらで間違いないでしょうか。
mls-hashimoto様
説明が足りずすみません。
コードはあくまで参考にしたものなのでドロップダウンの選択肢を参照しています。
こちらは、フィールドコードに共通の単語を設定して、
条件分岐することで対応できました。
ありがとうございました。