カテゴリー内の他の記事

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

Moment.js はメンテナンスモードになり、日付処理できる代替ライブラリへの移行が推奨されています。
代替ライブラリのひとつ Luxon については、kintone カスタマイズでの導入方法の紹介記事があります。

Index

概要

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

完成形

事前準備

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

サンプルプログラム

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

ご注意事項

  • サンプルプログラムは、その動作を保証するものではありません
  • サンプルプログラムの技術的なサポート等は行っていません
  • kintone JavaScript APIは非同期で実行されるため、レコードIDを取得する処理を XMLHttpRequest を使って同期処理しています。 処理中はブラウザがフリーズする場合があります。 また、XMLHttpRequest は利用できないブラウザもありますので、ご注意ください。

PC用のJavaScriptファイル

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

  • Moment.js
    https://js.cybozu.com/momentjs/2.8.4/moment-with-locales.min.js (version 2.8.4 を利用)

JavaScriptサンプル

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

設定した画面

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

使用したAPI

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

デモ環境

(見積書) https://dev-demo.cybozu.com/k/60/

(商品リスト) https://dev-demo.cybozu.com/k/61/

※デモ環境についての説明はこちら

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

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

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により編集されました
サインインしてコメントを残してください。