kintone の JavaScript カスタマイズを実装する際、多くの場合、予め用意されている API であるkintone.events.on
メソッドを介してアプリを操作します。
メソッド内で想定した通りのデータを受け取り、想定した通りにデータを返却できる限りは問題ありませんが、フィールドコードが変更された場合など、想定しない状態となった場合に備えたコーディングをされているでしょうか?
例えば、操作しているレコード内のフィールドコードは〇〇で、フィールドタイプは △△ だということを前提として処理していませんか?
kintone アプリと JavaScript カスタマイズは独立しているため、ある程度前提とする条件があることは仕方ありませんが、万が一想定しない状態となった場合に備えて例外処理を用意しておくことは大切です。
今回は、kintone の JavaScript カスタマイズにおける例外処理についてまとめます。
エラーを放置するとどうなるのか
以下のコードは、レコード新規作成時のレコード保存イベントの中で、意図的にエラーを発生させるサンプルです。
kintone.events.on(['app.record.create.submit'], (event) => {
throw 'テストプログラムで発生したエラー';
return event; // ここにはたどり着かない
});
この状態でレコードを新規作成し、保存ボタンをクリックしても、レコードが保存されることはありません。
カスタマイズ中でエラーが発生し、kintone.events.on
メソッドのコールバック関数から受け取ったevent
オブジェクトが適切に返却されなかったためです。
コンソールにエラーを通知するログが出力されますが、それ以外に何も影響が起きないため、ユーザーからすると「ボタンを押しているのに反応しない」ということしか分かりません。
エラーの対処
kintone には、エラーが発生した場合にユーザーに通知する API もいくつか用意されています。
kintone.events.on
メソッドのコールバック関数から受け取ったevent
オブジェクトにerror
プロパティを追加することで、ユーザーにエラーを通知することが可能です。
また、error
プロパティが追加されている場合、保存処理は自動的に中断されます。
kintone.events.on(['app.record.create.submit'], (event) => {
try {
throw 'テストプログラムで発生したエラー';
} catch (error) {
event.error = 'JavaScriptカスタマイズでエラーが発生しました';
}
return event; // レコード保存は中断される
});
これによって、「ボタンを押しているのに反応しない」という状況は避けることができます。
ただ、この後ユーザーがどのように行動すべきなのかこれだけでは判断できないため、表示させるエラーメッセージは工夫しておく必要があります。
kintone.events.on(['app.record.create.submit'], (event) => {
try {
throw 'テストプログラムで発生したエラー';
} catch (error) {
event.error = 'レコード保存時にエラーが発生しました。登録情報に不足がないか確認してください。繰り返しエラーが発生する場合は、管理者までお問い合わせください。';
}
return event;
});
また、開発者がエラーを再現し状態を確認するために、ログを出力しておくことをおすすめします。
kintone.events.on(['app.record.create.submit'], (event) => {
try {
throw 'テストプログラムで発生したエラー';
} catch (error) {
console.error('JavaScriptカスタマイズでエラーが発生しました', error); // 開発者確認用
event.error =
'レコード保存時にエラーが発生しました。登録情報に不足がないか確認してください。繰り返しエラーが発生する場合は、管理者までお問い合わせください。'; // ユーザー確認用
}
return event;
});
おすすめの対応方法
エラーの発生はユーザーにとって、大して重要でないこともあります。そういった場合、管理者へ報告されない可能性もあります。
エラー対応のおすすめの方法は、ユーザーからの報告を待たずして、管理者がエラーに気づくことのできる仕組みづくりです。
具体的には、エラーの発生を記録するアプリを作成し、エラー発生時にエラーの詳細情報を保存するよう設定しておくことです。
kintone.events.on(['app.record.create.submit'], async (event) => {
try {
throw 'テストプログラムで発生したエラー';
} catch (error) {
console.error('JavaScriptカスタマイズでエラーが発生しました', error);
event.error =
'レコード保存時にエラーが発生しました。登録情報に不足がないか確認してください。繰り返しエラーが発生する場合は、管理者までお問い合わせください。';
await createErrorRecord(error);
}
return event;
});
/**
* エラーの詳細をレコードとして保存します
* @param { string } message エラーメッセージ
*/
const createErrorRecord = (message) => {
const app = 999; // エラー保存用アプリのID
const record = {
イベント: { value: 'レコード保存時' },
詳細: { value: message },
};
return kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', { app, record });
};
上記のレコード作成処理はサンプルなので最低限の項目しかありませんが、その時点で判断できる情報をできる限り多く残しておくことで、より速い問題解決につながります。
チャットツールなどと連携し、自動的に通知が送信されるような仕組みを作っておくとなお良いかと思います。
エラーの有無にかかわらず処理を続行させたい場合
あまりおすすめはしませんが、JavaScript カスタマイズが動作しなくてもアプリに大きな影響を与えないのであれば、エラーをなかったこととして処理を進める事も可能です。
kintone.events.on(['app.record.create.submit'], (event) => {
try {
throw 'テストプログラムで発生したエラー'; // 1. エラーが発生する
} catch (error) {
// 2.エラーをなかったことにする
}
return event; // 3.正しく返却される
});
ただこれでは、ユーザーもプログラム作成者もエラーに気づくことができないため、適切な対応とは言えません。
とにかくフローの続行だけを優先したい場合など、応急処置的な対応に留めておいた方がよいです。