kintone APIのPUTでのエラー原因がつかめない

kintone JSカスタマイズ初心者でREST APIのPUTを使おうとしてエラーが出ていて原因が分からないのでご教授いただければ幸いでございます。

テストアプリにて一覧表示が終わった後に、表示されたemployee_nameという文字列1行のフィールドの値をREST APIのGETを用いて表示されているレコードの内容をPUT用パラメーターのPut_bodyに格納し、別のtestフィールドの値に反映(更新)させるという動作を実現させたいのですが、エラーが出ます。

consoleで表示されるエラーは以下の通りです。

GETは成功しており、PUT用のパラメータにも更新すべき値が反映されているのが確認できましたが、kintone.apiのPUT部分での処理がエラーにより止まっているという状況です。

ここからの打ち手が調べても出てこない(調べ方が悪いとは感じております:sweat_drops:)ので、改善するべき箇所をご指摘頂けると幸いでございます。

 

(function() {
‘use strict’;

//レコード追加・編集時・一覧表示における編集不可設定処理
function formedit(event){

var record = event.record;

//レコード編集不可設定
record.employee_age.disabled = true;

return event;

}

//レコード一覧が表示された時に自動計算する
function formindex(event){

//レコード取得用のリクエストパラメータ
var Get_body = {
“app”:kintone.app.getId(),
};

//レコード更新用のリクエストパラメータ
var Put_body = {
“app”:kintone.app.getId(),
“records”:[]
};

//表示されているレコードを取得
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, Get_body, function(get_resp) {

var put_records = [];

// success
for(var i = 0; i < get_resp.records.length; i++){

put_records[i] = get_resp.records[i].employee_name.value;

Put_body.records[i] = {
“id”:get_resp.records[i].$id.value,
“record”:{
“test”:{
“value”:put_records[i]
}
}
}

}

console.log(Put_body.records);

return kintone.api(kintone.api.url(‘k/v1/records’,true),‘PUT’,Put_body,function(put_resp){

//put success
console.log(‘put成功’);

},function(put_error){

//put Error
console.log(‘put失敗’);
});

},function(get_error){

//get Error
console.log(‘get失敗’);
});

}

kintone.events.on([‘app.record.create.show’, //PCブラウザにてレコート追加画面が表示されたとき
‘mobile.app.record.create.show’, //スマホ表示にてレコード追加画面が表示されたとき
‘app.record.index.edit.show’, //PCブラウザにて一覧画面でレコード編集画面が表示されたとき
‘app.record.edit.show’, //PCブラウザにて詳細画面でレコード編集画面が表示されたとき
‘mobile.app.record.edit.show’],
formedit
);

kintone.events.on([‘app.record.index.show’],
formindex
);

})();

プログラム貼り付けが上手くいかず見づらくて申し訳ありません

吉原さん

PUTの
kintone.api.url(‘k/v1/records’,true)
の引数の先頭に /(スラッシュ)が入っていないためではないかと思われます。

× kintone.api.url(‘k/v1/records’,true)
○ kintone.api.url(‘/k/v1/records’,true)

いかがでしょうか?

斎藤さん

お忙しい中ご指摘ありがとうございます!
/ を挿入したら動作しました! レコード変更後の一覧表示だと反映されてなく、再読み込みをすると反映されるという具合でしたがこれが正解なのか?という感じです:sweat_drops:

もしわかればで大丈夫ですのでご教授いただけると幸いでございます。(何度もすみません)

> レコード変更後の一覧表示だと反映されてなく、再読み込みをすると反映されるという具合でしたがこれが正解なのか?

レコード変更後というのは一覧画面での変更でしょうか?編集画面での変更でしょうか?
一覧画面での変更直後だと、'app.record.index.show’は発生しないので更新処理は動かないのではないでしょうか?
もう少し具体的な流れを記載いただくと、より良い回答を案内できると思いますよ。

斎藤さんお忙しいところご指摘ありがとうございます。

実現したい内容は

という現象が起きている中で、レコード詳細画面でレコードを編集した後にレコード一覧画面を表示した際にPUTされるべき値が反映されていてほしいということです。どうしても再読み込みをしないと反映されていないのはプログラム的に改善点があればご教授いただければ嬉しいです。質問ばかりで恐縮でございます。

吉原さん

状況がわかりました。
プログラムを見ると、一覧表示時にしか formindex が呼び出されていないのではないかと思います。
ですので、詳細編集画面で変更して保存した段階では値は書き換わっていません。
一覧画面に遷移したタイミングで初めて formindex が呼び出されて値が更新されますが、一覧画面は更新前の状態で表示されますので、一旦古い内容が表示されていることになります。
そこで改めて再読み込みを行うと、変更内容が反映されているという流れです。

  • レコード追加画面の保存実行前イベント
  • レコード編集画面の保存実行前イベント

のタイミングで formindex が実行されると良いのではないでしょうか?

齋藤さんありがとうございます。

ご指摘いただいた通りのイベントでPUTをする関数を記載したのですが、PUTが失敗してしまいます。

(function() {
‘use strict’;

/////////////////////////////////////////////
//レコード一覧が表示された時に自動計算する
function formindex(event){

//レコード取得用のリクエストパラメータ
var Get_body = {
“app”:kintone.app.getId(),
};

//レコード更新用のリクエストパラメータ
var Put_body = {
“app”:kintone.app.getId(),
“records”:[]
};

//表示されているレコードを取得
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, Get_body, function(get_resp) {

var put_records = [];

// success
for(var i = 0; i < get_resp.records.length; i++){
//console.log(resp.records[i].employee_name.value);
put_records[i] = get_resp.records[i].employee_name.value;
//console.log(put_records[i]+resp.records[i].$id.value);

Put_body.records[i] = {
“id”:get_resp.records[i].$id.value,
“record”:{
“test”:{
“value”:put_records[i]
},
“employee_age”:{
“value”:Math.random()*10
}
}
}

}

console.log(Put_body.records);

return kintone.api(kintone.api.url(‘/k/v1/records’,true),‘PUT’,Put_body,function(put_resp){

//put success
console.log(‘put成功’);

},function(put_error){

//put Error
console.log(‘put失敗’);
});

},function(get_error){

//get Error
console.log(‘get失敗’);
});

}

///////////////////////////////////////////////////
//レコード追加保存前・編集保存前に自動計算する
function beforesaving(event){

var record = event.record;

//レコード取得用のリクエストパラメータ
var Get_body = {
“app”:kintone.app.getId(),
“id”:kintone.app.record.getId()
};

//レコード更新用のリクエストパラメータ
var Put_body = {
“app”:kintone.app.getId(),
“id”:kintone.app.record.getId(),
“records”:[]
};

//表示されているレコードの取得
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, Get_body, function(get_resp){

Put_body = {
“app”:kintone.app.getId(),
“id”:kintone.app.record.getId(),
“record”:{
“test”:{
“value”:record.employee_name.value
},
}
};

return kintone.api(kintone.api.url(‘/k/v1/records’,true),‘PUT’,Put_body,function(put_resp){

//put success
console.log(‘put成功’);
},function(put_error){

//put Error
console.log(put_error);
});

},function(get_error){

//get Error
console.log(‘get失敗’);
});

}

kintone.events.on([‘app.record.index.show’],
formindex
);

kintone.events.on([‘app.record.edit.submit’,
‘app.record.crate.submit’],
beforesaving
);

})();

beforesavingという関数なのですが、エラーメッセージをconsole.logすると以下のようなものが表示されました。

リクエストbodyが違うのか、原因がつかめないのですが、もしここから読み解ければご教授いただけないでしょうか?(何度も申し訳ありません)

吉原さん

添付のコンソール画像のerrorsの中を見ると詳細なエラーメッセージがわかりますのでご確認ください。
尚、beforesaving の更新は1レコードのみかと思いますので、

kintone.api.url(‘/k/v1/records’,true)
ではなく
kintone.api.url(‘/k/v1/record’,true)

が正しいURLになります。
恐らくこれに起因したエラーが発生しているのだと思います。

ちなみに、そもそも
‘app.record.edit.submit’, ‘app.record.crate.submit’
のタイミングで、REST APIで自レコードの更新をするのはおかしいです。
crate.submitではまだレコードが保存されていませんし、
更新できたとしても、その後に本来の画面からの保存処理が走りますので。

この場合は、REST APIを使うのではなく、

kintone.events.on([‘app.record.edit.submit’, ‘app.record.crate.submit’], function(event) {
  event.record[‘test’][‘value’] = event.record.employee_name.value
  return event;
});

のように、eventオブジェクトでフィールドの値を書き換える処理のみで良いと思います。

斎藤さん

ご指摘ありがとうございます。

>kintone.api.url(‘/k/v1/records’,true)
>ではなく
>kintone.api.url(‘/k/v1/record’,true)

この部分はすごく学びになりました!表記に注意したいと思います。

またご教授いただいたeventオブジェクトでのフィールドの書き換えでやってみたら、確かにこっちの方がシンプルすぎる記述となったので、REST APIも使いどころという感じの学びを得ることができました。

function beforesaving(event){
      
      var record = event.record;
      
      record.test.value = record.employee_name.value;
      
      return record;

}

 

ですんなりと動作しました!

 

手厚くご教授いただいた斎藤さんに感謝申し上げます。本当にありがとうございました!

 

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。