実現したいこと
下記記事を参考にkViewer外部公開APIを利用してメールアドレスの重複を許さない応募フォームを構築しています。
メールアドレスを入力後、チェックボックスをオンにしたときにkintoneから同じメールアドレスのレコードを取得します。
ヒットするレコードがあればバリデーションエラーを出し、チェックボックスをクリアするという処理をしています。
これで重複の検出はできている状態です。
発生した問題
元々バリデーションイベント発火のタイミングはメールアドレス欄の変更時にしていましたが、文字を入力するたびにAPIがコールされkintoneのAPIアクセス数が膨大になってしまうので今の形になりました。
初回にチェックボックスをオンにしたときは想定通りに動作するのですが、重複が検出された時にメールアドレス欄を修正しようとすると文字入力のたびにAPIがコールされてしまいます。
おそらくよくわからないまま使っている非同期処理のところがうまくいっていないと思うのですが、どなたか解決策をご教授いただけますでしょうか?
よろしくお願いいたします。
実行したコード
※文字列__1行_メアド:メールアドレス欄のフィールドコード
※チェック_メアド:チェックボックスのフィールドコード
(() => {
'use strict';
/* ---------------------------------------------------------------------------------
イベント処理
----------------------------------------------------------------------------------*/
// メアド確認チェックボックスが変更された時の処理
fb.events.fields.チェック_メアド.changed = [
async function (state) {
if (state.record.チェック_メアド.value == "確認しました") {
await state.fields.find(({code}) => code === "文字列__1行_メアド").validations.push({
params: [],
rule: 'mailDupli_validation'
});
}
return state;
}
];
/* ---------------------------------------------------------------------------------
バリデーションルール
----------------------------------------------------------------------------------*/
fb.addValidators = function (state) {
return {
// 応募済みメールアドレスでないか
mailDupli_validation: {
getMessage: function (fieldCode, params) {
return '応募済みのメールアドレスです。';
},
validate: async function (value, params) {
// kViewer の外部公開APIリンク
const apiUrl = "外部公開APIのURL";
// レコード絞り込み用の文字列
const additional = "絞り込み用の文字列=";
// 指定したメールアドレスと一致するレコードを呼び出すAPIリンク
let url = apiUrl + additional + state.record.文字列__1行_メアド.value;
let hitRecordNum = 0;
await fetch(url)
.then((response) => response.json())
.then((res) =>{
hitRecordNum = res.records.length; // ヒットしたレコードの件数
// 重複レコードがヒットしたらチェックボックスをクリア
if (hitRecordNum !== 0) {
state.record.チェック_メアド.value = "";
}
});
return hitRecordNum === 0;
}
}
}
};
})();