あるアプリAから、別のアプリBへのレコードのコピー機能を構築しております。
アプリAの詳細画面にコピーボタンを設置して、これが押された際にアプリBに同じようなレコードを新規で追加します。
アプリAの任意のレコードを何度もコピーしてアプリBに同じようなレコードを追加できる仕様です。
アプリAには画像が添付されており、この添付ファイルもアプリBにコピー(POST)されます。
また、アプリAのデータを変更して保存すると、'app.record.edit.submit.success’イベントの処理として、変更内容をアプリBに更新(PUT)します。
アプリAでの更新に対応したデータがアプリBに複数存在する場合は、対象となるすべてのレコードを更新(複数レコードのPUT)します。
アプリAへの入力データが変更された際も、画像が入れ替わった際も、その変更内容をアプリBに反映させます。
以上のような仕様のjsを組んでおります。
しかし、アプリAからアプリBへのレコードの追加(POST)は添付ファイルも含めて問題なく動くのですが
アプリAからアプリBへのレコードの更新(PUT)がエラーとなってしまいます。
エラー内容は、
*************************************
{code: “GAIA_BL01”, id: “1505999166-1959799315”,…}
code
:
“GAIA_BL01”
id
:
“1505999166-1959799315”
message
:
“指定したファイル(id: 2f36433d-86d8-4933-8398-6e203547c32b)が見つかりません。”
*************************************
とあります。
添付ファイルの問題かと思い、試しにPUTの際のパラメータから、添付ファイルを指定する部分をコメントアウトするとエラーはなく添付ファイル以外の部分は正しく更新されます。
添付ファイルのダウンロード及びアップロードに関しては、promise を使って非同期の対応はしておりPOSTが成功していることから問題ないかと思うのですが、
何故POSTは問題なく添付ファイルをコピーできるのに、PUTだと添付ファイルの更新でエラーとなるのか、が解決できず、難儀しております。
何かアドバイスがありましたら、ご教示いただけると幸いです。
以下、ソースを添付いたします。
一番下にあるイベントから、POSTかPUTかのモードを渡して、一番上のUpdateOrderListにとびます。
ここで更新に必要なデータを集めて、
POSTの場合はPostProductToOrderList、PUTの場合はPutProductToOrderListにとんで、それぞれパラメータの作成とアプリBへの追加/更新をおこないます。
function PutProductToOrderListの中で、
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
の部分をコメントアウトしておりますが、このコメントアウトを外すとエラーが起きます。
PostProductToOrderListは同様の部分をコメントアウトしなくても、問題なくアプリBにデータが追加されます。
(function() {
“use strict”;
function UpdateOrderList( mode ) {
var CrrUser = kintone.getLoginUser();
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: BuyerMasterAppId,
query: ‘BuyerUser in ("’ + CrrUser.code + ‘")’
},
function(resp) {
BuyerRecords = resp.records;
LogOnBuyer = BuyerRecords[0];
return fileDownload(ImageFileKey).then(function(DLResp) {
var fileName = ProductInfo.record.ProductCode.value;
var contentType = ‘image/jpeg’;
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
var VPTags = ProductInfo.record.VPTagTable.value;
for (var i = 0; i < VPTags.length; i++) {
var VPTag = VPTags[i];
SubTable[i] = { “value”: {
VendorProductTag: { “value”: VPTag.value.VendorProductTag.value}
}};
}
if ( mode == ‘Post’) { PostProductToOrderList( ULResp ); }
if ( mode == ‘Put’) { PutProductToOrderList( ULResp ); }
});
});
}
);
}
function fileDownload(ImageFileKey) {
return new Promise(function(resolve, reject) {
var url = kintone.api.url(‘/k/v1/file’, true) + ‘?fileKey=’ + ImageFileKey;
var xhr = new XMLHttpRequest();
xhr.open(‘GET’, url);
xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
xhr.responseType = ‘blob’;
xhr.onload = function() {
if (xhr.status === 200) {
resolve(xhr.response);
} else {
reject(Error(‘File download error:’ + xhr.statusText));
}
};
xhr.onerror = function() {
reject(Error(‘There was a network error.’));
};
xhr.send();
});
}
function fileUpload(fileName, contentType, data) {
return new Promise(function(resolve, reject) {
var blob = new Blob([data], {type:contentType});
var formData = new FormData();
formData.append(“__REQUEST_TOKEN__”, kintone.getRequestToken());
formData.append(“file”, blob , fileName);
var url = kintone.api.url(‘/k/v1/file’, true); //Different .json?
var xhr = new XMLHttpRequest();
xhr.open(‘POST’, url);
xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
xhr.onload = function() {
if (xhr.status === 200) {
// successful
var results = JSON.parse(xhr.response);
resolve(results);
} else {
// fails
reject(Error(‘File upload error:’ + xhr.statusText));
}
};
xhr.onerror = function() {
reject(Error(‘There was a network error.’));
};
xhr.send(formData);
});
}
function PostProductToOrderList( ULResp ) {
var PostParms = {
“app”: CreateOrderApp,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer.BuyerCode.value }] },
“BuyerCode”: { “value”: LogOnBuyer.BuyerCode.value },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
kintone.api(
kintone.api.url(‘/k/v1/record’, true),
‘POST’,
PostParms,
function(resp) {
},
function(resp) {
}
);
}
function PutProductToOrderList( ULResp ) {
var PutParms = [];
var PutRec;
for (var i = 0; i < PutRecords.length; i++) {
PutRec = PutRecords[i];
PutParms[i] = {
id: PutRec[‘$id’].value,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer.BuyerCode.value }] },
“BuyerCode”: { “value”: LogOnBuyer.BuyerCode.value },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
// “ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
}
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘PUT’,
{
app: CreateOrderApp,
records: PutParms
},
function(resp) {
},
function(resp) {
}
);
}
// Start
// Gloval Variable
var CreateOrderApp = 21;
var BuyerMasterAppId = 2;
var PutRecords;
var BuyerRecords;
var LogOnBuyer;
var ProductInfo = [];
var SubTable = [];
var ImageFileKey;
// OK Let’s Go!
kintone.events.on(‘app.record.detail.show’, function(event) {
ProductInfo = event;
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
var SetProductButton = document.createElement(‘button’);
SetProductButton.id = ‘Set_Product_Button’;
SetProductButton.innerHTML = ‘Copy to Order List’;
SetProductButton.onclick = function () {
UpdateOrderList( ‘Post’);
window.alert(event.record.VendorName1.value + " の 『" + event.record.ProductName1.value + “』がオーダーリストに登録されました”);
}
kintone.app.record.getSpaceElement(‘Set_Product_Button’).appendChild(SetProductButton);
});
// kintone.events.on([‘app.record.edit.submit’, ‘app.record.index.edit.submit’], function(event) {
kintone.events.on(‘app.record.edit.submit.success’, function(event) {
ProductInfo = event;
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: CreateOrderApp,
query: ‘ProductRecNum = "’ + ProductInfo.record.$id.value + ‘"’
},
function(resp) {
PutRecords = resp.records;
UpdateOrderList( ‘Put’ );
}
);
});
})();