REST APIで取得したレコードに応じてレコードの項目内容を変えたい

お世話になっております。

下記イベントの際にREST APIで取得したレコードから取得したアプリとは別のアプリの項目を書き換えたいと思い、やってますが下記エラーが発生し、うまくいきません。

イベント:
app.record.edit.submit’,
‘app.record.create.submit’,
‘app.record.detail.show’,
‘app.record.edit.show’

エラー内容:
Uncaught Error: app.record.detail.show is not allowed to return “Thenable” object.

下記がソースになります。
(function() {
“use strict”;
var events = [
‘app.record.edit.submit’,
‘app.record.create.submit’,
‘app.record.detail.show’,
‘app.record.edit.show’
];
kintone.events.on(events, function(event) {
var record = event.record;
var partner_code = record[‘CODE’][‘value’];
var params = {app: 21, query: ‘CODE = "’ + partner_code + ‘"’, totalCount: true};
// REST API発行
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then(function(resp) {
// 獲得クライアント数の更新
// var update_rec = kintone.app.record.get();
// update_rec[‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
record[‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
// kintone.app.record.set(update_rec);
return event;
}, function(resp) {
event.error = ‘レコードの取得に失敗しました’;
kintone.app.record.set(record);
return event;
});
});
})();

下記などを参考にしましたが、うまく行かないのでご指摘頂ければ幸いです。
https://cybozudev.zendesk.com/hc/communities/public/questions/203229440-app-record-create-show%E3%81%A7%E3%81%AERest-API%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%85%A5%E5%8A%9B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

https://cybozudev.zendesk.com/hc/ja/articles/204564604-kintone-API-%E3%81%A7-Promise-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-

宜しくお願い致します。

鈴木祐介さん
cstapの瀧ヶ平です。

kintone.events.onのコールバック関数の返り値にはeventオブジェクト以外は設定できないため、kintone.apiメソッドをreturnするとエラーが発生してしまうためそのようなエラーが発生しているのかと思います。
(kintone.events.onのコールバック内でのreturnのタイミングではkintone.api内のコールバック関数は実行されず、kintone.apiオブジェクトをreturnしてもコールバック内でreturnしたオブジェクトは先のコールバックのreturnした値にはなりません)

そのため、kintone.apiのコールバック関数内でkintone.app.record.get()メソッドによってレコードを取得し、その値を変更し、kintone.app.record.set()メソッドによってレコードを更新する必要があります。

よって、先のコードを以下の様に修正すれば良いかと思います。

(function() {
  "use strict";
  var events = [
  'app.record.edit.submit',
  'app.record.create.submit',
  'app.record.detail.show',
  'app.record.edit.show'
  ];
  kintone.events.on(events, function(event) {
    var record = event.record;
    var partner_code = record['CODE']['value'];
    var params = {app: 21, query: 'CODE = "' + partner_code + '"', totalCount: true};
    // REST API発行
    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
      // 獲得クライアント数の更新
      var update_rec = kintone.app.record.get();
      update_rec.record['TOTAL_NUMBER']['value'] = resp.totalCount;
      kintone.app.record.set(update_rec);
      }, function(resp) {
        event.error = 'レコードの取得に失敗しました';
        kintone.app.record.set(record);
        return event;
    });

  });
})();

cstap
瀧ヶ平様

お世話になっております。
鈴木です。

ご回答いただきましたコードで確認取っておりましたが、エラーは出なくなりました。
しかし、未だにレコードの値が書き換わらず困っております。
もう少しご助力頂ければと思いますが、
下記のコードの通り実装しており、

(function() {
“use strict”;
var events = [
‘app.record.edit.submit’,
‘app.record.create.submit’,
‘app.record.detail.show’,
‘app.record.edit.show’
];
kintone.events.on(events, function(event) {
var record = event.record;
var partner_code = record[‘CODE’][‘value’];
var params = {app: 21, query: ‘CODE = "’ + partner_code + ‘"’, totalCount: true};
// REST API発行
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then(function(resp) {
// 獲得クライアント数の更新
var update_rec = kintone.app.record.get();
console.log(update_rec);
console.log(resp.totalCount);
update_rec[‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
console.log(‘b2’);
// record[‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
kintone.app.record.set(update_rec);
}, function(resp) {
// event.error = ‘レコードの取得に失敗しました’;
// kintone.app.record.set(record);
// return event;
});
});
})();

正常パターンのみ現在確認している最中ですが、上記の実装している場合に、consoleに"b2"という文字列が表示されず何かしらの理由でupdate_recに値を設定してるタイミングで落ちてる?っぽいです。
デバッグしてみても19行目から20行目に移らず、エラー内容等は特に出ていない為、原因も特定できない状態です。

ご確認頂ければと思います。
宜しくお願い致します。

鈴木祐介さん

こちらをみればわかるとおり、kintone.app.record.getの返り値は

{
  record:{<レコードの中身>}
}

というようになっているため、レコードのフィールドの値を参照するには update_rec.record[フィールドコード] の形でアクセスする必要があります。
そのためb2出力前に存在しないオブジェクトのプロパティを参照しようとしてプログラムが停止している様です。

なのでそちらを直してみてください

cstap
瀧ヶ平様

ご回答ありがとうございます!
ドキュメントの読み込みが足りておりませんでした。
ありがとうございます。

試したところ、"b2"が出力されるのは確認でき、設定するvalue値が書き換わっているのも確認出来ました。しかし、画面上の値はset()しても変わらない状況です。('app.record.detail.show’のタイミングでのみ今は確認しております)

// REST API発行
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then(function(resp) {
// 獲得クライアント数の更新
var update_rec = kintone.app.record.get();
update_rec[‘record’][‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
console.log(update_rec.record);
kintone.app.record.set(update_rec);
}, function(resp) {
// event.error = ‘レコードの取得に失敗しました’;
// kintone.app.record.set(record);
// return event;
// // event.error = ‘レコードの取得に失敗しました’;
// // kintone.app.record.set(record);
// // return event;
});

また、繰り返しになり恐縮ですが、ご教授下さい。

kintone.events.onのコールバック関数の返り値にはeventオブジェクト以外は設定できないため、kintone.apiメソッドをreturnするとエラーが発生してしまうためそのようなエラーが発生しているのかと思います。

との事だったのですが、https://cybozudev.zendesk.com/hc/ja/articles/204564604-kintone-API-%E3%81%A7-Promise-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-
上記のsample.jsを参考にしていたのですが、こちらはsampleが悪かったという事でよろしかったでしょうか?
kintone.api()内での処理に関しては瀧ヶ平様にご指摘頂きました通り、intone.app.record.get()/set()で行わないとエラーが出るという事でしたでしょうか?

重ね重ね恐縮ですが教えて頂ければ幸いです。
宜しくお願い致します。

申し訳ありません、少し質問を勘違いしていました。

そもそもapp.record.detail.showイベントではレコードの値を書き替えることはできません。また、Promiseに対応しているイベントも、レコードの登録前イベントやプロセスの完了時のイベントなどに限られます。

そのため、レコード詳細画面ではkintone.app.record.set()メソッドは利用できず、レコードを更新したければREST APIを用いて処理するしかありません。
見るところsubmit系のイベントではおそらく最初のコードのままでも問題なく動作するかと思います。

つまり、kintone.apiのthenのコールバック内でREST APIによってレコードを更新する処理を記述すればレコードの更新は可能です。

cstap
瀧ヶ平様

ご確認ありがとうございます。
submitとshowイベントで記述方法が間違っていたという事ですね!
分けなければいけないのに、全部同じ実装していたから誤っていたという事理解しました。ありがとうございます!

ご指摘頂いた通り、submitイベントでは
var record = event.record;
// 処理
record[‘TOTAL_NUMBER’][‘value’] = resp.totalCount;
return event;
とthen()の中で実装することで値の設定がうまく行きました!

何度もご回答頂き、ありがとうございます。
大変助かりました!