サブテーブルの値を取得し、他アプリのサブテーブルに取得した値を自動追加したい。

受注データアプリと明細データアプリがあります。

ボタンを押下

受注データアプリの採用者テーブルのルックアップフィールドである、採用者名の値をすべて取得します。

明細アプリに遷移し、取得した受注データのテーブル値を明細アプリのテーブルにセットする。

 

上記の処理を実現したいのですが、下記の処理がうまくできず困っています。

・値は取得できており、明細データのレコードに値がセットできていない。また、表示されない。

 

作成中のソースを下記に示します。

分かる方がいらっしゃいましたら、ご教授お願いします。

(function() {
“use strict”;
kintone.events.on([‘app.record.detail.show’,‘app.record.edit.show’], function(event) {
/*
受注データアプリ内処理
*/
//ボタンを設置
var mySpaceFieldButton = document.createElement(‘button’);
mySpaceFieldButton.id = ‘sample’;
mySpaceFieldButton.innerText = ‘サブテーブルを表示’;
//ボタン押下処理
mySpaceFieldButton.onclick = function () {

//サブテーブル取得 (行)
var tableRecords = event.record.採用者テーブル.value;
//格納配列定義
var leg = [];
//サブテーブル数ループ
for(var i=0;i<tableRecords.length;i++){

//ルックアップフィールドのみ取得しておく。
var saiyou = tableRecords[i].value[‘採用者名’].value

//配列に格納
leg[i] = [saiyou];

}

/*
明細データアプリ内処理(受注データから遷移後)
*/
//明細データ新規登録画面遷移
var _window = window.open(‘明細データのURL’,‘_blank’);

//loadイベントで元windowとposMessageを利用し読み込みタイミングを同期。同期タイミングで処理開始。
_window.addEventListener(“load”, function(){

window.postMessage(_window.kintone != null, location.origin);

});

window.addEventListener(“message”,function(e){

if(!(_window == null)){

var _kintone = _window.kintone;
//明細データフィールド取得
var _record = _kintone.app.record.get();

if(!(_record == null)){

//明細データ 採用者テーブル
var tableVal = _record.record.採用者テーブル.value;
//受注データ 採用者テーブル数ループ
for(i=0;i<tableRecords.length;i++){

//初期化
var subVal = “”;
var subLook = “”;

subVal = tableVal[i].value[‘採用者名’].value
subLook = tableVal[i].value[‘採用者名’].lookup

//値セット
subVal = leg[i];

//ルックアップon
subLook = true;

//サブテーブル行追加
//
var newRow = {
value:{
‘採用者名’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘採用者名’
},
‘役職’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘役職’
},
‘採用者住所1’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘採用者住所1’
},
‘採用者住所2’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘採用者住所2’
},
‘TEL’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘TEL’
},
‘郵便番号’:{
type: ‘SINGLE_LINE_TEXT’,
value: ‘郵便番号’
}
}
};
_record.record.採用者テーブル.value.push(newRow);
}
}
}
});
}
kintone.app.record.getSpaceElement(‘sample’).appendChild(mySpaceFieldButton);
});
})();

postMessage を使ったデータのやりとりはやったことが無いのですが、下記は参考になりますでしょうか?

別ウインドウの新規レコードに値を設定する方法について
https://developer.cybozu.io/hc/ja/community/posts/204757333

自己解決しました。

//loadイベントで元windowとposMessageを利用し読み込みタイミングを同期する際にサブテーブルのデータを

window.open前に配列に格納してしまうと、エラーになるのが原因でした。理由はわかりません。

wndow.open後に配列に格納すれば、問題なく処理できるみたいです。

 

下記に修正後の処理を記載します。

(function() {
“use strict”;
/*
kintoneイベント
■受注データレコード詳細画面表示イベント
■ボタン押下時処理
*/
kintone.events.on([‘app.record.detail.show’,‘app.record.edit.show’], function(event) {

//ボタンを設置
var mySpaceFieldButton = document.createElement(‘button’);
mySpaceFieldButton.id = ‘insert_button’;
mySpaceFieldButton.innerText = ‘この受注番号の受注明細を追加’;

//ボタン押下処理
mySpaceFieldButton.onclick = function () {

//表示している詳細画面 レコード値取得
var record = event.record;

var Id = record.受注番号.value; //受注番号

var Saiyoukou = record.採用校番号.value; //採用校番号

var tableRecords = event.record.採用者テーブル.value; //サブテーブル取得 (行)

//明細データ新規登録画面遷移
var _window = window.open(‘明細データ詳細画面のURL’,‘_blank’);

//loadイベントで元windowとposMessageを利用し読み込みタイミングを同期。
//同期タイミングで処理開始。
_window.addEventListener(“load”, function(){
window.postMessage(_window.kintone != null, location.origin);
});
window.addEventListener(“message”,function(e){

//window.open成功時
if(!(_window == null)){

//セット先取得
var _kintone = _window.kintone;
var _record = _kintone.app.record.get();
var tableVal = _record.record.採用者テーブル.value;

//配列格納変数
var leg = [];

//同期タイミング成功時
if(!(_record == null)){

//受注番号セット
_record[‘record’][‘受注番号’][‘value’] = Id;
_record[‘record’][‘受注番号’][‘lookup’] = true;
//採用者番号セット
_record[‘record’][‘採用校番号’][‘value’] = Saiyoukou;
_record[‘record’][‘採用校番号’][‘lookup’] = true;

//取得テーブル行数
for(var i=0;i<tableRecords.length;i++){

//テーブルデータ変数代入(window.open後でないとタイミングを逃す)
var SaiyousyaName = tableRecords[i].value[‘採用者名’].value

//採用者テーブル 行追加処理
var row = _record.record.採用者テーブル.value[i].value;
var newRow = {};
var fcodes = Object.keys(row);
fcodes.forEach(function(fcode) {
newRow[fcode] = {
type: row[fcode].type,
value: row[fcode].value
}
});
_record.record[‘採用者テーブル’].value.push({ value: newRow });

//採用者テーブルセット
tableVal[i].value[‘採用者名’].value = SaiyousyaName;
tableVal[i].value[‘採用者名’].lookup = true;

}

//_record値セット 画面反映
_kintone.app.record.set(_record);
}
}
});
}
kintone.app.record.getSpaceElement(‘insert_button’).appendChild(mySpaceFieldButton);
});
})();