別アプリから値を取得してテーブルにセットしたい

いつもお世話になっております。

別アプリのフィールド「UID」の最大値を取得して、

テーブルのフィールド「UID」に最大値+1した連番をセットしたいです。

次のコードでUIDの最大値取得まではできたのですが、画面のテーブル上に値がセットされません。

return event前のログをgoogle検証画面でみると、値は入っているのですが、画面上に登録ができない状況です。

なにか解決策あればご教示いただけますと幸いです。

(function() {
    "use strict";
    var events = [
        'app.record.create.submit',
        'app.record.edit.submit'
    ];

    kintone.events.on(events, function(event) {
        let newUID;
        var params = {
            'app': 51,
            'query': 'order by UID desc limit 1'
        };

        
        kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
          newUID=resp.records[0].UID.value
          
          var record = event.record;
          var count = record.テーブル.value.length;
          for (var i = 0; i < count; i++) {
              record.テーブル.value[i].value.UID.value = Number(newUID) + 1;

          }

          return event;
        });
    console.log(event.record);
      return event;
        
    });    
})();

 

下記が参考になると思います。

kintoneにおけるPromiseの書き方の基本

フィールドの値を書き換える

※ハンドラーが record オブジェクトのフィールドの値を書き換えて event オブジェクトを return した場合、その値でフィールドの値を更新します。

レコード追加画面の保存成功後イベント

※kintone.Promiseオブジェクトをreturnすると、非同期処理の完了を待って次の処理を開始します。

上記から

「return kintone.api(…」とすると、kintone.Promiseオブジェクト(event)を return します。

「console.log(event.record);      return event;」の部分は、不要なステートメントです。

あと気になる点

「newUID=resp.records[0].UID.value」取得レコードが0件の場合にエラーになります。

rex0220様

ありがとうございます。

promiseの書き方を参考にしてコード修正しましたが、結果変わらず、そのほかはどのようにして適用したらいいかわからず行き詰っております。

サンプルコードなど記載いただくことは難しいでしょうか。何卒宜しくお願い致します。

(function() {
    "use strict";
    var events = [
        'app.record.create.show',
        'app.record.edit.submit'
    ];

    kintone.events.on(events, function(event) {
        let newUID;
        var params = {
            'app': 51,
            'query': 'order by UID desc limit 1'
        };
        return new kintone.Promise(function(resolve, reject) {
            kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
                newUID=resp.records[0].UID.value;
                console.log(newUID);
                // テーブルのUID欄を自動採番する
                var count = event.record.テーブル.value.length;
                for (var i = 0; i < count; i++) {
                    event.record.テーブル.value[i].value.UID.value = newUID + 1;
                }
                resolve(event);
            }, function() {
                resolve(event);
            });
        });

    });    
})();

少し promise の難しい書き方になっていますが、promise の使い方はよさそうです。

別の部分でエラーが発生しているはずなので、デバッグしてみましょう。

動かない?そんな時はデバッグをしてみよう!入門編

エラー内容を確認してみてください。

 

エラーになりそうな部分

・‘order by UID desc limit 1’

UID は、テーブル内項目でしょうか?テーブル内項目をソートに指定できません。

UID がテーブル外の項目なら、テーブル内のフィールドコードが誤り?

 

・newUID=resp.records[0].UID.value;

UID は、テーブル内項目なら、テーブルの行位置を指定する添え字が必要

取得レコードが無い場合の判定が必要

数値として、扱うのなら数値に変換が必要。(数値項目でも文字列で設定されています)

rex0220様

 

ありがとうございます。

 

・‘order by UID desc limit 1’

UID は、テーブル内項目でしょうか?

→テーブル外項目です。フィールドコードは間違いなく「UID」で設定しております。

 

・newUID=resp.records[0].UID.value;

取得レコードが無い場合の判定が必要

→こちらは値を取得出来ているのでいったん置いておきます。

 

エラーはなく、レコード自体は登録できています。

newUID=resp.records[0].UID.value;の値は取得出来ており、

event.record.テーブル.value[i].value.UID.valueへも値が入っているようなのですが、レコードにUIDの値が反映されない状況です。

UIDの値を反映させるにはどのように修正を加えたらよろしいでしょうか?

 

以下はconsole.log(newUID)とconsole.log(event.record)の結果です。

 

下記のUIDに登録されません。

 

 

>→テーブル外項目です。フィールドコードは間違いなく「UID」で設定しております。

console.log には、テーブル外項目に「UID」が無く、テーブル内項目に「UID」が表示されています。

「TUID」の誤りでしょうか?

rex0220様

TUIDは使用していないので無視していただいて構いません。

・‘order by UID desc limit 1’

こちらは別アプリのUIDで、テーブル外のフィールドです。

 

>console.log には、テーブル外項目に「UID」が無く、テーブル内項目に「UID」が表示されています。

→console.log(event.record)にあるUIDはテーブル内にあるフィールドです。

event.record.テーブル.value[i].value.UID.value = Number(newUID) + 1;

newUIDに別アプリのUIDをセットし上記で当アプリのテーブル内UIDに値をセットするよう定義しております。

説明下手で申し訳ありません。

こちらで回答になるでしょうか。

 

すみません、勘違いをしていました。

問題ないとすると、他の影響が考えられます。

現象を確認させてください。

>エラーはなく、レコード自体は登録できています。
newUID=resp.records[0].UID.value;の値は取得出来ており、
event.record.テーブル.value[i].value.UID.valueへも値が入っているようなのですが、レコードにUIDの値が反映されない状況です。

これは、「‘app.record.create.show’,」それとも「‘app.record.edit.submit’」でしょうか?

他には、JavaScript カスタマイズ、プラグインは、利用していますか?

後続のJavaScript カスタマイズ、プラグインで「‘app.record.create.show’,」または「‘app.record.edit.submit’」の処理で

イベント終了時に「return;」 とすると、他のイベントで recode を変更していても反映されません。

>これは、「‘app.record.create.show’,」それとも「‘app.record.edit.submit’」でしょうか?

「app.record.edit.submit」です。

後続のJavaScript カスタマイズ、プラグインで「‘app.record.create.show’,」または「‘app.record.edit.submit’」の処理で

イベント終了時に「return;」 とすると、他のイベントで recode を変更していても反映されません。

そうなのですね。他JSカスタマイズ、プラグイン利用しておりましたので、無効にして再度実行してみましたが結果は同じでした。

それ以外何か考えられる原因あるでしょうか。

こちらで簡単なアプリ(JS で利用している項目のみ)で、先のJS の実行をしてみましたが、問題なくレコードに反映されました。

試しに nakano さんも別アプリを作って動作確認してみてください。

それでも動作しないのか?動作するのか確認して違いを調べましょう

 

ありがとうございます。新しく環境作って確認してみたいと思います。

いろいろと解説いただき大変勉強になりました。

また躓いたらご相談させてください。