お世話になります。
kintone Utirityを使って添付ファイルのダウンロードからアップロードまでをループで行いたいと思い、下記の様にコードを書いてみましたが、添付ファイル2つあるうちの1つしか反映されませんでした。
ご教示頂けましたら幸いです。
let attachFile = event.record.添付ファイル.value;
let result= [];
return new Promise(function(resolve,reject){
attachFile.forEach(function(value){
kintoneUtility.rest.downloadFile({
fileKey: value.fileKey,
isGuest: false
}).then(function(response){ //blob
kintoneUtility.rest.uploadFile({
fileName: value.name,
blob: new Blob([response], { type: value.contentType }),
isGuest: false
}).then(function(response){
resolve(result.push(response)); //fileKey
}).catch(function(error){
reject(error);
});
}).catch(function(error){
reject(error);
});
});
})
.then(function(resp){
let record = {
'app': kintone.app.getId(),
'id': event.recordId,
'record': {
'テーブル': {
'value': [{
'id': event.record.テーブル.value[0].id,
'value': {
'添付ファイル_0': { 'value': result }
}
}]
}
}
};
kintone.api(kintone.api.url('/k/v1/record',true),'PUT',record,function(resp){
console.log(resp);
}),function(error){
// error
console.log(error);
};
}).catch(function (error) {
reject(error);
});
Kazu さん
こんにちは。ひよこです。
ループの中で Promise を利用するときは、再帰的に呼び出しをしないとどんどん進んでしまいます。
なので、fileKey ひとつだけが result に入るので、再アップロードされるファイルはひとつになります。
コードきれいじゃないですが、こんな感じでどうでしょうか?
const attachFiles = function(files) {
const fileKeys = [];
const uploadFiles = function(_index) {
const index = _index || 0;
const file = files[index];
// kintone のレコードからファイルをダウンロードする
return kintoneUtility.rest.downloadFile({ fileKey: file.fileKey, isGuest: false }).then(function(resp) {
// ファイルをアップロードする
return kintoneUtility.rest.uploadFile({ fileName: file.name, blob: new Blob([resp], { type: file.contentType }), isGuest: false});
}).then(function(resp) {
// アップロードしたファイルキーを控えておく
fileKeys.push(resp);
if(files.length > index + 1) {
// まだファイルが有れば再帰呼び出しする
return uploadFiles(index+1);
}
return fileKeys;
}).catch(function(err) {
kintone.Promise.reject(err);
});
}
// fileKey をレコードに紐付ける
uploadFiles().then(function(resp) {
const record = {
'app': kintone.app.getId(),
'id': event.recordId,
'record': {
'テーブル': {
'value': [{
'id': event.record.テーブル.value[0].id,
'value': {'添付ファイル_0': { 'value': resp }}
}]
}
}
};
return kintone.api(kintone.api.url('/k/v1/record',true),'PUT', record);
}).then(function(resp) {
console.log(resp);
// location.reload();
}).catch(function(err) {
console.log(err);
});
}
// 実行
attachFiles(event.record.添付ファイル.value);
ちなみに kintone Utility Library for JavaScript はGitHubの方を見ると Deprecated になっていたので(今後メンテされない)
kintone JS SDK を使うほうが良いかもしれません。