見出し画像

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記事制作の活動費に使わせていただきます!