kintoneアプリに自動採番機能を付ける
やりたいこと
Kintoneの日報アプリ等で、レコード毎に独自の番号を自動割当したい。
例えば、「2023-A0001」~「2023-A0099」の様に、自動でカウントアップするユニークな番号を自動生成するフィールドが欲しい。
デモ画面
伝票番号とタイトルだけの簡単なアプリですが、新規登録画面で伝票番号フィールドに新しい番号が自動セットされる機能が実装できています。
自動採番を実行するJavascriptコード
初期設定で、INVOICE_FIELD_CODEの値をアプリの伝票番号フィールドコードと同じ値にして、UNIQUE_SYMBOLに任意の値をセットするだけで動作します。コメント行を含めて全部で42行と割と短いコードです。
/* 自動採番機能を実装する */
(function() {
"use strict";
// 初期設定
const INVOICE_FIELD_CODE = '番号';
const UNIQUE_SYMBOL = '-A';
// 新しい番号を生成する処理
function generateNewNumber(lastNumber) {
const currentYear = new Date().getFullYear().toString();
if (!lastNumber || lastNumber.substring(0, 4) < currentYear) {
return currentYear + UNIQUE_SYMBOL + '0001';
} else {
const number = parseInt(lastNumber.slice(-4), 10);
return lastNumber.substring(0, 4) + UNIQUE_SYMBOL + ('0000' + (number + 1)).slice(-4);
}
}
// 新規登録画面と編集画面をトリガーとして起動
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function(event) {
event.record[INVOICE_FIELD_CODE].disabled = true; //番号フィールドを編集不可にする
// 新規登録画面の場合のみ新しい番号を生成
if (event.type === 'app.record.create.show') {
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: kintone.app.getId(),
query: 'order by $id desc limit 1',
fields: [INVOICE_FIELD_CODE]
}).then(function(resp) {
const lastNumber = resp.records.length > 0 ? resp.records[0][INVOICE_FIELD_CODE].value : null;
// 新しい番号をセット
event.record[INVOICE_FIELD_CODE].value = generateNewNumber(lastNumber);
return event;
}).catch(function(error) {
console.error('Error fetching records:', error);
});
} else {
return event;
}
});
})();
仕組みの説明
新規登録画面で、同じアプリの最新レコードを取得し、伝票番号の下4桁の数値に+1して、年(4桁)+独自記号(-A)+伝票番号(4桁)の形式に再編集して伝票番号フィールドに出力します。
伝票番号の形式は、YYYY+独自記号+先頭が0充填された4桁の数字です。
最新レコードの伝票番号の年<本日の年の場合は、伝票番号をリセットして1番をセットしています。
少し技術的なこと(覚え書き)
kintone.api 関数は非同期的に動作するので、結果をレコードに反映させるためには、非同期処理が完了するのを待つ必要があります。
変数に新規採番した値を格納してから、その変数でレコードの値を上書きする処理では、最新レコードをkintone.apiで取得する処理が完了する前に関数が動きますので、新しい伝票番号がフィールド内に表示されませんでした。
特にエラーも表示されませんので、表面上は問題なく動いてるように見えてしまいます。
// 新しい伝票番号をセット
const newNumber = GenerateNewNumber(lastNumber);
record[INVOICE_FIELD_CODE].value = newNumber;
このため、kintone.api の応答後に動くように、recordのフィールド値セットの処理中で、新しい番号生成の関数(GenerateNewNumbe)を呼び出す様にしています。
// 新しい伝票番号をセット
record[INVOICE_FIELD_CODE].value = GenerateNewNumber(lastNumber);
この問題の原因究明と解決に結構苦労しましたので、自分自身のために覚え書きとして残しています。
無料プラグインの紹介
少々苦労して作成した自動採番のカスタムコードですが、Cybouz CDNを覗いてみたら、自動採番プラグインが無料で配布されてましたw
こちらの方が機能が豊富で汎用性も高いのでお勧めです。
無料で使える公式のプラグインがあるなら、自分で作成する必要性はなかったかもしれませんが、今回は勉強になりました、ということで。
よろしければサポートお願いします! いただいたサポートは、note記事制作の活動費に使わせていただきます!