エラー発生時に元の値に戻す処理

お世話になっております。
kintoneで開始、終了の打刻を行うことにより、日時データを登録するアプリを開発中です。
開始、終了の打刻はラジオボタンを使い、クリックしたタイミングで各々開始時刻、終了時刻を現在時刻からセットしています。

タイムスタンプの性格上、打刻したデータは修正できないようにしたいので、時刻はラジオボタンの切り替えでセットするように考えているのですが、なかなかうまくいきません。

開始時間がアプリを開いたタイミングではないので、ラジオボタンに、「開始」「終了」以外に「ーー」という選択肢を設けてそれを初期値としています。
「終了」を先に選択してしまった時はエラーを出しています。
「開始」だけを入れた状態で一旦保存することになります。

次に「終了」を押した時にラジオボタンを編集無効化しているので、その後は改ざんの防止ができているのですが、問題は、「開始」が入った状態でラジオボタンが効いてしまうことです。
このため、開始時刻が入っている時に「開始」を押した時にエラーとしたいのですが、
この時には開始時刻が上書きされてしまうので、元に戻すことができません。
隠し項目にラジオボタンをセットして同期をとっておき、そこから元に戻す、ような方法を取らないとどうしようもないでしょうか?

もっと単純にスクリプトで個別のボタンを設けて時刻のセットをしたほうがずっとシンプルになりような気もしますが、kintoneにボタンオブジェクトがないのが恨めしいです。

このような案件にどのように対処されておられるのか、経験者の皆様からヒントを頂ければ幸いです。

質問に対する回答からは少しずれているかと思いますが、やり方をガラッと変えれば要件的には実現できそうな気がします。

kintoneにはスペースフィールドというものがあり、そのスペースフィールドにフィールドコードを付与しておくことによって、APIでその要素を取得することができます。そして取得したスペースにボタンを設置することがベター化と思います。

しかし今回のケースに関しましては、kintoneのレコード一覧画面のヘッダー部分を取得し、そこにボタンを設置した方が、出退勤ボタンそれぞれの表示と、レコードの履歴が一覧でみることができるので利便性が高いと思います。

■概要

kintoneのレコード一覧画面のヘッダースペースを取得し、「出勤」「退勤」の二つボタンを設置する。ボタンに以下の機能を持たせる。

■出勤ボタン押下時の処理

何らかの方法で今日の日付を取得→「YYYY-MM-dd」の形式にフォーマットする(後で条件として使用するため)

ボタンを押したユーザー(ログインしているユーザー)を取得する。

「出勤時間フィールドが今日」かつ「ユーザーフィールドがログインユーザー」に一致するレコードがあれば、既にそのログインユーザーが出勤ボタンを押しているということになるので、任意でアラートなどを出して処理終了

なければまだ出勤ボタンを押していないということなので、現在時刻とログインユーザーの情報を持たせたレコードを一件登録

どちらにせよ画面をリロードで処理終了

■退勤ボタン押下時の処理

何らかの方法で今日の日付を取得→「YYYY-MM-dd」の形式にフォーマットする(後で条件として使用するため)

「出勤時間フィールドが今日」かつ「ユーザーフィールドがログインユーザー」かつ「退勤時間フィールドが空ではない」に一致するレコードがあれば、既に退勤ボタンを押しているということになるので、任意でアラートなどを出して処理終了、または退勤時刻を現在時刻にしてレコード更新などする。

「出勤時間フィールドが今日」かつ「ユーザーフィールドがログインユーザー」かつ「退勤時間フィールドが空」に一致するレコードがあれば、そのレコードの退勤時間フィールドを現在時刻にしてレコード更新

どちらにせよ画面をリロードで処理終了

■権限設定

権限に関しましては、ユーザーごとにレコード編集権限などを設定してしまうと、上記のカスタマイズが動かなくなる可能性があります。よって次のような方法で設定するのが良いかと思います。

アプリ設定>高度な設定からレコード一覧からの直接編集、インライン編集を許可しないのと、別途のカスタマイズでレコード編集画面からの保存を禁止する。

間違っている箇所もあるかとおもいますが、cybozu developer networkの記事やその他ネット記事、生成AIなどを活用すれば実現可能かと思いました。

早々のコメントを頂きまして有難うございます。

大変参考になりました。
日報アプリは、こうした作り方がすれば、見やすく使いやすくなりますね。
やはりボタンで実装したほうがよいのでしょうね。

詳細は書きませんでしたが、今作っているアプリは、案件に対しての複数工程の履歴なので、ちょっと作り方が変わってきます。
案件の各工程は別のログアプリに工程単位で出力し、そのログアプリを主アプリから関連レコード一覧で見られるようにしています。
なので、主アプリには最新の工程の始業、終業時刻を入れるようにしています。

ラジオボタンで遷移させようとすると、どんどん深みにハマっていきそうで助けを求めてしまいました。
ラジオボタンではなく、チェックボックスを使えば、開始を押す前の状態が作れそうで、開始<終了のチェックもなくせそうなので、その方法でいけるかもしれません。

お忙しい中、アドバイス有難うございました。

@bobo さんの意見に概ね賛成ですが、そもそもの話、ラジオボタンを使って制御を行うこと自体が設計が悪いと思います。

元々 kintone の基本機能で用意されているフィールドは、何かのトリガーとして使うものではなく データを保存するもの であり、 操作したときに他のフィールドの値を切り替えるために用意されたものではない です。わざわざ kintone のフィールドを使ってカスタマイズ処理をトリガーする必要はないです。

ラジオボタンにカスタマイズを仕込むとしたら、ラジオボタンフィールドでデータを保存することは前提として、たまたま他のフィールドの値に関連性があって、ワンクリックで一緒に変えたいとなったときに行うべきです。


案件のログアプリとの関係性はよくわかりませんが、単純に 9:00 に開始打刻をして 18:00 に終了打刻をする……のような、1日の始めと終わりの打刻だけであれば、

  • 主アプリ: 1日の開始と終了を記録する
  • ログアプリ: 各工程の開始と終了を記録する

という役割分けをして、時間の記録の仕組み自体は同じものをどちらのアプリにも適用できると思います。ログアプリのレコードを開いて開始と終了を押す必要はありますが。

逆に、主アプリで操作 → ログアプリに各工程の開始と終了を記録する、の場合、

  • 主アプリ: 担当者情報と日付だけ記録して、時間情報は記録しない
  • ログアプリ: 各工程の開始と終了を記録する

という役割になり、主アプリ側にログアプリへ書き込みを行うカスタマイズを仕込むことになります。この場合はボタンをカスタマイズで自作したほうが良いです。

もしどうしてもフィールドでやりたいというのであれば、主アプリの保存時にフィールドを初期化する、のように状態を保持させないほうが綺麗になると思います。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。