Index
概要
見積番号を自動採番して登録するサンプルプログラムです。
完成形
事前準備
- 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によるカスタマイズ」画面でそれぞれ設定した例を紹介します。
使用したAPI
- アプリの ID を取得する
- APIのURL を取得する
- kintone REST API リクエストを送信する
- イベントハンドラーを登録する
- レコード追加画面で保存するときのイベント
- フィールド要素を取得する
デモ環境
デモ環境で実際に動作を確認できます。
ログイン情報はcybozu developer network デモ環境で確認してください。
本スクリプト、大変重宝させていただいております。
しかし、とあるタイミング(CSVファイル・ダウンロード実施後)の後にrecNoが1つ歯抜けになってしまいました。
20150501-E368
20150502-E369
(関係ないかもしれませんが、このタイミングでCSVファイル・ダウンロード実施)
20150502-E371 ⇒ E370が採番されず
このような事象になられた方はいらっしゃいますでしょか。
回避策をご存じの方がいらっしゃれば、お力をお貸しください。
レコードIDは、保存成功後のイベントから取得すれば良いのでは。
https://cybozudev.zendesk.com/hc/ja/articles/201941984#success
保存成功後のイベントでIDが取れるので、PUTで更新処理をさせることで私は解決しました。
また、このコードだと「データが0件しかなかった場合」が考慮されていないです。
記事通りに操作しましたが、エラーが出て正常に動作しません。
【エラー情報】
エラーが出ている場所: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制限などネットワークに特殊なことがあれば:特になし
ご確認いただけますよう、よろしくお願いいたします。
中村 様
お世話になっております。cybozu developer network 運営局です。
ご指摘について確認いたしましたところ、再現致しました。
掲示していたコードに一部誤りがありましたので、修正致しました。
ご迷惑をおかけして申し訳ございませんが、もう一度お試しいただきますようお願いいたします。
ご連絡ありがとうございました。またなにかありましたらご連絡よろしくお願いいたします。
初心者質問で申し訳ございません。
こちらはサンプルコードをそのまま動かしても自動では採番されないのでしょうか?
新しくレコード追加しても、すべて001で採番されてしまいます。
書き換え箇所があればどなたかご教授頂けますと幸いです。
k 様
お世話になっております。
cybozu developer network 運営局です。
ご指摘について確認いたしましたところ、こちらの環境でも再現致しました。
本記事内に記載のコードについて、担当部署にフィードバックいたします。
取り急ぎ、次の対応をお試しいただけますでしょうか。
40 行目に記載の以下のコードを削除し、新たに 57 行目に記載してください。
ご確認のほど、よろしくお願いいたします。
指示通り書き換えたら連番で採番されるようになりました。
ご対応頂き、ありがとうございました。
上記のスクリプト、大変参考にさせていただいております。
上記を参考にして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;
});
})();
矢野 理子 様
お世話になっております。cybozu developer network 運営でございます。
恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
今回のような記事から派生した技術的なご質問はcybozu developer コミュニティをご活用ください。
また、その際はデバッグしてどうだったのか詳細のご説明もありますと回答してもらいやすいかと思われます。
以上、よろしくお願いいたします。
よろしくお願い致します。
cybozu Development team 様
お世話になっております。
ご指摘いただきまして、誠にありがとうございます。
コミュニティを活用させていただきます。
よろしくお願いいたします。
いつもお世話になっております。
こちらのプラグインをサンプルコードのまま使用していたのですが、本日レコードを保存しようとすると、保存できなくなってしまいました。
レコードの保存ボタンが反応しないといった感じです。
プラグインを適用していない他のアプリではレコードを保存できます。
何か原因は考えられますでしょうか?
初心者質問で大変恐縮ではございますが、何卒よろしくお願い申し上げます。
堀本 浩平 様
お世話になっております。cybozu developer network 運営でございます。
こちらで確認したところ、プラグインは正常に動けますので、
プラグインを適用したアプリのフィールドコードを変更したり、他のJSファイルを適用したりしていないでしょうか?
恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
記事から派生した技術的なご質問はcybozu developer コミュニティをご活用ください。
また、その際はデバッグしてどんなエラーが出るかなど詳細のご説明もありますと回答してもらいやすいかと思われます。
以上、よろしくお願いいたします。
初心者質問で失礼いたします。
下記のスクリプトを記載したのですが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;
});
});
})();