プロセス管理の特定のステータス時のレコード編集時に、特定のフィールドを編集不可にしたい

出張申請→承認後、その出張自体の申請が下りている事を前提に費用申請をするアプリを作成中です。

プロセス管理で承認が下りた後に、その申請画面を編集しようとしたときに特定のフィールドを編集不可としたいのですが、どうしてもコードが書けません。

以下のコードを作成してみて、エラーは出ないのですが思うような動きとなりません。

プロセス管理のステータス取得のコードと、編集画面を呼び出すというところがうまく関連づけられていないと思うのですが、改善点について何方かご教示頂けないでしょうか。

宜しくお願い致します。

プロセス実行イベントは関係なく、edit.showイベント(一覧に含む場合はindex.edit.showイベントも)で判定させる形で問題ないかと思います。仮に「プロセス管理を実行した直後に編集を始める場合のみ編集不可(ページ再読み込みで編集可)」にしたい場合は、proceedイベントの中でkintone.events.on(‘app.record.edit.show’, (event) =>…とイベント登録する必要があるかと思います。

(() => {
  'use strict';

  kintone.events.on('app.record.edit.show', (event) => {
    let record = event.record;

    if (record['ステータス'].value === '承認(出張費用未申請)') record['endDate'].disabled = true;

    return event;
  });
})();

できました!!!!! 本当にありがとうございます。

とてもとてもとても助かりました。実際はもう少しステータスが多く、編集不可にしたい項目も多いので以下のように足しました。

まずます動くのですが、ステータスにより、編集不可にしたい項目の一番上の指定項目のみ編集不可にできません。

(動くステータスと動かないステータスがあります)

各項目の順番を入れ替えても、必ず一番上のみ動作にばらつきが出るのでフィールドコードが誤っているものではないようです。

ひとまずは、編集不可にできなくてもあまり影響のないものを一番上にする事でしのいでいます。

もし、もしも・・・何か考えられる要因があれば教えて頂けるとありがたいです。

本当に助かりました。ありがとうございました。

kobamaki さま

一番上のフィールドだけ編集できるのは、if文の条件を満たしていないからで、他のフィールドが編集できないのは条件に関係なくdisabledがtrueになっているからと思います。

 

前提としてJavaScriptはセミコロン(;)で区切るまでが1つの文となっています。
if文は原則として

if (/* 条件 */) {
/* 条件に一致した場合の処理 */;
}

処理を波括弧({})で囲む必要があります。ただし、実行する処理が1文(1つ分のセミコロン)の場合は

if (/* 条件 */) /* 条件に一致した場合の処理 */;

と波括弧を省略することができます(ショートハンドといいます)。この書き方をした場合

if (/* 条件 */) /* ここに書いた処理は条件に一致した場合のみ実行 */;
/* ここに書いた処理は条件に関係なく実行 */;

となります。

 

提示されたコードに当てはめると、1行目は条件を満たしていないので実行されず、2行目以降は条件に関係なく実行されているようです。私が提示したコードが実行文が1つだったためショートハンドにしてしまったのが良くなかったと思います。if文の処理は波括弧で囲むと覚えていただければ問題ありません。

mls-hashimoto 様

 

お世話になっております。

本当にありがとうございます。初心者すぎて申し訳ありません。

なるほどですね。非常に分かりやすいご解説ありがとうございます。

最後にもう一つだけ・・可能であれば教えて頂けないでしょうか。

これまで動いていたと思っていたのが、条件を上手に絞れていなかったと判明し、2つ目以降のプロセス管理のステータスでは適用されなくなってしまいました。

青色下線部分なのですが、&&でプロセス管理のステータスをつなげる事はできないのでしょうか。。。。

もしご存知でしたら。。

 

kobamaki さま

「&&」は左辺と右辺両方の条件を満たす場合にtrueを返す演算子(and)なので、「ステータスが『承認』かつ『差し戻し』」という条件になっています。ステータスは1種類しか存在しないので、「ステータスが『承認』または『差し戻し』」という条件にする必要があります。

その場合の演算子(or)は「||」なので

if (record['ステータス'].value === '承認(出張費用未申請)' || record['ステータス'].value === '出張費用差し戻し') {

とする必要があるかと思います。

 

また、別件ですがreturn eventがif文の条件を満たす文の中に入っています。このコード自体は問題なく動作しますが、今後同じようにedit.showで動くコードを追加した際にそちらが動かなくなる可能性があります。

}
return event;
});

と、if文の判定文の外でreturn eventをすることをおすすめします。例外はありますが、基本的にfunction(event)で始めたものはreturn eventすると覚えていただければ問題ありません。

mls-hashimoto 様

ありがとうございます。

理解できるようにご丁寧に説明頂け本当にありがたいです。return eventもご指摘の通り修正しました。

テーブルの編集不可の箇所、一覧画面でも編集不可の点をもう少し強化して以下で完成とさせたいと思います。

もうめげそうだったところを助けて下さり本当にありがとうございました。

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