関連レコードで表示された内容をテーブルへ挿入したい。

お世話になっております。

https://developer.cybozu.io/hc/ja/community/posts/360030416132/comments/360003016972

上記同様のご質問拝見致しまして、テストアプリに各フィールドコードや環境揃えて挿入(そのまま)しましたがボタンは表示されたものの、その後動作致しません。

kintoneアップデート等で対応出来なくなったのかとは思いますが、現在でも動作可能でしたら修正箇所ご教示頂ければありがたいです。

リンクの通りではありますが、使用js転載致します。

 

(function() { "use strict";
  kintone.events.on(['app.record.create.show','app.record.edit.show'],function(){varbuttonSpace ='button\_space',//ボタンを置くスペースのスペースIDrelatedRecordsFieldCode ='案件一覧',//関連レコードフィールドのフィールドコードtable ='Table',//コピー先のサブテーブルのフィールドコードbutton =document.createElement('a');
    button.innerHTML ='copy';
    kintone.app.record.getSpaceElement(buttonSpace).appendChild(button);
    RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
      button.addEventListener('click',function(){varevent = kintone.app.record.get(),
          tableColumns = [];for(varfieldCodeinevent.record[table].value[0].value){
          tableColumns.push({fieldCode: fieldCode,type: event.record[table].value[0].value[fieldCode].type
          });
        }
        (newRelatedRecordsFieldManager(relatedRecordsFieldCode)).getRecords(event.record).then(function(records){
          event.record[table].value = records.filter(function(record){returnrecord.確度.value ==='100%';
          }).map(function(record){varrow = {value: {}};
            tableColumns.forEach(function(column){
              row.value[column.fieldCode] = {value: record[column.fieldCode].value,type: column.type};
            });returnrow;
          });
          kintone.app.record.set(event);
        });
      });
    });
  });// コンストラクタ定義varRelatedRecordsFieldManager = (function(fieldCode){//略})();
})();

 

こちらのコードはkintoneのアップデートに関係なく動作するように作成されています。コンソールでエラー内容を確認することは可能ですか?

最後にある//略部分には江田さんの作られたコンストラクタを宣言する必要があります。

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

コメントありがとうございました。
略部分のコードについてもありがとうございます。
知識がないまま転用していた為、何も知らず戸惑っていました次第です。
明日、ご教示下さった内容確認し、動作確認してみます。

お世話になっております。

上記、コンストラクタの宣言を加えまして、無事動作確認できました。ありがとうございました。

こちら、列を特定してコピーさせたい場合はどの様に追記させればよろしいのでしょうか。

)例として、表示中の関連レコード一覧内の列1、列3をテーブルの列1、列2へ (フィールドコードは合わせてあります。)

 

 

ジェシーおいたん さま

以下で可能かと思います。

15~18行目に記載してある連想配列をコピーしたいフィールド分、必要に応じて書き換えてご使用ください(連想配列にあるフィールドのみコピーを行います。当然ながらテーブルのフィールドが日付やチェックボックス等値の制限がある場合、同じフィールドでないと動作しません)。

(function() {
"use strict";
kintone.events.on([
'app.record.create.show',
'app.record.edit.show'
], function(){
var
buttonSpace = 'button_space', //ボタンを置くスペースのスペースID
relatedRecordsFieldCode = '案件一覧', //関連レコードフィールドのフィールドコード
table = 'Table', //コピー先のサブテーブルのフィールドコード
button = document.createElement('a');

/* 左にコピー先のサブテーブル内フィールドコード、右に関連レコードのフィールドコード */
var parallelFields = {
'サブテーブル内のフィールドコード': '関連レコードのフィールドコード',
'': '',
};

button.innerHTML = 'copy';
kintone.app.record.getSpaceElement(buttonSpace).appendChild(button);
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
button.addEventListener('click', function(){
var
event = kintone.app.record.get(),
tableColumns = [];
for(var fieldCode in event.record[table].value[0].value){
tableColumns.push({
fieldCode: fieldCode,
type: event.record[table].value[0].value[fieldCode].type
});
}
(new RelatedRecordsFieldManager(relatedRecordsFieldCode)).getRecords(event.record).then(function(records){
event.record[table].value = records/*.filter(function(record){
return record.確度.value === '100%';//確度による絞り込みが必要ないのであれば囲んである部分を削除
})*/.map(function(record){
var row = {value: {}};

tableColumns.forEach(function(column) {
if (parallelFields[column.fieldCode] !== undefined) {
row.value[column.fieldCode] = {
'value': record[parallelFields[column.fieldCode]].value,
'type': column.type
};
} else {
if (column.type.match(/CHECK|SELECT|FILE/) !== null) {
row.value[column.fieldCode] = {
'value': [],
'type': column.type
};
} else {
row.value[column.fieldCode] = {
'value': '',
'type': column.type
};
}
}
});
return row;
});
kintone.app.record.set(event);
});
});
});
});
// コンストラクタ定義
var RelatedRecordsFieldManager = (function(fieldCode){
//略
})();
})();

ありがとうございます。頂いた上記の内容で試してみます。

 

mls-hashimoto様

上記動作確認出来ました。ありがとうございます。
こちら問題なくコピー動作したのですが、今回設定した個別のフィールドの中に、ルックアップがございます。
コピー挿入した際に自動取得する lookup=trueはこの場合どちらに記載するのでしょうか。

ジェシーおいたん さま

forEach文内に記載して問題ありません。lookup=trueで自動取得するにはコピー元のフィールドが重複禁止になっている必要がありますのでお気を付けください。

tableColumns.forEach(function(column) {
if (parallelFields[column.fieldCode] !== undefined) {
row.value[column.fieldCode] = {
'value': record[parallelFields[column.fieldCode]].value,
'type': column.type,
'lookup': true
};
} else {
if (column.type.match(/CHECK|SELECT|FILE/) !== null) {
row.value[column.fieldCode] = {
'value': [],
'type': column.type
};
} else {
row.value[column.fieldCode] = {
'value': '',
'type': column.type,
};
}
}
});

mls-hashimoto様

上記で無事動作確認出来ました。
重ね重ねありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。