背景
Kintoneでレコードの全件出力が簡単にできることを知りました。
const body = {
app: kintone.app.getId()
, query: order by レコード番号 asc limit 500 offset 1'
, fields: ['フィールドコード1', 'フィールドコード2', ...] // ★
};
await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body);
ここで、例えば画面項目が100や200ある場合、一つ一つ設定画面からフィールドコードを確認するのは時間がかかってしまいます。
そこで、一括でフィールドコードを出力し、かつそれが画面の表示順に並んでいたら、★の行にフィールドを張り付けるだけで済みます。
やりたいこと
画面の表示順(上から下、左から右の並び順)でフィールドコードを取得する。
ソースコード
(() => {
'use strict';
// 一覧画面が表示されたタイミング
kintone.events.on('app.record.index.show', (event) => {
// 増殖しないよう、作成済みであれば処理をしない。
if (document.getElementById('my_index_button') !== null) {
return;
}
// ボタンを作成する。
const myIndexButton = document.createElement('button');
myIndexButton.id = 'my_index_button';
myIndexButton.innerText = '一覧のボタン';
myIndexButton.addEventListener('click', async () => {
const body = {
app: kintone.app.getId(),
}
// REST APIでレイアウトの情報を取得する。
const data = await kintone.api(kintone.api.url('/k/v1/app/form/layout.json', true), 'GET', body);
let result = [];
getLayoutList(data.layout, result);
// 暫定的にコンソールに出力。
console.log(result);
});
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
// レイアウトの一覧を取得する。
function getLayoutList(layout, result) {
layout.forEach((item) => {
if (item.type === 'ROW' || item.type === 'SUBTABLE') {
item.fields.forEach((field) => {
if (field.code) {
result.push(field.code);
}
});
} else {
getLayoutList(item.layout, result);
}
});
}
})();
ソースコード簡単解説
Kintoneの画面構成は「ROW」「SUBTABLE」「GROUP」の3つで構成されます。
レイアウトをカスタマイズする画面で試してもらうと分かりますが、ROWの中にSUBTABLEやGROUPが入ることはありません。
テーブルとグループは必ず、それ単体で画面の1行分を占有するのです。
というわけで、ROWの中にSUBTABLEがGROUPが入れ子になる可能性、およびSUBTABLEの要素にSUBTABLEやGROUPが入れ子になる可能性は
考慮しなくてよいので再帰関数の中はかなりシンプルにできました。(ありがたい)
また、field.codeの存在チェックをしているのはラベルなどの値の持たない(フィールドコード)の持たない要素もあるためです。