Edited at

kintoneの内部パラメータ「フィールドID」を使いこなす


kintoneのフィールドIDとは?

kintoneではフィールドの判別に「フィールドコード」「フィールド名」を使いますが、

もう一つ、内部パラメータとして「フィールドID(仮称)」を持っています。

普段表には現れませんが、デバッグコンソールでHTMLを見ると、

こんな風にclass名の一部に使われたりしています。

<div class="control-gaia control-decimal-field-gaia field-5525625" >

<div class="control-label-gaia label-5525625" >
<div class="control-value-gaia value-5525625" >

スクリーンショット 2019-05-16 15.56.09.png

公開されているJavaScript APIではないので、今後のkintoneバージョンアップで動かなくなる可能性はありますが、現状確認できている挙動としては


  • フィールドコード:フィールドID = 1:1

  • フィールドコードを変えてもフィールドIDは変わらない

  • フィールドIDは自動採番で変更不可能

って感じ。

そして、レコード編集画面でフィールドのDOMを取得するときなんかは、

JavaScript APIではうまく取れないので

このフィールドIDをうまく使ってやると、より高度なhackができるわけです!

(繰り返しますが、非公式カスタマイズなので、動かなくなるリスクを踏まえて自己責任で!)


window.cybozuオブジェクト

実は、window.kintoneとは別にwindow.cybozuというグローバルオブジェクトがあり、

こうしてやると超便利なfieldListオブジェクトが取れることを、同僚の @t2kojima が発見してくれました!

cybozu.data.page.FORM_DATA.schema.table.fieldList

スクリーンショット 2019-05-16 16.04.20.png

fieldListオブジェクトのkeyvalue.idが、どちらもフィールドID。

valueの中にはフィールドコードやらフィールド名やら、

他にもデフォルト値、単位、必須制約などなど宝の山が入っております!


fieldListを使った例

このように配列にしておくと、その後扱いやすいです。

const fields = Object.values(cybozu.data.page.FORM_DATA.schema.table.fieldList)


フィールドコードからフィールドIDを調べる

fields.find(_ => _.var === '支払サイト').id

// "5525625"


フィールド名からフィールドIDを調べる

fields.find(_ => _.label === 'レコード番号').id

// "5525614"


フィールドコードをキーにフィールド情報を引くオブジェクトを作る

const fields = Object.values(cybozu.data.page.FORM_DATA.schema.table.fieldList)

const fieldMap = fields.reduce((map, field) => ({ ...map, [field.var]: field }), {})
fieldMap.支払サイト.id
// "5525625"
fieldMap.支払サイト.properties.unit
// "日後"


DOM操作でフィールドに任意の値を設定する

const fieldId = fieldMap.支払サイト.id

$input = document.querySelector(`.value-${} input`)
$input.value = 30


終わりに

しつこいですが、あくまで自己責任で使ってくださいね!(笑)

よく忘れるので、自分用メモも兼ねて書きましたー。

ではまた!