転記元には複数のテーブルとフィールドがあり、
転記元のテーブルにある作成にチェックをいれボタンを押すと
転記先にコピーする様にしたいのですが
プラグインのテーブルコピーを使うとテーブルは一つまで&条件は付けられないことからJavaScriptで作成することとしました。
テーブルから別のアプリのテーブルへのコピーは検索できたのですがフィールドへのコピーが見つからず質問させていただきました。
どうかよろしくお願いいたします。
例 転記先文字列(一行1) = 転記元テーブル1から文字列(一行1)
転記先文字列(一行2) = 転記元文字列(一行2)
転記先文字列(一行3) = 転記元テーブル1から文字列(一行3)
転記先数値1 = 転記元テーブル2から数値
転記先日付 = 転記元テーブル2から日付
aoan様
テーブルデータを別アプリのレコードフィールドに転記する場合,
テーブルの行数だけ転記先のレコードが生成されることになりますが,
その理解で良いですか?
解釈に誤りがなければ,
テーブル1の行数だけループ処理して,
転記先のフィールド = 転記元のフィールド
と指定したbodyを用意してPUTすることで良いかと思います.
この場合,テーブルの行数でループしているので,テーブル内のフィールドの場合は,
転記先のフィールド = 転記元のテーブルのn行目のフィールド
となります.
例に合わせるなら,
例 転記先文字列(一行1) = 転記元テーブル1,n行目の文字列(一行1)
転記先文字列(一行2) = 転記元文字列(一行2)
転記先文字列(一行3) = 転記元テーブル1,n行目の文字列(一行3)
転記先数値1 = 転記元テーブル2,n行目の数値
転記先日付 = 転記元テーブル2,n行目の日付
上記をテーブル1または2の行数分繰り返すことになるかと思います.
なお,この場合テーブル1と2の行数は同じである必要があります.
また,テーブル1または2行数分だけ転記先レコードが生成します.
意図が違うようであれば,もう少し具体的な状況を記載ください.
(現段階でできていること,コード,エラーがあるならその内容)
また,勝手にレコードの更新(PUT)を前提にして回答しているのですが,
もしそういうことではない(例えば転記先にあらかじめデータが転記された状態で登録画面で表示されるようにしたい,など)
であれば,その旨指摘ください.
TO様
コメントありがとうございます。
説明が足らず申し訳ございませんでした。
”テーブルデータを別アプリのレコードフィールドに転記する場合,
テーブルの行数だけ転記先のレコードが生成されることになりますが,
その理解で良いですか?”
という質問ですが基本的にはそうなることは存じあげています。
しかしながら今回はテーブル1のデータ、テーブル2のデータは同じ行数ではない上、作成したいレコードが
例えばテーブル1の1行目の値とテーブル2の3行目の値などの組み合わせがあるため、手動でチェックをいれた列でレコードを作成したいのです。テーブル1,2には必ずチェックはひとつずつしか入りません。
”勝手にレコードの更新(PUT)を前提にして回答しているのですが”
というところについてはレコードの更新で大丈夫です。
今現状できているコードは以下です。
アプリ間のデータコピーの記述の仕方がわからずつまずいているのとIFのネストがあっているのか不安です。まだまだ悩み途中のコードで申し訳ございませんがアドバイスいただけたら幸いです。
(() => {
'use strict';
kintone.events.on('app.record.detail.show', (event) => {
// メニューの上側の空白部分にボタンを設置
const myIndexButton = document.createElement('button');
myIndexButton.id = 'my_index_button';
myIndexButton.innerText = 'コピー';
myIndexButton.onclick = () => {
// テーブルデータ一括取得
const tableRecords1 = event.record.'テーブル1'.value;
const tableRecords2 = event.record.'テーブル2'.value;
// テーブルデータの作成にチェックが入ってる行を検索、無い場合はエラーメッセージ
for (let i = 0; i < tableRecords1.length; ++i) {
if (tableRecords1[i][0] = '作成'){
if (tableRecords2[j][0] = '作成'){
let column1 = i;
let column2 = j;
try {
const params = {
app: 45,
record:{
//テーブル1の値を転記
}
}
}
try {
const params2 = {
app: 45,
record:{
//テーブル2の値を転記
}
}
}
}else{
alert('テーブル2の作成に1つチェックを入れてください');
}
}else{
alert('テーブル1の作成に1つチェックを入れてください');
}
};
})();
aoan様
「チェックが入ったテーブル行を取得する」のであれば,filterが良いかもしれません.
forEach, map, filterなどをつかってkintoneのrecords配列をもっと上手に扱う
上記の例であれば,
const myRow1 = tableRecords1.filter(row => row.チェック1.value.indexOf('作成') !== -1);
…で配列として取得できます.
(すいません,チェックボックスのフィールドコードが記載されていなかったので勝手に「チェック1」にしています)
もしHitしたら必ずmyRow1は要素数1以上の配列になるので,
myRow[0] =…とします.
もしHitしない場合,要素数0になるので,
if(!myRow.length)で有無の判定が可能です.
ちなみに,想定されていた「チェックボックス.value[0] === ‘作成’」は,
もしチェックボックスが選択されていない場合に,valueが空配列[]になり,
そこに要素0を指定するのでエラーになると思います.
参考になれば幸いです.
TO様
filter件、ありがとうございます。
何度も申し訳ないのですがアプリ間のデータコピーの記述の仕方がわからずつまずいているのですが//テーブル1の値を転記 の部分の書き方を教えていただけると幸いです。よろしくお願いいたします。
try{
constparams= {
app:45,
record:{
//テーブル1の値を転記 }
system
(system)
クローズされました:
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。