テーブルデータを別アプリのレコードに登録したい。

Aアプリにあるテーブルのデータを1行ずつ、

Bアプリのレコードに登録したいのですが可能でしょうか…

過去の投稿を参考に調べているのですが、

実は開発超初心者のため長い記述になると理解できずにおり、

もしサンプルとなる記述等あればご教示いただけないでしょうか…

 

開発できるものがいないシステム部のため

システム部だけで利用するためにkintoneを登録し、

出来るだけノンプログラミングでアプリを作っていたのですが…

経理部から相談を受けて経理精算申請アプリを作っているところです。

 

何卒よろしくお願いいたします。

出町 望様

お世話になっております。
cstapの江田と申します。

可能だと思います。

Aアプリにはレコードが複数登録されていると思いますが、コピー処理は1レコードずつ行いますか?それとも全レコードまとめて行いますか?
また、コピー処理を行うタイミングなども指定していただけると、具体的な回答がしやすいかと思います。

cstap 江田様

大変お世話になっております。
うまく説明できなそうなので画像にしてみました!

Aアプリのフォーム画面で保存ボタンをクリック時に、
テーブルデータをBアプリのレコードに1行ずつ一気にコピーしたいと思っています。

また、可能であればオレンジ枠で囲んであるヘッダー情報を1行ずつ付けてコピーしたいですが、
あまり複雑になるようであればテーブルデータだけのほうが良いのかな、とも考えております…

 

ーーーーーーーーーーーーーーーーー
Aアプリ
保存ボタンクリック

[ヘッダー情報(オレンジ枠) + テーブルデータ1行目(赤枠)]
[ヘッダー情報(オレンジ枠) + テーブルデータ2行目(赤枠)]

Bアプリ
1レコード[ヘッダー情報(オレンジ枠) + テーブルデータ1行目(赤枠)]をコピー
1レコード[ヘッダー情報(オレンジ枠) + テーブルデータ2行目(赤枠)]をコピー
ーーーーーーーーーーーーーーーーー

上記のようなイメージです。(うまく説明ができずすみません…)

ご教示のほど、何卒よろしくお願いいたします。

出町 望様

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

JavaScriptカスタマイズで、以下のコードを設定していただければ実装できるかと思います。

(function () {
  "use strict";
  kintone.events.on([
    'app.record.create.submit.success',
  ], function (event) {
    var postApp = 14488; //BアプリのID
    var subTable = 'Table'; //サブテーブルのフィールドコード
    var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
      '施設名',
      '所管部署',
      '研究室',
      '支払方法',
      '支払先_FB',
      '支払先_FB以外',
      '支払日',
    ];

    kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
      app: postApp,
      records: event.record[subTable].value.map(function (row) {
        headers.forEach(function (header) {
          row.value[header] = event.record[header];
        });
        return row.value;
      })
    });
  });
})();

cstap 江田様

大変お世話になっております!

 

早速試してみようと、コードを解読(?)しながら進めていったのですが処理失敗となっています。

※別のテストアプリを作成して実行してみました。

 

(function () {
"use strict";
kintone.events.on([
'app.record.create.submit.success',
], function (event) {
var postApp = 131; //BアプリID
var subTable = 'yaoya_subtable'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'day_yaoya'
'siharai_yaoya',
];

kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
app: postApp,
records: event.record[subTable].value.map(function (row) {
headers.forEach(function (header) {
row.value[header] = event.record[header];
});
return row.value;
})
});
});
})();

どの記述に間違いがありますでしょうか。

質問ですが、Bアプリの受け側のフィールドコードはAアプリに合わせたほうが良いのでしょうか。

また、17行目についていまいち理解できずにいるのですがこの記述はどのような意味があるのでしょうか…

row.value[header] = event.record[header];

 

大変恐縮ですが、何卒よろしくお願いいたします。

 

出町 望様

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

おそらく記述には問題はないかと思います.

AアプリとBアプリでフィールドコードが一致している想定でコードを書きました.
一致していないとエラーになるかと思います.

また,Aアプリのサブテーブル内にあるフィールドが,Bアプリにない場合はエラーになります.

「row.value[header] = event.record[header];」 について.
「row.value」にサブテーブルの1行ごとのデータが入っているので,これをもとにアプリBに登録するデータを作成しています. 
各レコードに「ヘッダー情報(オレンジ枠)」も入れるということなので,「row.value[header] = event.record[header];」によってその情報を足しています.

江田様

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

'day_yaoya' 
'siharai_yaoya',

ヘッダー情報の記述の一行目の、コンマが抜けていたようでした!

 

修正して試したところ、

今度は保存ボタンをクリック時に画面が切り替わらない現象が発生しました。

素人ながら、エラーを確認してみましたが、

Uncaught TypeError: Cannot read property ‘value’ of undefinedとエラーが出ていました。

records: event.record[subTable].value.map(function (row) {

この箇所でエラーになっているようなのですが、

値の取得と設定がうまくいっていない??ということなのでしょうか。

 

度々申し訳ございません。。

ご教示のほどよろしくお願いいたします。

出町 望様

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

サブテーブルのフィールドコードが間違っているということはありませんか?

var subTable = 'yaoya_subtable'; //サブテーブルのフィールドコード

の次の行に

console.log(event.record[subTable]);

を追加して、ブラウザのコンソール画面にどのように表示されるか確認していただけますか?

江田様

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

ご指摘の通り、サブテーブルのフィードコードに間違いがあり、

修正したところ理想通りに動作されました。

 

実は他社製品と競っているところでして…

おかげさまで課題解決に一歩近づくことが出来ましたm(__)m

継続してjava Scriptの勉強も続けていきたいと思います!

 

誠にありがとうございました!

 

 

 

 

江田様

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

 

ヘッダー箇所のコピーについてですが、

フィールドのタイプがルックアップだとコピー出来ません。

function () {
"use strict";
kintone.events.on([
'app.record.create.submit.success',
], function (event) {
var postApp = 134; //BアプリのID
var subTable = 'サブテーブル'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'yojitu_db',
'sakusei_db',
'sisetu_db',
'busyo_db',
'kenkyu_db',
'siharai_db',
'fb_db', //ここのフィールドがルックアップです。
'sonota_db',
'shiharai_db',
];

kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
app: postApp,
records: event.record[subTable].value.map(function (row) {
headers.forEach(function (header) {
row.value[header] = event.record[header];
});
return row.value;
})
});
});
})();

ルックアップの箇所の記述を削除すると正常動作します。

どういった原因が考えられますでしょうか。

 

ご教示のほど、よろしくお願いいたします。

 

ルックアップフィールドのコピーには下記の制限があります。

  • レコード登録、更新において、ルックアップフィールドの値を変更する場合、ルックアップフィールドの「コピー元のフィールド」はレコード番号または「値の重複を禁止する」に設定されている必要があります。

https://developer.cybozu.io/hc/ja/articles/201941754-kintone-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98#step12

ルックアップ元のフィールドの設定を確認されると良いかと思います。

吉田 様

 

ありがとうございます!

設定変更後無事コピーすることができました!

(_勉強__不足_で申し訳ございません…)

 

追加で質問させていただきます。

Aアプリで一度登録したレコードを更新したとして、

Bアプリにも更新情報を反映させることはJavaScriptで可能でしょうか。

可能でなければ、運用で乗り切ろうと思いますが、

できるのであれば更新も反映させたいと考えております。

 

お忙しいところ大変恐縮ですが、ご教示のほどよろしくお願いいたします。

出町 望様

お世話になっております.
cstapの江田と申します.

可能だと思います.

テーブルの行とレコードを結び付けるためのIDようなフィールドを用意すれば可能です.
フィールドに入れる値は,下記などを参考にユニークな文字列を生成して入れるとよいと思います.
https://qiita.com/coa00/items/679b0b5c7c468698d53f
また,Bアプリ側のフィールドを重複禁止にしておけば「updateKey」を使って簡単に更新できます.
https://developer.cybozu.io/hc/ja/articles/201941784

江田様

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

 

ご教示いただきありがとうございます!!参考URL確認しました!

始めたばかりなので難しく感じてしまいますが…(なんとなくですが理解できて来たような?気がしています…)

 

教えていただいた[レコード追加画面の保存成功後のイベント]に追記していくような形になるのでしょうか。

このイベントは別で記述したほうが良いのでしょうか。

app.record.create.submit.success','app.record.edit.submit.success

 

 

https://developer.cybozu.io/hc/ja/community/posts/360001317263-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B4%E6%96%B0%E6%99%82%E3%81%AB%E5%88%A5%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%82%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%84 

ちなみにこちらの内容も参考になりますか…??

 

 

出町 望様

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

処理速度やリクエスト数制限などを気にしないのであれば,「追加画面」と「編集画面」でコードはまとめてしまって問題ないかと思います。

ご提示された記事について。
更新には同じくPUTメソッドを用いることになるので、参考になるかと思います。
記事と同じようにAアプリのテーブル行にBアプリのレコードIDを保存して紐づけてもよいですし、上述したようにAアプリ・Bアプリ両方に紐づけ用のフィールドを用意してもよいと思います。

江田様

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

 

教えていただいた内容で、ひとまず

「ユニークな番号を生成してサブテーブル内の[ID]フィールドにデータを格納する」という動きを作ってみました!!

しかし、+ボタンで行を追加した時に2行目から[ID]フィールドに番号が格納されるのですが、

_レコード 追加 画面_の表示時のイベントで1行目に番号が格納されません。

 

 

kintone.events.on(['app.record.create.show','app.record.create.change.subtable'], function(event) {
//表示している詳細画面 レコード値取得
var record = event.record;

//ユニークな番号を生成する
//生成された番号を変数定義
function getUniqueStr(myStrong){
var strong = 1000;
if (myStrong) strong = myStrong;
return new Date().getTime().toString(16) + Math.floor(strong*Math.random()).toString(16)
}
var uuid = getUniqueStr()


//サブテーブルの「ID」フィールドにデータを格納する
var row = event.changes.row;
row.value['uniqueid'].value= uuid;

return event;

});

 

上記の記述になっています。

app.record.create.show

だけでは不足していますか??

 

ご教示のほどよろしくお願いいたします。

(js超初心者なので記述についてもご指摘いただければ幸いです…)

 

 

 

 

まったく同じようなことをしたいと思い、検索してたどり着いた超初心者です。

ユニーク番号を生成する方法はこちらのコードで実装できました。(ユニーク番号のフィールドコードがuidの場合)

(function() {
"use strict";
var events = [
'app.record.create.submit',
'app.record.edit.submit'
];


kintone.events.on(events, function(event) {
var record = event.record;

var count = record.Table.value.length;
for (var i = 0; i < count; i++) {

var uid_value = record.Table.value[i].value.uid.value ;
if (!uid_value ) {
record.Table.value[i].value.uid.value = new Date().getTime().toString(16) + Math.floor(1000*Math.random()).toString(16) ;
}
}

return event;
});
})();

 

Aアプリで一度登録したレコードを更新した際に、Bアプリにも更新情報を反映できておりません。

恐れ入りますが、もしサンプルとなる記述等あればご教示いただけないでしょうか。

江田様が書いていらっしゃる「updateKey」を使った方法がどういう記述で書けばよいでしょうか。

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