Kintoneで、少々複雑な自動採番を可能にするためのスクリプトです。

自動採番を可能にするための無料プラグインはいくつも公開されていますが、「もう少し気の利いた複雑な採番をしたいんだよな」というご依頼が少なくありません。

割とご要望の多い採番は、「生徒が入学した年と学期ごとに自動採番をしたい」というものなのですが、このようなご要望をいただいた際に作成したスクリプトを下記に公開いたします。

<前提条件>

Kintoneアプリ内に採番の基準となる「レコード登録日」「入学年」「入学月」の3つのフィールドと、作成した番号をセットする「学生番号」フィールドを用意してください。

<採番条件>

・1年ごと(1/1 ~ 12/31)に番号が自動でリセットされる
・入学月(サンプルでは4学期制)によって番号が自動でリセットされる
・学生番号の頭に共通のアルファベットを付与したい

上記のような条件の基、最初の入学生徒のレコード登録日が 2024/04/01 だった場合は、自動的に S2404001 という番号が「学生番号」フィールドに挿入されます。

20人目の入学生徒のレコード登録日が 2024/05/05 だった場合は、S2404020 となります。

学期が変わり、2024/07/01 に登録された生徒の番号は S2407001 となります。更に、翌年の 2025/10/07 に登録された10月期の12人目の生徒の番号は S2510012 となります。

<サンプルコードの仕様>

・「入学年」フィールドは 西暦数字、「入学月」フィールドは「1月」「4月」「7月」「10月」のいずれかのテキストが選択されるドロップダウンフィールドを想定しています。
・「学生番号」フィールドは手動編集が行えないよう非活性にしています。

サンプルコードを環境に合わせてご変更いただければ、かなり便利なスクリプトになるかと思いますので、ご自由にお使いください!

※ご質問にはお答えできませんので予めご承知おきくださいませ。

コード

(function () {
  "use strict";

  function autoNum(event) {
    const record = event.record;

    // 日付を取得し、採番のリセット範囲を指定
    const dt = record.レコード登録日.value;
    const dtyy = dt.substring(0, 4);
    const dtmm = dt.substring(5, 7);
    const dtmin = dtyy + "-" + dtmm + "-01";
    let dtmax = null;
    if (parseInt(dtmm, 10) == 12) {
      dtmax = parseInt(dtyy, 10) + 1 + "-01-01";
    } else {
      dtmax = parseInt(dtyy, 10) + "-" + (parseInt(dtmm, 10) + 1) + "-01";
    }

    // クエリ文の設定
    const query = {
      app: kintone.app.getId(),
      query: 'レコード登録日 >= "' + dtmin + '" and レコード登録日 < "' + dtmax + '" order by 学生番号 desc limit 1',
    };

    // 対象範囲の最終レコード番号を取得する
    return kintone
      .api(kintone.api.url("/k/v1/records", true), "GET", query)
      .then(function (resp) {
        const records = resp.records;

        const sy = record.入学年.value;
        const yy = parseInt(sy.substring(2, 4), 10);
        let yymm = null;

        if (record.入学月.value == "4月") {
          yymm = yy + "04";
        } else if (record.入学月.value == "7月") {
          yymm = yy + "07";
        } else if (record.入学月.value == "10月") {
          yymm = yy + "10";
        } else if (record.入学月.value == "1月") {
          yymm = yy + "01";
        }

        // 対象範囲にレコードがあった場合
        if (records.length > 0) {
          const rec = records[0];
          let autoStuNum = rec.学生番号.value;
          autoStuNum = parseInt(autoStuNum.substring(1), 10) + 1;
          autoStuNum = "00" + autoStuNum;
          autoStuNum = "S" + yymm + autoStuNum.substring(autoStuNum.length - 3);
          event.record.学生番号.value = autoStuNum;

          // 対象範囲にレコードがなかった場合
        } else {
          event.record.学生番号.value = "S" + yymm + "001";
        }
        return event;
      })
      .catch(function (e) {
        alert("レコードの取得でエラーが発生しました  - error: " + e.message);
        return false;
      });
  }

  //新規作成画面の保存
  kintone.events.on("app.record.create.submit", autoNum);

  const events = ["app.record.create.show", "app.record.edit.show", "app.record.index.edit.show"];

  // 新規作成画面、編集画面表示時に「学生番号」フィールドの編集制限
  kintone.events.on(events, function (event) {
    const record = event.record;
    //フィールドを非活性にする
    record.学生番号.disabled = true;
    return event;
  });
})();