アプリ間で添付ファイルの Post はできるけど Put ができない

あるアプリ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’ );
            }
        );
  });

})();

tamakey さん

いくつか問題があります。

・ファイルアップロードしたfileKey は、1レコードのみ登録できます。
2レコード目の更新で、「指定したファイルが見つかりません」というエラーになると思います。
更新対象レコード数分のファイルアップロード処理が必要です。

・edit.submit.success イベント処理で、処理終了後にPromiseオブジェクト(event) を返していません。
kintone.Promiseの書き方・使い方~超入門編~ にあるやりがちな失敗パターンに当てはまります。

・(ファイルが更新されていなくても、ファイル更新処理が実行される)
これは実行してもエラーにはなりませんが、無駄な更新処理ということで。

 

rex0220様、
いつもありがとうございます。

>ファイルアップロードしたfileKey は、1レコードのみ登録できます。
それを理解しておりませんでした。

>Promiseオブジェクト(event) を返していません。
またもや非同期の対応を誤っているようです。

>ファイルが更新されていなくても、ファイル更新処理が実行される
ご指摘の通りです。
実はまだ作り途中で、そもそもファイルの添付は必須でないのに、ファイルが添付されていない状態で更新すると、それこそファイルキーがなくてエラーとなるかと思います。
最終的にはここも見直さなくてはなりません。

早速ご指摘いただいた点、見直してみます。
結果はまたこの場で共有いたします。

まずはお礼まで。

ソースを修正しました。
何だかおかしなことになってしまいました。

アプリAで添付ファイル以外のデータを修正する
⇒アプリBの複数レコードに正しく反映される

アプリAで添付ファイルを入れ替える
⇒アプリBで反映されない
それでも諦めずに、もう一度アプリAを変更モードにして何もせずに保存ボタンを押す
⇒アプリBの複数レコードに変更後の添付ファイルが正しく反映される

という状態です。
添付ファイルを変更して保存ボタンを押した後に、その内容がDBに反映される前に処理が走ってしまっているような感じがします。
苦し紛れに、保存ボタンを押した後に詳細画面が再表示される際のイベントでファイルのダウンロードとアップロード及びPUTをしてみましたが、
それでも一度目では反映されずに、二度目に変更モードから(なんも変更しないで)保存ボタンを押した際にやっとアプリBに画像が反映されます。

またおかしなことをしているかと思うのですが、何かアドバイスがありましたらご教示いただけると幸いです。

以下、修正したソースです。
ソースン最後に、Promiseで実行する順番をコントロールしたつもりなのですが、
ご指摘いただいた、『やりがちな失敗パターン』にあるような
ファイルのダウンロードの処理よりも先に
kintone.events.on(‘app.record.edit.submit.success’, function(event) {
の処理が終わってしまっている
ということでしょうか

(function() {
“use strict”;

function GetBuyerCode(){
return new Promise(function(resolve) {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: BuyerMasterAppId,
query: ‘BuyerUser in ("’ + CrrUser.code + ‘")’
},
function(resp) {
resolve(resp.records[0].BuyerCode.value);
}
);
});
}

function GetPutRecords(){
return new Promise(function(resolve) {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: CreateOrderApp,
query: ‘ProductRecNum = "’ + ProductInfo.record.$id.value + ‘"’
},
function(resp) {
resolve(resp.records);
}
);
});
}

function GenerateVPTag() {
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}
}};
}
}

function GeneratePostParms() {
if ( ProductInfo.record.ProductImage.value.length !== 0 ) {
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
return fileDownload(ImageFileKey).then(function(DLResp) {
var fileName = ProductInfo.record.ProductCode.value;
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
PostParm = {
“app”: CreateOrderApp,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
PostProductToOrderList();
});
});
} else {
PostParm = {
“app”: CreateOrderApp,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“VPTagTable”: { “value”: SubTable }
}
}
PostProductToOrderList();
}
}

function PostProductToOrderList() {
kintone.api(
kintone.api.url(‘/k/v1/record’, true),
‘POST’,
PostParm,
function(resp) {
window.alert(ProductInfo.record.VendorName1.value + " の 『" + ProductInfo.record.ProductName1.value + “』がオーダーリストに登録されました”);
},
function(resp) {
}
);
}

function GeneratePutParms() {
return new Promise(function(resolve) {
if ( ProductInfo.record.ProductImage.value.length !== 0 ) {
GeneratePutParmsFile(0);
} else {
for (var i = 0; i < PutRecords.length; i++) {
var PutRec = PutRecords[i];
Parms[i] = {
id: PutRec[‘$id’].value,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“VPTagTable”: { “value”: SubTable }
}
}
}
}
resolve(Parms);
});
}

function GeneratePutParmsFile(i) {
var PutRec = PutRecords[i];
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
return fileDownload(ImageFileKey).then(function(DLResp) {
var fileName = ProductInfo.record.ProductCode.value;
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
Parms[i] = {
id: PutRec[‘$id’].value,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
i = i + 1;
if (PutRecords.length > i) {
GeneratePutParmsFile(i);
} else {
return true;
}
});
});
}

function PutProductToOrderList() {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘PUT’,
{
app: CreateOrderApp,
records: PutParms
},
function(resp) {
window.alert(“オーダーリストを更新しました”);
},
function(resp) {
}
);
}

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);
});
}

// Start
// Gloval Variable
var CreateOrderApp = 21;
var BuyerMasterAppId = 2;
var CrrUser = kintone.getLoginUser();
var PutRecords;
var PostParm = [];
var PutParms = [];
var BuyerRecords;
var LogOnBuyer;
var ProductInfo = [];
var SubTable = [];
var ImageFileKey;
var contentType = ‘image/jpeg’;
var VPTags = [];
var Parms = [];

// OK Let’s Go!
kintone.events.on(‘app.record.detail.show’, function(event) {
ProductInfo = event;
GenerateVPTag();
var SetProductButton = document.createElement(‘button’);
SetProductButton.id = ‘Set_Product_Button’;
SetProductButton.innerHTML = ‘Copy to Order List’;
SetProductButton.onclick = function () {
GetBuyerCode().then(function(resp) {
LogOnBuyer = resp;
GeneratePostParms();
});
}
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;
GenerateVPTag();
GetBuyerCode().then(function(resp) { //Promise all でパラレル化
LogOnBuyer = resp;
GetPutRecords().then(function(resp) { //Promise all でパラレル化
PutRecords = resp;
GeneratePutParms().then(function(resp) {
PutParms = resp;
var OrderListTbody = document.getElementById(‘OrderListTbody’);
PutProductToOrderList();
sessionStorage.ProcStatus = ‘Display’;
});
});
});
});

})();

 

 

結果的に、Promiseオブジェクト(event) を返していません。
ネストが深いので、then でつないだほうが、分かりやすいと思います。

kintone.events.on('app.record.edit.submit.success', function(event) {
ProductInfo = event;
GenerateVPTag();
return GetBuyerCode().then(function(resp) {
LogOnBuyer = resp;
return GetPutRecords();
}).then(function(resp) {
PutRecords = resp;
return GeneratePutParms();
}).then(function(resp) {
PutParms = resp;
var OrderListTbody = document.getElementById('OrderListTbody');
return PutProductToOrderList();
}).then(function(resp) {
sessionStorage.ProcStatus = 'Display';
return event;
}).catch(function(error) {
return event;
});
});

PutProductToOrderList は、put API だけなので、わざわざ関数にしなくてもいいと思いますが、
関数の場合は、return 情報を返しましょう。

GeneratePutParms の GeneratePutParmsFile(0);が完了する前に、resolve(Parms);が実行されます。

GeneratePutParmsFile の fileDownload が、対象レコード数回 実行されていますが。
fileDownload を1回のみで、 fileUpload を対象レコード数回 実行したほうがいいと思います。

 

いつもありがとうございます!

頂いたソースで試してみましたが、やはり1度目の更新では反映されず、2度目の更新で反映されます。
https://cybozudev.zendesk.com/hc/ja/articles/202166270-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E7%B7%A8%E9%9B%86%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88#success 

こちらにある
”書き換えできないフィールド"
というのに添付ファイルが含まれていますが、これが理由ということ?でしょうか。
ちなみにデバッグすると、
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
を実行する前にPUTを実行した際のメッセージ
“オーダーリストを更新しました”
が表示されます。

また、ファイルダウンロードの件、ご指摘いただきありがとうございます。
やはりダウンロードは一度でいいのですね。
勉強になります。
この不具合が解消されたら、修正しようと思います。

毎度大変恐縮ですが、なにかお気づきの点がありましたら、ご教示いただけると幸いです。
一応、ソースは以下の通りです。
本当にお付き合いいただいてしまい、恐縮です。

(function() {
“use strict”;

function GetBuyerCode(){
return new Promise(function(resolve) {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: BuyerMasterAppId,
query: ‘BuyerUser in ("’ + CrrUser.code + ‘")’
},
function(resp) {
resolve(resp.records[0].BuyerCode.value);
}
);
});
}

function GetPutRecords(){
return new Promise(function(resolve) {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘GET’, {
app: CreateOrderApp,
query: ‘ProductRecNum = "’ + ProductInfo.record.$id.value + ‘"’
},
function(resp) {
resolve(resp.records);
}
);
});
}

function GenerateVPTag() {
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}
}};
}
}

function GeneratePostParms() {
if ( ProductInfo.record.ProductImage.value.length !== 0 ) {
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
return fileDownload(ImageFileKey).then(function(DLResp) {
var fileName = ProductInfo.record.ProductCode.value;
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
PostParm = {
“app”: CreateOrderApp,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
PostProductToOrderList();
});
});
} else {
PostParm = {
“app”: CreateOrderApp,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“VPTagTable”: { “value”: SubTable }
}
}
PostProductToOrderList();
}
}

function PostProductToOrderList() {
kintone.api(
kintone.api.url(‘/k/v1/record’, true),
‘POST’,
PostParm,
function(resp) {
window.alert(ProductInfo.record.VendorName1.value + " の 『" + ProductInfo.record.ProductName1.value + “』がオーダーリストに登録されました”);
},
function(resp) {
}
);
}

function GeneratePutParms() {
return new Promise(function(resolve) {
if ( ProductInfo.record.ProductImage.value.length !== 0 ) {
GeneratePutParmsFile(0);
} else {
for (var i = 0; i < PutRecords.length; i++) {
var PutRec = PutRecords[i];
Parms[i] = {
id: PutRec[‘$id’].value,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“VPTagTable”: { “value”: SubTable }
}
}
}
}
window.alert(“GeneratePutParmsの最後”);
resolve(Parms);
});
}

function GeneratePutParmsFile(i) {
var PutRec = PutRecords[i];
ImageFileKey = ProductInfo.record.ProductImage.value[0].fileKey;
return fileDownload(ImageFileKey).then(function(DLResp) {
var fileName = ProductInfo.record.ProductCode.value;
return fileUpload(fileName, contentType, DLResp).then(function(ULResp){
Parms[i] = {
id: PutRec[‘$id’].value,
“record”: {
“BueyrOrganization”: { “value”: [{“code”: LogOnBuyer }] },
“BuyerCode”: { “value”: LogOnBuyer },
“ProductRecNum”: { “value”: ProductInfo.record.$id.value },
“ProductImage”: {“value”: [{ “fileKey”: ULResp.fileKey }]},
“VPTagTable”: { “value”: SubTable }
}
}
i = i + 1;
if (PutRecords.length > i) {
GeneratePutParmsFile(i);
} else {
return event;
}
});
});
}

function PutProductToOrderList() {
kintone.api(
kintone.api.url(‘/k/v1/records’, true),
‘PUT’,
{
app: CreateOrderApp,
records: PutParms
},
function(resp) {
window.alert(“オーダーリストを更新しました”);
},
function(resp) {
}
);
}

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);
});
}

// Start
// Gloval Variable
var CreateOrderApp = 21;
var BuyerMasterAppId = 2;
var CrrUser = kintone.getLoginUser();
var PutRecords;
var PostParm = [];
var PutParms = [];
var BuyerRecords;
var LogOnBuyer;
var ProductInfo = [];
var SubTable = [];
var ImageFileKey;
var contentType = ‘image/jpeg’;
var VPTags = [];
var Parms = [];

// OK Let’s Go!
kintone.events.on(‘app.record.detail.show’, function(event) {
ProductInfo = event;
GenerateVPTag();
var SetProductButton = document.createElement(‘button’);
SetProductButton.id = ‘Set_Product_Button’;
SetProductButton.innerHTML = ‘Copy to Order List’;
SetProductButton.onclick = function () {
GetBuyerCode().then(function(resp) {
LogOnBuyer = resp;
GeneratePostParms();
});
}
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;
GenerateVPTag();
return GetBuyerCode().then(function(resp) {
LogOnBuyer = resp;
return GetPutRecords();
}).then(function(resp) {
PutRecords = resp;
return GeneratePutParms();
}).then(function(resp) {
PutParms = resp;
window.alert(“Putの直前”);
return PutProductToOrderList();
}).then(function(resp) {
return event;
}).catch(function(error) {
return event;
});
});

})();

下記が対応されていないようです。

>PutProductToOrderList は、put API だけなので、わざわざ関数にしなくてもいいと思いますが、
>関数の場合は、return 情報を返しましょう。

>GeneratePutParms の GeneratePutParmsFile(0);が完了する前に、resolve(Parms);が実行されます。

>”書き換えできないフィールド"

これはイベント処理内で、event.record を変更する場合の話ですので、API処理とは無関係です。