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)。