kintone.app.record.get(), kintone.app.record.set()でテーブルに行挿入すると行IDがずれる。

既出でしたらすみません。
kintone.app.record.get(), kintone.app.record.set()でテーブルに行挿入すると行IDがずれる挙動が見受けられましたが、これは仕様でしょうか?

例えばフィールドコード「文字列」というフィールドを一つだけ持つテーブル(フィールドコード: Table)があるとして、ヘッダメニューに置いたボタンをクリックするたびに、テーブルの先頭行に行が追加されるJavaScriptのサンプルコードを示します。

 

jQuery.noConflict();
(function($) {
  “use strict”;
  kintone.events.on([‘app.record.create.show’, ‘app.record.edit.show’], function(e) {
    var sElm = kintone.app.record.getHeaderMenuSpaceElement();
    $(sElm).append(
      $(‘<button id=“insertRowBtn”>’).text(‘行追加’)
    );
    $(‘#insertRowBtn’).on(‘click’, function() {
      insertRow();
    });
  });
  function insertRow() {
    var record = kintone.app.record.get();
     var rec = record.record;
    var table = rec[‘Table’][‘value’];
    table.forEach(function(row) {
      console.log(‘行追加前 rowId: ’ + row.id, ‘value: ’ + row.value[‘文字列’][‘value’]);
    });
    console.log(’----------------------’);
    table.unshift({
      ‘value’: {
        ‘文字列’: {
          ‘type’: ‘SINGLE_LINE_TEXT’,
          ‘value’: ‘’
        }
      }
    });
    table.forEach(function(row) {
      console.log(‘行追加後 rowId: ’ + row.id, ‘value: ’ + row.value[‘文字列’][‘value’]);
    });
    console.log(’----------------------’);
    kintone.app.record.set(record);
  }
})(jQuery);

 

文字列

2
1

という2行のテーブルを新規作成し保存します。編集画面で行追加ボタンをクリックした時のコンソールの出力結果例は以下となります。

★1回目のクリック
行追加前 rowId: 118313 value: 2
行追加前 rowId: 118314 value: 1

行追加後 rowId: undefined value:
行追加後 rowId: 118313 value: 2
行追加後 rowId: 118314 value: 1

※先頭行に空行が挿入されています。→先頭行に3を入力

★2回目のクリック
行追加前 rowId: 118313 value: 3
行追加前 rowId: 118314 value: 2
行追加前 rowId: null value: 1

行追加後 rowId: undefined value:
行追加後 rowId: 118313 value: 3
行追加後 rowId: 118314 value: 2
行追加後 rowId: null value: 1

※先頭に空行が挿入されていますが、1回目はrowId: 118314 のvalueが1だったのに、2回目ではrowId: 118314 のvalueは2となり、value: 1のrowIdはnullとなっています。一方、新規行に入力した3のrowIdは118313 が割り当てられてしまっいます。

これを3回、4回と繰り返しても同じ挙動で、kintone.app.record.set()で保存した後に、kintone.app.record.get()でテーブルを取得し直すと、元々割り振られていたrowIdは常に1行目と2行目に割り当てられてしまうような挙動となっているようで、IDの一貫性が保証されていない状態です。
保存済みだった行なのか、編集画面で新たに追加された行なのかをrowIdで判断したいケースがあるのですが、このような挙動だとうまくいきません。
このような挙動について、APIドキュメント等で見つけることができませんでしたので、もし掲載されているのであればご教示いただきたく思います。

 

既出ではないと思いますし、気になって手元で見てみた再現性ありそうに思います^^;

コンソールで見た感じ、unshift までは良さそうですが、次に取得するときに 既存の ID とセットした値がズレてる感じですね。

斎藤様

お世話になっております。cybozu developer network 運営局です。

ご回答遅くなり失礼いたしました。
仕様を確認したところ、ご確認いただいた挙動が正となります。

JavaScript API でテーブルの行を更新した場合、id を突合して上書きしているわけではなく、
テーブルに指定した配列の並び順で、既存のテーブルを上書きしています。
そのため、更新前の id と value の組み合わせと更新後の id と value の組み合わせの一致は担保されません。

よろしくお願いいたします。