面倒解決エンジニアの森田ユウゴです。
台湾からお届けする「#kintone100日チャレンジ」の7日目。
気が付けば1週間経っていました。
この1週間は朝からkintoneのことを考える生活です。
本日は、【レガシーシステムからの移行を検討している情シス担当者や入力オペレーター】向けの「【カスタムショートカットキー設定プラグイン】」を開発しようとしました。
「【カスタムショートカットキー設定プラグイン】」について
🎯 なぜ開発したか?(現場の課題とベネフィット)
- 現場の「不」: 自治体や金融機関などのレガシーな専用システムでよく見かける「プログラムキーボード」。「F1で登録」「F2で照会」といった、キーボードのみで完結する高速な入力業務に慣れ親しんだ現場にとって、kintone移行時の「マウスへの持ち替え」は大きなストレスであり、作業効率低下の要因となります。
- 導入後の世界(ベネフィット): 画面(一覧・詳細・追加)ごとに、特定の機能(保存、編集、検索など)を任意のキーに割り当てることで、マウスを使わずにキーボード操作だけで業務が完結。入力スピードの維持・向上を目指します(…という想定でした)。
✨ これで出来ること(機能概要)
まずはこちらをご覧ください。
- 【画面ごとのキーカスタマイズ】: レコード一覧、詳細・編集、レコード追加の各画面において、「新規」「編集」「保存」「次へ」といったアクションに対して、ShiftやCtrlキーを組み合わせた任意のショートカットキーをプラグイン設定画面から割り当て可能です。
- 【ナビゲーションバーとヘルプ機能】: 画面上部に現在有効なショートカットキーのナビゲーションバーを表示します。また、「?」キーを押すことで、現在設定されているショートカットの一覧をポップアップ(ヘルプオーバーレイ)で確認できます。
- 【入力中の誤爆防止】: テキストボックスなどの入力フィールドにフォーカスが当たっている時は、ショートカットの発動を無視するように制御し、意図しない画面遷移を防ぎます。
課題
正直に言います。今回の開発は「失敗」です。 PoC(概念実証)の段階で、汎用的なプラグインとして実用に耐えうる品質に到達しないことが判明しました。現時点では下記のような課題が残っています。
-
【DOM操作への依存と「保存」の不具合】
AIに「このボタンのショートカットを作って」と指示した結果、出力されたコード(desktop.jsのACTION_SELECTORS周辺)は、kintoneのHTMLクラス名を直接指定して無理やりclick()イベントを発火させる、非常に脆い実装でした。「アップデートでDOM構造が変わったら即死する」コードです。さらに、詳細画面の「保存」ボタンについては、この強制クリックによるイベント発火がkintone標準のバリデーションや保存処理とうまく連携できず、保存が効かないという致命的な不具合を抱えています(検証不足のまま壁にぶつかりました)。 -
【ネイティブショートカットの完全再現の壁】
kintone標準のショートカット機能(一覧画面でのjやkによるレコード移動など)に相当する滑らかな動きを再現しきれていません。ここばかりは検証不足は否めない…。 -
【「専用キーボード完結」という要件の深さ】
そもそも、レガシーシステムの操作感をWeb(kintone)で真に再現しようとすると、単にボタンにキーを割り当てるだけでは不十分です。「フォーム入力時の緻密なTabキー移動制御」「印刷などのハードウェア連携」「特定業務のAPI呼び出し」など、業務に極めて密結合した作り込みが必要になります。汎用的なプラグインとして提供するには存在意義が弱く、個別のカスタマイズ開発でしか解決できない領域だと痛感しました。
この点からも、細かい課題解決をするまでもなく「存在意義が弱い」として、最低限のPoC状態で今日は完成としました。
さいごに
明日もお楽しみに!
下記のブログもご覧ください!
👉 【#kintone100日連続チャレンジ】AIにkintoneカスタマイズを100%任せたらどこまでいけるか?現役フリーランスの「100 Days of kintone Hacks」始動!
👉 ココナラで「kintone有資格者が導入や運用の相談にのります」サービスを開始します!
2026/4/15追記…下記の通り、ソースコードとプロンプトについては公開を停止します。
#kintone100日チャレンジ 方針変更
— 森田ユウゴ@マジナライフ (@majinalife_blog) April 15, 2026
Githubの公開を停止します。
免責に書いてきた「ほぼ100%AI生成」のリスクが伝わらず、いつの間にか本番適用される危うさを察知しました。
また、私が100%AIで納品する人材だと思われるのも本意ではないので…
詳細は記事にて!👇https://t.co/5etpecPA8A
