0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintoneのテーブルで前行の値をコピーする前に|配列とユーザー選択を壊さないJavaScript

0
Posted at

kintacoです。自社のテーブル値計算プラグインのcopyValueを題材に、「前の行のvalueを、そのまま次の行へ代入する」ときの注意点を解説します。

この記事は、コピーする値を作る純粋関数です。kintoneのフィールド変更イベントには接続せず、レコードの保存も行いません。製品版の追加行検出・再計算順・循環参照チェックは含みません。

文字列、選択肢、ユーザーでは値構造が違う

文字列は文字列ですが、チェックボックスは配列、ユーザー選択はcodeを持つオブジェクトの配列です。配列を同じ参照のまま渡すと、次の行を変えたつもりが元の値にも影響することがあります。

function copyPreviousValue(type, value) {
  if (type === 'CHECK_BOX') {
    if (!Array.isArray(value) || value.some(v => typeof v !== 'string')) {
      throw new Error('チェックボックスには選択肢の配列が必要です。');
    }
    return [...value];
  }
  if (type === 'USER_SELECT') {
    if (!Array.isArray(value) || value.some(v => !v || typeof v.code !== 'string')) {
      throw new Error('ユーザー選択にはcodeを持つ配列が必要です。');
    }
    return value.map(v => ({code: v.code}));
  }
  if (type === 'SINGLE_LINE_TEXT') {
    if (value != null && typeof value !== 'string') throw new Error('文字列が必要です。');
    return value == null ? '' : value;
  }
  throw new Error('このサンプルの対象外です。');
}

ユーザーは表示名ではなくcodeを渡す

製品内のcopyValueも、ユーザー・組織・グループをcodeの配列へ作り直します。このサンプルはチェックボックスとユーザー選択だけを対象にし、他の形式はエラーにしています。表示名nameを識別子の代わりには使いません。

コピー元のオブジェクトへ新しい値を足すのではなく、毎回新しい配列とオブジェクトを作ります。ただし、これだけでは編集権限や選択肢の整合まで保証しません。実際のコピー前に、元と先の型・選択肢・編集可否を確認します。

最終行とは限らない

行の追加位置は末尾とは限りません。途中に追加した行へコピーしたい場合は、そのイベントで追加された行を特定する必要があります。「テーブルの最後の行」をいつも対象にする実装にはしないでください。

製品版は、イベントのchanges.rowや行IDなどから追加行を確認し、特定できないときに推測して既存行を書き換えない設計です。既存行の再計算と、新規追加行だけのコピーも分けています。

参照が共有されていないか試す

const original = [{code: 'user_a', name: '担当者A'}];
const copied = copyPreviousValue('USER_SELECT', original);
copied[0].code = 'user_b';
console.log(original[0].code); // user_a

配列の独立性・codeの引き継ぎ・空配列・不正な型をNode.jsで確認しました。実際のkintone画面や、ユーザーコードが有効かどうかの確認は含みません。

値のコピーと初期表示・累計計算は別の役割

このサンプルには、固定行の初期表示や累計計算は含みません。業務で必要なのが「追加時だけ引き継ぐ」動作なら、その後の手入力を再計算で上書きしないことも大切です。製品版では設定からタイミングを選べます。

画面で設定して使いたい場合

自社のテーブル値計算プラグインの仕様・設定画面に、設定から利用する方法もまとめています。サンプルと製品版の対応範囲は異なります。

無料利用では、非契約ドメインのPC・モバイル一覧画面に有償プランの案内バナーが30%の確率で表示されます。契約済みドメインでは表示されません。一度閉じると、同じブラウザー・同じkintoneドメインでは、全Kintacoプラグイン共通で24時間非表示になります。

参考資料

製品仕様と実コードの確認元:TableValueCalculation/src/js/core.js(1.0.1)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?