今回はサンプルコードではなく、kintoneのJavaScriptカスタマイズにおいて、とても頻繁に使用する組み込み関数の一つを紹介したいと思います。
それは、Object.keys() です。
kintoneのJavaScriptカスタマイズでは、フィールドコードを指定して、そのフィールドに対する何らかの処理を実装するということが非常に多いです。
特定の一つのフィールドに対する処理であれば、そのフィールドコードを直接指定すればいいのですが、例えばフィールドコードに"合計"を含む複数のフィールドに対して同じ処理を施したい、といった場合はどうでしょうか?
対象となるフィールドが数個であれば一つ一つ個別に指定しても良いとは思います。しかし対象となるフィールドが20個や30個以上、さらに今後増やす可能性がある場合などは、個別指定ではあまりにも効率が悪いです。
そのような時こそObject.keys()の出番です。そして早速ですが、Object.keys()を使用したコード例です。
<コード例>
// レコード追加画面での保存成功時、レコード編集画面での保存成功時、レコード一覧画面での保存成功時のイベントタイプ名を変数eventsに格納
const events = ["app.record.create.submit.success", "app.record.edit.submit.success", "app.record.index.edit.submit.success"];
// イベントハンドラーで上記のeventsを指定
kintone.events.on(events, function (event) {
// イベント発生時のレコード情報を変数recordに格納
const record = event.record;
// Object.keysを使用して、変数recordに格納されているキー即ちフィールドコードのみを変数fieldsに格納
const fields = Object.keys(record);
// フィールドコードに"合計"のテキストが含まれるフィールドコードだけを抽出し変数TotalFieldsに格納
const TotalFields = fields.filter((fieldCode) => fieldCode.includes("合計"));
// 対象となるフィールドが1つ以上ある場合に処理を実行
if (TotalFields.length > 0) {
// TotalFieldsに格納されているフィールドコードを一つずつ順番に処理
TotalFields.forEach((fieldCode) => {
const value = record[fieldCode].value;
// 以降、value(フィールドコードに"合計"を含むフィールドの値)に対して何らかの処理を行う
});
}
});
JavaScript初心者にもご理解いただけるよう、一つ一つの行で何が行われているかコメントも記載いたしましたので、大部分は「なるほど~便利そう!」と感じていただけたのではないかと思います。
少しだけ補足すると、const record = event.record; の event.record というのは、対象アプリ内の全てのフィールド情報が配列構造でまとまったデータです。その中には、レコード番号のフィールド、文字列のフィールド、数値のフィールド等、アプリを構成している全てのフィールドが含まれています。
例として、数値フィールドの配列は以下のようになっています。
"フィールドコード": {
"type": "NUMBER",
"value": "123"
}
そして、const fields = Object.keys(record); の Object.keys(record) では、上記の"フィールドコード"の部分(ここがkeyです)のみを取得しています。このため、変数fieldsには、対象アプリ内のフィールドコードのみが格納されます。
const TotalFields = fields.filter((fieldCode) => fieldCode.includes("合計")); のfilterの部分が何をしているか大雑把に言うと、元の配列を特定の条件で絞り込み、抽出された配列のコピーを作成しています(本当はもっと深い話しになるので興味がある方はfilter関数を深堀りしてください)。
includesもJavaScriptの組み込み関数で、配列や文字列の中に指定された要素が含まれているかどうかをboolean (trueかfalse) で返します。つまり、ここではfalseであるものが削ぎ落とされ、trueのものだけが残されるといったイメージです。
まとめると、対象アプリ内の全フィールドコードが格納されているfieldsの内、フィールドコードに"合計"というテキストが含まれているフィールドコードだけを抽出したいので、filter関数を使用して、抽出されたフィールドコードだけをTotalFieldsに格納しているわけです。
※Object.keysがあるということは、Object.valuesもあったりする?と思った方、もちろん、あります。Object.◯◯()の形の関数だけでも20個以上ありますので、興味のある方はぜひ調べてください。
それでは、ぜひObject.keys()を使用して、効率的なJavaScriptカスタマイズを行ってください!