@Name 是處理 Notes 名稱的瑞士刀:三種格式互轉、抽出任一段
Notes 名稱有三種長相:canonical(CN=Mary Tsen/OU=Illustration/O=Acme/C=US,帶標籤的完整式)、abbreviated(Mary Tsen/Illustration/Acme/US,去掉標籤)、common(Mary Tsen,只有人名)。站上先前那篇 NotesName 的三種格式 講過為什麼這三種會讓比對悄悄失敗;這一篇講在 formula 裡怎麼在它們之間互轉、怎麼抽出其中一段。
主角只有一個函式:@Name。官方說它「allows you to manipulate hierarchical names」——一把處理階層式名稱的瑞士刀。
重點摘要
@Name([action]; name):一個函式、靠 action 關鍵字決定要做什麼。- 三種格式互轉:
[CANONICALIZE]展開成 canonical、[ABBREVIATE]收成 abbreviated、[CN]只取 common name。 - 抽出任一段:
[O]組織、[OU1]/[OU2]各級組織單位、[G]名、[S]姓、[C]國別、[Q]世代(Jr 之類)。 - 取當前使用者:
@UserName回 canonical、@V3UserName回 abbreviated。 - 那個坑:在 server agent 裡,
@UserName的「當前使用者」是簽署者,不是觸發的人;官方也說它不該當安全機制。
@Name:三種格式互轉
最常用的三個 action,正好對應三種格式:
@Name([CANONICALIZE]; "Mary Tsen/Illustration/Acme/US") → CN=Mary Tsen/OU=Illustration/O=Acme/C=US
@Name([ABBREVIATE]; "CN=Mary Tsen/OU=Illustration/O=Acme/C=US") → Mary Tsen/Illustration/Acme/US
@Name([CN]; "CN=Mary Tsen/OU=Illustration/O=Acme") → Mary Tsen[CANONICALIZE]:把 abbreviated 補回完整的 canonical(補上CN=/OU=/O=/C=標籤)。要存進 Readers/Authors 欄位、或要跟儲存值精確比對時,用這個把兩邊都正規化。(小心:名稱若本身缺了某幾段,[CANONICALIZE]會拿當前使用者 ID 的對應段補上——處理不完整的名稱時要留意。)[ABBREVIATE]:反過來,去掉標籤成 abbreviated——給人看的顯示格式。[CN]:只留人名。
(這正好呼應 NotesName 那篇 的教訓:Notes 底層存的是 canonical,所以「比對前先把兩邊都 [CANONICALIZE]」是最穩的做法。)
@Name:抽出其中一段
@Name 也能從一個名稱裡挖出某一段——做分類、做權限判斷時很有用:
| action | 取出 |
|---|---|
[CN] | common name(人名) |
[O] | 組織(O) |
[OU1]、[OU2]… | 第 n 級組織單位 |
[G] | 名(given name) |
[S] | 姓(surname) |
[C] | 國別/地區 |
[Q] | 世代限定詞(如 Jr) |
例如「這個人屬於哪個部門」就是 @Name([OU1]; PersonName)。還有一個 [TOKEYWORD]——把階層反轉、用反斜線串起來(US\Acme\R&D\…),是拿來做 view 分類用的。
取當前使用者:@UserName 與 @V3UserName
要拿「現在這個人是誰」,兩個函式:
@UserName:官方說它回「the current user name」,階層式名稱時是 canonical 格式(含 CN、OU、O、C 標籤)。可帶一個 index:0主要名(預設)、1替代名(R5 起)。@V3UserName:回的是abbreviated 格式(去掉那些標籤)。
同一個 ID,兩者的差別就是格式:
@UserName → CN=Mary Tsen/OU=Illustration/.../O=WorkSavers/C=US@V3UserName → Mary Tsen/Illustration/.../WorkSavers/US想要 common name?把 @UserName 再套一層 @Name([CN]; @UserName) 就好。
那個一定要知道的坑
@UserName 有一個會坑很多人的行為:在 server 上跑的 agent,@UserName 回的是「簽署者」,不是實際觸發 agent 的人。 官方也點名它在公開 view(public view)裡結果不可預測、而且不該拿來當安全機制。
換句話說:@UserName 適合在本機、或私有 view 裡判斷「這是不是我」(像 SELECT @UserName = AssignedTo 做個人 view);但一旦到了 server 端要做「誰能看什麼」的真正權限控制,別靠它——那是 Readers 欄位與 ACL 的工作。
小結
處理 Notes 名稱,formula 裡幾乎都是 @Name 一把抓:[CANONICALIZE]/[ABBREVIATE]/[CN] 換格式、[O]/[OU1]/[S] 抽段;取當前使用者用 @UserName(canonical)或 @V3UserName(abbreviated),但記得 server 上它是簽署者、也不是安全機制。
下一篇轉到日期與時間——@Adjust、@Date、@Now/@Today、@Modified 怎麼在 formula 裡做日期運算。