1.システム管理者であることを確認する
プロファイルを利用する場合、名称でなく、IDを利用する(名称変更されたり言語的な影響が出るため)
$Profile.Id <>"システム管理者のプロファイルID"
カスタム権限を作成しプロファイルで割り当てる方法もある。hogehogeはカスタム権限名
AND(NOT($Permission.hogehoge)
2.条件設定→新規行でないこと を判定する
NOT(ISNEW())
3.該当項目が以前空白で今は入力値が存在すること を判定する
NOT(ISBLANK(PRIORVALUE( Email__c )))
4.該当項目に変更があったかどうか判定する。
ISCHANGED( Email__c )
これらをAND条件で結合すると、
AND(
$Profile.Id <>"システム管理者のプロファイルID",
NOT(ISNEW()),
NOT(ISBLANK(PRIORVALUE( Email__c )))
ISCHANGED( Email__c )
)
または
AND(
AND(NOT($Permission.hogehoge),
NOT(ISNEW()),
NOT(ISBLANK(PRIORVALUE( Email__c )))
ISCHANGED( Email__c )
)
ISNEWは新規レコードの作成中に数式が実行されているかどうかを確認し、実行中の場合は TRUE を返す。既存のレコードが更新中の場合は、FALSE を返す。この場合、既存のレコード更新に当たる場合ストップをかけたいので、NOTで囲んでTRUEを返すようにする。
PRIORVALUEは、項目の前の値を返す関数である。更新前が空白かどうかを確認するためだ。これがないと空白の場合でも、更新することができなくなる。