添付ファイルフィールドの別アプリへのコピーについて

kintone REST APIにてAアプリの「キッチン写真」(添付ファイルフィールド)からBアプリの「キッチン写真先」(添付ファイルフィールド)へコピーしたいと考えております。

その際のupdatekeyを「ID」ではなく別のレコードキー(重複禁止・文字列フィールド)で更新したいと考えております。

以下コードを記載させていただきます。

(function () {

"use strict";

kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'], function (event) {
var event = event.record;
SyncExecute(event);
});
})();

function SyncExecute(record) {
var fileData = [];
for (key in record.キッチン写真.value[0]) {
fileData.push(record.キッチン写真.value[0][key]);
}

return fileDownload(fileData[0]).then(function (resp) {
fileUpload(fileData[1], fileData[2], resp);
});




function fileDownload(fileKey) {
return new Promise(function (resolve, reject) {
var url = kintone.api.url('/k/v1/file', true) + '?fileKey=' + fileKey;
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('ファイルダウンロードエラー :' + xhr.statusText));
}
};
xhr.onerror = function () {
reject(Error('ネットワークエラー'));
};
xhr.send();
});
}




function fileUpload(fileName, contentType, data) {

var blob = new Blob([data], {
type: contentType
});

var formData = new FormData();
formData.append(" __REQUEST_TOKEN__", kintone.getRequestToken());
formData.append("file", blob, fileName);
xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", encodeURI('/k/v1/file.json'), false);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xmlHttp.responseType = 'multipart/form-data';
xmlHttp.send(formData);
var key = JSON.parse(xmlHttp.responseText).fileKey;
var PutPara = {
"app": 74,
"updateKey": {
"field": "設備チェック番号",
"value": event.record[設備チェック番号][value]
},
"record": {
"キッチン写真先": {
"value": [{
"fileKey": key
}]
}
}
};


kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', PutPara, function (resp) {
// success
console.log('データの更新に成功しました');
}, function (error) {
// error
console.log('データの更新に失敗しました');
})
}
}

上記で試したところ「Uncaught (in promise) ReferenceError: 設備チェック番号 is not defined」というエラーが出ていまいます。

updatekeyでレコード取得は行えないのでしょうか。

お手数おかけいたしますがご教授の程宜しくお願いいたします。

 

>event.record[設備チェック番号][value]

この記述だと、フィールドコードではなく「設備チェック番号」という変数名を指定しています。

そのため、「設備チェック番号 is not defined」という「定義が無いよ」のエラーになっています。

rex0220様

ご回答いただきましてありがとうございます。

無事エラーが出なくなり反映されました。

別の質問になってしまうのですが、

「キッチン写真」(添付ファイルフィールド)に複数データがあった際に、

同じく「キッチン写真先」(添付ファイルフィールド)へコピーをしたいのですが

どのような方法があるかご教示いただけませんでしょうか。

お手数おかけいたしますが宜しくお願いいたします。

 

基本的には、ファイル数分ファイル処理を順番に行うか、パラレルで行うかになると思います。

・ファイルダウンロードとファイルアップロードを行う処理を再起呼び出しで、ファイル数分回す

ファイル数が多くなると、処理時間がかかりますが、kintone で扱うファイル数なら実用上問題ないと思います。

・ファイル数分ループし、await でファイルダウンロードとファイルアップロードを行う処理を順番に処理する

上記と同じですが、IE11 では使えません。

・ファイル数分ループし、ファイルダウンロードとファイルアップロードを行う処理を呼び出し、Promise.all で完了を待つ

ブラウザーによって REST API を同時に処理できる数が違いますが、Crome なら6個までパラレルで処理できます。
6個以上のリクエストは、待たされます。
1画面で6個のREST API を占有してしまうので、処理中に他のタブで見る画面処理にも影響が出ます。

・パラレル処理数分(5くらい)ループし、ファイルダウンロードとファイルアップロードを行う処理を再起処理で、全ファイル終了まで回す

他のタブで見る画面にあまり影響が出ないように、上記のパラレル処理を制限します。

rex0220

返事が遅くなってしまい申し訳ございません。

ご教授いただきましてありがとうございます。

別の方法で行なえました。

ありがとうございました。