新規投稿
フォローする

複数テーブルを別のアプリのフィールドにコピー

転記元には複数のテーブルとフィールドがあり、

転記元のテーブルにある作成にチェックをいれボタンを押すと

転記先にコピーする様にしたいのですが

プラグインのテーブルコピーを使うとテーブルは一つまで&条件は付けられないことからJavaScriptで作成することとしました。

テーブルから別のアプリのテーブルへのコピーは検索できたのですがフィールドへのコピーが見つからず質問させていただきました。

どうかよろしくお願いいたします。

例  転記先文字列(一行1) = 転記元テーブル1から文字列(一行1)

   転記先文字列(一行2) = 転記元文字列(一行2)

   転記先文字列(一行3) = 転記元テーブル1から文字列(一行3)

   転記先数値1 = 転記元テーブル2から数値

   転記先日付 = 転記元テーブル2から日付

 

1

4件のコメント

Avatar
TO

    
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)を前提にして回答しているのですが,
もしそういうことではない(例えば転記先にあらかじめデータが転記された状態で登録画面で表示されるようにしたい,など)
であれば,その旨指摘ください.



0
Avatar
aoan

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つチェックを入れてください');

        }  

    };

})();
0
Avatar
TO

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により編集されました
0
Avatar
aoan

TO様

filter件、ありがとうございます。

何度も申し訳ないのですがアプリ間のデータコピーの記述の仕方がわからずつまずいているのですが//テーブル1の値を転記 の部分の書き方を教えていただけると幸いです。よろしくお願いいたします。

try {
                    const params = {
                        app: 45,
                        record:{
                            //テーブル1の値を転記                        }
0
サインインしてコメントを残してください。