cybozu developer network

カテゴリー内の他の記事

自動採番して、レコード登録する

Index

概要

見積番号を自動採番して登録するサンプルプログラムです。

完成形

quotation.png

事前準備

  • kintone アプリ(kintone アプリストア  の 「商品見積書パック」を使います)
  • 「商品見積書パック」に含まれる「見積書」アプリのフィールド「見積番号」を次のように設定します
    • 「必須項目にする」にチェック
    • 「値の重複を禁止する」にチェック
  • エディター

サンプルプログラム

サンプルプログラムでは、Cybozu CDN の利用、JavaScriptのサンプルを紹介します。

PC用のJavaScriptファイル

詳細設定から「JavaScript / CSSによるカスタマイズ」を開き、Cybozu CDN から次のライブラリを指定します。

  • Luxon
    https://js.cybozu.com/luxon/3.3.0/luxon.min.js

JavaScriptサンプル

  • 次のサンプルプログラムをエディターにコピーして、ファイル名を「sample.js」 、文字コードを「UTF-8」、BOMなしで保存します
    ※ファイル名は任意ですが、ファイルの拡張子は「js」にしてください

設定した画面

「JavaScript / CSSによるカスタマイズ」画面でそれぞれ設定した例を紹介します。

2023-07-06_10h15_48.png

使用したAPI

  1. アプリの ID を取得する
  2. APIのURL を取得する
  3. kintone REST API リクエストを送信する
  4. イベントハンドラーを登録する
  5. レコード追加画面で保存するときのイベント
  6. フィールド要素を取得する

デモ環境

デモ環境で実際に動作を確認できます。

ログイン情報はcybozu developer network デモ環境で確認してください。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
pekoe

本スクリプト、大変重宝させていただいております。

しかし、とあるタイミング(CSVファイル・ダウンロード実施後)の後にrecNoが1つ歯抜けになってしまいました。
20150501-E368
20150502-E369
 (関係ないかもしれませんが、このタイミングでCSVファイル・ダウンロード実施)
20150502-E371 ⇒ E370が採番されず

このような事象になられた方はいらっしゃいますでしょか。
回避策をご存じの方がいらっしゃれば、お力をお貸しください。

Avatar
菅原直樹

レコードIDは、保存成功後のイベントから取得すれば良いのでは。
https://cybozudev.zendesk.com/hc/ja/articles/201941984#success

保存成功後のイベントでIDが取れるので、PUTで更新処理をさせることで私は解決しました。

また、このコードだと「データが0件しかなかった場合」が考慮されていないです。

Avatar
中村

記事通りに操作しましたが、エラーが出て正常に動作しません。

【エラー情報】
エラーが出ている場所:kintoneのレコード追加画面で、「保存」クリック時
エラー内容:ブラウザの開発者ツールのコンソールから下記エラーが出ます。
edit.js:133 Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at download.do?app=13&contentId=80&jsType=DESKTOP&hash=dd6f6169bf5bed3b85418f9cd8c9404dd450c847:41
at edit.js:263
at new El (edit.js:136)
at sy (edit.js:263)
at edit.js:263
at e.o (edit.js:138)
at Vl (edit.js:140)
at Ql (edit.js:140)
at El.L (edit.js:1044)

なお、エラーが出ているJSの41行目は
var obj = JSON.parse(xmlHttp.responseText);
です。

【再現条件】
・問題が発生した箇所:完成形
・権限設定:cybozu.com共通管理者
・デバイス(PC or モバイル):PC
・OS・ブラウザ:Windows10、Chrome
・IP制限などネットワークに特殊なことがあれば:特になし

ご確認いただけますよう、よろしくお願いいたします。

Avatar
cybozu Development team

中村 様

お世話になっております。cybozu developer network 運営局です。

ご指摘について確認いたしましたところ、再現致しました。
掲示していたコードに一部誤りがありましたので、修正致しました。

ご迷惑をおかけして申し訳ございませんが、もう一度お試しいただきますようお願いいたします。

ご連絡ありがとうございました。またなにかありましたらご連絡よろしくお願いいたします。

Avatar
k

初心者質問で申し訳ございません。

こちらはサンプルコードをそのまま動かしても自動では採番されないのでしょうか?

新しくレコード追加しても、すべて001で採番されてしまいます。

 

書き換え箇所があればどなたかご教授頂けますと幸いです。

Avatar
cybozu Development team

k 様

お世話になっております。
cybozu developer network 運営局です。

ご指摘について確認いたしましたところ、こちらの環境でも再現致しました。
本記事内に記載のコードについて、担当部署にフィードバックいたします。

取り急ぎ、次の対応をお試しいただけますでしょうか。
40 行目に記載の以下のコードを削除し、新たに 57 行目に記載してください。

var autoEstNo = m.format('YYYYMMDD') + '-E' + ('000' + recNo).slice(-3);

ご確認のほど、よろしくお願いいたします。

Avatar
k

指示通り書き換えたら連番で採番されるようになりました。

ご対応頂き、ありがとうございました。

Avatar
矢野 理子

上記のスクリプト、大変参考にさせていただいております。

上記を参考にして6桁(300000番からはじまるよう)に設定いたしましたが、

採番はされるのですが、見積番号(文字列(1行))に反映されません。

初心者ですので、自分で試行錯誤しましたが解決しませんでした。

ご教授いただければ幸いです。

(function() {

  'use strict';

  // レコード追加、編集画面の表示前処理
  var eventsShow = ['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'];
  kintone.events.on(eventsShow, function(event) {

    var record = event.record;

    if (('app.record.create.show').indexOf(event.type) >= 0) {
      record.見積番号.value = '';
    }
    record.見積番号.disabled = true;

    return event;

  });

  // レコード追加画面の保存前処理
  kintone.events.on('app.record.create.submit', function(event) {

    var recNo = 1;
    var record = event.record;

    // URLを設定する
    var appUrl = kintone.api.url('/k/v1/records', true) +
    '?app=' + kintone.app.getId() + '&query=' + encodeURI('limit 1&fields[0]=$id');

    var xmlHttp = new XMLHttpRequest();

    // 同期リクエストを行う
    xmlHttp.open('GET', appUrl, false);
    xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xmlHttp.send(null);

    if (xmlHttp.status === 200) {
      if (window.JSON) {
        var obj = JSON.parse(xmlHttp.responseText);
        if (obj.records.length > 0) {
          try {
            recNo = parseInt(obj.records[0].$id.value, 10) + 1;
          } catch (e) {
            event.error = '番号が取得できません。';
          }
        }
        // 自動採番を番号に設定する
        var autoEstNo = '3' + ('000000' + recNo).slice(-5);
        alert('見積番号 ' + autoEstNo + ' を登録します');
        record.見積番号.value = autoEstNo;
      } else {
        event.error = xmlHttp.statusText;
      }
    } else {
      record.見積番号.error = '番号が取得できません。';
    }
    return event;
  });
})();

 

Avatar
cybozu Development team

矢野 理子 様

お世話になっております。cybozu developer network 運営でございます。

恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
今回のような記事から派生した技術的なご質問はcybozu developer コミュニティをご活用ください。

また、その際はデバッグしてどうだったのか詳細のご説明もありますと回答してもらいやすいかと思われます。

以上、よろしくお願いいたします。

 

よろしくお願い致します。

Avatar
矢野 理子

cybozu Development team  様

お世話になっております。

ご指摘いただきまして、誠にありがとうございます。

コミュニティを活用させていただきます。

よろしくお願いいたします。

Avatar
堀本 浩平

いつもお世話になっております。

こちらのプラグインをサンプルコードのまま使用していたのですが、本日レコードを保存しようとすると、保存できなくなってしまいました。

レコードの保存ボタンが反応しないといった感じです。

プラグインを適用していない他のアプリではレコードを保存できます。

何か原因は考えられますでしょうか?

初心者質問で大変恐縮ではございますが、何卒よろしくお願い申し上げます。

Avatar
cybozu Development team

堀本 浩平 様

お世話になっております。cybozu developer network 運営でございます。

こちらで確認したところ、プラグインは正常に動けますので、
プラグインを適用したアプリのフィールドコードを変更したり、他のJSファイルを適用したりしていないでしょうか?

恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
記事から派生した技術的なご質問はcybozu developer コミュニティをご活用ください。

また、その際はデバッグしてどんなエラーが出るかなど詳細のご説明もありますと回答してもらいやすいかと思われます。

以上、よろしくお願いいたします。

cybozu Development teamにより編集されました
Avatar
高橋侑也

初心者質問で失礼いたします。
下記のスクリプトを記載したのですがAPIリクエストでエラーが出てしまい困っています。
有識者の方でご教授いただけないでしょうか。
何卒宜しくお願い致します。

(() => {
    'use strict';
  
    // レコード追加、編集画面の表示前処理
    const eventsShow = ['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'];
    kintone.events.on(eventsShow, (event) => {
      const record = event.record;
      if (['app.record.create.show', 'app.record.edit.show'].includes(event.type)) {
        record.注文書番号.value = '';
      }
      record.注文書番号.disabled = true;
      return event;
    });
  
    // レコード追加画面の保存前処理
    kintone.events.on('app.record.create.submit', (event) => {
      const record = event.record;
      const orderNumberField = '注文書番号';
  
      // 注文書番号が既に入力されている場合は自動採番しない
      if (record[orderNumberField].value) {
        return event; // 既に注文書番号が設定されている場合は何もしない
      }
  
      // 自動採番を注文書番号に設定する
      const params = {
        'app': kintone.app.getId(168),
        'query': 'limit 1',
        'fields': [orderNumberField]
      };
  
      const apiToken = '設定したAPI'; // ここに発行したAPIトークンを設定
  
      console.log('APIリクエストを行う前'); // APIリクエストを行う前にメッセージを表示
  
      return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, apiToken).then((resp) => {
        // APIリクエストの成功時の処理
        console.log('APIリクエストが成功しました', resp); // APIリクエストが成功した場合にメッセージを表示
        console.log('APIレスポンス:', resp); // レスポンス全体を表示
        console.log('注文書番号の値:', resp.records[0] ? resp.records[0][orderNumberField].value : 'null'); // 注文書番号の値を表示
  
        if (resp.records[0] !== null && resp.records[0][orderNumberField].value) {
          const lastNumber = parseInt(resp.records[0][orderNumberField].value.slice(5), 10); // 最後の5桁の数字を取得
          if (!isNaN(lastNumber)) {
            const nextNumber = lastNumber + 1;
            const paddedNumber = String(nextNumber).padStart(5, '0'); // 5桁の数字にパディング
            const autoOrderNo = `AWSS-${paddedNumber}`;
            alert(`注文書番号 ${autoOrderNo} を登録します`);
            record[orderNumberField].value = autoOrderNo;
          } else {
            event.error = '注文書番号の取得に問題があります。';
          }
        } else {
          // 初めての注文書の場合、自動採番を行う
          const autoOrderNo = 'AWSS-00001';
          alert(`注文書番号 ${autoOrderNo} を登録します`);
          record[orderNumberField].value = autoOrderNo;
        }
        return event;
      }).catch((error) => {
        // APIリクエストのエラー時の処理
        console.error('APIリクエストエラー', error); // エラーが発生した場合にメッセージを表示
        record[orderNumberField].error = '注文書番号が取得できません。';
        return event;
      });
    });
  })();
  

Avatar
cybozu Development team
高橋 侑也 様
 
お世話になっております。cybozu developer network 運営でございます。
 
恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、今回のような記事から派生した技術的なご質問は cybozu developer コミュニティをご活用ください。
また、その際はデバッグしてどうだったのか詳細のご説明もありますと、回答してもらいやすいかと思われます。

以上、よろしくお願いいたします。
サインインしてコメントを残してください。