Microsoft Entra ID プロビジョニングの SuccessFactors 式マッピング関数

この記事では、SuccessFactors を Microsoft Entra ID ユーザー プロビジョニングに構成するときによく使用される式マッピング関数に関する包括的なガイドを提供します。 これらの関数は、SuccessFactors からデータを変換してマップし、Microsoft Entra ID で適切なユーザー属性を作成するのに役立ちます。

目次

文字列操作関数

基本的な文字列操作

シナリオ 1: 8 文字の文字列を作成するために、先行ゼロで人物 ID を埋め込みます。

ターゲット属性: employeeId

Replace(Join("","00000000",[personIdExternal]), ,"(.*?)(?<id>.{0,8})$", ,"${id}", ,)

例:

  • 入力値: [personIdExternal] = "12345"
  • 式の出力: 00012345

シナリオ 2: コスト センターを先頭にゼロで埋め込み、10 文字にする必要があります。

ターゲット属性: extensionAttribute1

Replace(Join("","0000000000",[costCenterId]), ,"(.*?)(?<id>.{0,10})$", ,"${id}", ,)

例:

  • 入力値: [costCenterId] = "567"
  • 式の出力: 0000000567

シナリオ 3: 埋め込まれた従業員番号にプレフィックスを追加して従業員 ID を作成する必要がある。

ターゲット属性: employeeId

Append("05",Replace(Join("","000000",[employeeId]), ,"(.*?)(?<id>.{0,6})$", ,"${id}", ,))

例:

  • 入力値: [employeeId] = "789"
  • 式の出力: 05000789

テキスト の大文字と小文字の変換

シナリオ 1: 名前を大文字から大文字に変換する必要があります (タイトル ケース)。

ターゲット属性: sn

Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64)))

例:

  • 入力値: [lastName] = "JOHNSON"
  • 式の出力: Johnson

シナリオ 2: 大文字と小文字を適切に書式設定して表示名を作成する必要がある。

ターゲット属性: displayName

Join(", ", Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64))), Join("",Mid([firstName],1,1),ToLower(Mid([firstName],2,64))))

例:

  • 入力値: [lastName] = "SMITH", [firstName] = "JOHN"
  • 式の出力: Smith, John

シナリオ 3: スペースをピリオドに置き換えて、スペースで名前を処理する必要があります。

ターゲット属性: givenName

Replace([firstName]," ", , ,".", , )

例:

  • 入力値: [firstName] = "Mary Ann"
  • 式の出力: Mary.Ann

電子メール アドレスの生成

基本的な電子メールの生成

シナリオ 1: 会社名と姓を使用して、会社固有のドメインで電子メール アドレスを生成する必要があります。

ターゲット属性: mail

SelectUniqueValue(
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "fabrikam.com"), 
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "woodgrove.com")
    )
)

例:

  • 入力値: [company] = "Contoso", [firstName] = "John", [lastName] = "Smith", [middleName] = "Michael"
  • 式の出力: john.smith@contoso.com (最初のオプションを使用した場合は john.m.smith@contoso.com )

従業員グループベースの電子メールの生成

シナリオ 1: 従業員の分類 (永続的と一時的) に基づいて異なる電子メール形式を生成する必要がある。

ターゲット属性: userPrincipalName

StripSpaces(NormalizeDiacritics(Switch([custom06], 
    Join("", [firstName], ".", [lastName], "@ltts.com"), 
    "Temporary", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "External", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "Permanent", Join("", [firstName], ".", [lastName], "@ltts.com")
)))

例:

  • 入力値: [custom06] = "Temporary", [firstName] = "Sarah", [lastName] = "Wilson"
  • 式の出力: sarah.wilson_ext@ltts.com

企業ドメインの検証

シナリオ 1: 特定の企業ドメインに属する電子メール アドレスのみをフローさせる必要がある。

ターゲット属性: mail

IgnoreFlowIfNullOrEmpty(IIF(InStr([emailAddress],"@contoso.com")=0,"",[emailAddress]))

例:

  • 入力値: [emailAddress] = "john.doe@contoso.com"
  • 式の出力: john.doe@contoso.com
  • 代替入力: [emailAddress] = "john.doe@external.com"
  • 代替出力: (空 - 無視)

既存のメールの保存

シナリオ 1: 特定の部門では SuccessFactors からの既存のメールを使用するが、他の部門には新しいメールを生成する必要がある。

ターゲット属性: userPrincipalName

SelectUniqueValue(
    Switch([divisionId], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
        "8900", [email]
    ), 
    Join("1@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
    Join("2@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")
)

例:

  • 入力値: [divisionId] = "8900"、[email] = "existing.user@company.com"、[firstName] = "Mike"、[lastName] = "Brown"
  • 式の出力: existing.user@company.com
  • 代替入力: [divisionId] = "1200"、[firstName] = "Mike"、[lastName] = "Brown"
  • 代替出力: mike.brown@contoso.com

アカウント管理ロジック

基本的なアカウントの状態

シナリオ 1: 雇用状態に基づいてアカウントを無効にする必要があるかどうかを判断する必要があります。

ターゲット属性: accountDisabled

Switch([emplStatus], "False", "741", "False", "749", "True", "746", "True")

例:

  • 入力値: [emplStatus] = "741"
  • 式の出力: False (アカウントが有効)
  • 代替入力: [emplStatus] = "746"
  • 代替出力: True (アカウントが無効)

アドレス一覧のロジックから非表示にする

シナリオ 1: 開始日と終了日に基づいて msExchHideFromAddressLists 属性を設定する必要があります。

ターゲット属性: msExchHideFromAddressLists

IIF(DateDiff("d", CDate(IIF(IsPresent([startDate]), [startDate], DateAdd("d", "10", Now()))), Now()) >= -1, IIF(DateDiff("d", Now(), CDate(IIF(IsPresent([endDate]), [endDate], DateAdd("d", "1", Now())))) >= 0, "FALSE", "TRUE"), "TRUE")

例:

  • 入力値: [startDate] = "2025-01-15", [endDate] = "2025-12-31" (現在の日付: 2025-07-30)
  • 式の出力: FALSE (アドレス一覧から非表示ではありません)
  • 代替入力: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
  • 代替出力: TRUE (アドレス一覧から非表示)

複雑な従業員の状態ロジック

シナリオ 1: ユーザー設定フィールドと採用日に基づいてアカウントを無効にする複雑な要件があります。

ターゲット属性: accountEnabled

Switch([empNavCustomString3], "True",
"62220", Switch([cust_hiredate], 
    IIF(DateDiff("d", CDate([cust_hiredate]), Now()) = 3, 
        Switch([cust_customDate67], 
            IIF(DateDiff("d", CDate([cust_customDate67]), Now())=0, "False", "True"),
            "", "False" 
        ), "True"
    ),
    "", "True"
))

例:

  • 入力値: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-30" (現在の日付: 2025-07-30)
  • 式の出力: False (アカウントが有効)
  • 代替入力: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
  • 代替出力: True (アカウントが無効)

日付関数とアカウントの有効期限

基本アカウントの有効期限

シナリオ 1: SuccessFactors の終了日に基づいてアカウントの有効期限を設定する必要があります。

ターゲット属性: accountExpires

Switch([endDate], 
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-05:00")), 
    "", "9223372036854775807"
)

例:

  • 入力値: [endDate] = "12/31/2025 12:00:00 AM"
  • 式の出力: 133835135990000000 (2025-12-31 23:59:59-05:00 の数値表現)
  • 代替入力: [endDate] = "" (空)
  • 代替出力: 9223372036854775807 (無期限)

雇用の種類に基づく有効期限

シナリオ 1: 雇用の種類 (永続的と請負業者) に基づいて異なるアカウントの有効期限ルールを設定する必要があります。

ターゲット属性: accountExpires

Switch([employmentType], 
    NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "PM", NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 60, CDate([DOB])), ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "CON", NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00"))
)

例:

  • 入力値: [employmentType] = "PM", [DOB] = "1/15/1990 12:00:00 AM"
  • 式の出力: 158488415990000000 (2050-01-15 23:59:59-05:00、生後 60 年後の数値表現)
  • 代替入力: [employmentType] = "CON", [endDate] = "12/31/2025 12:00:00 AM"
  • 代替出力: 133835135990000000 (2025-12-31 23:59:59-05:00 の数値表現)

イベントの理由ベースのアカウントの有効期限

シナリオ 1: 特定の終了イベントと退職日に基づいてアカウントの有効期限を設定する必要があります。

ターゲット属性: accountExpires

Switch([event], 
    IIF(IsPresent([latestTerminationDate]), NumFromDate(Join("", FormatDateTime([latestTerminationDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), "9223372036854775807"), 
    "SEVUNSATP", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "SEVPOSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "POSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00"))
)

例:

  • 入力値: [event] = "SEVUNSATP", [severanceStartDate] = "8/15/2025 12:00:00 AM"
  • 式の出力: 133877247990000000 (2025-08-15 23:59:59-08:00 の数値表現)
  • 代替入力: [event] = "REGULAR", [latestTerminationDate] = "9/30/2025 12:00:00 AM"
  • 代替出力: 133886207990000000 (2025-09-30 23:59:59-08:00 の数値表現)

日付形式の処理

シナリオ 1: NumFromDate でエラーが発生する "12/31/9999" のような無効な日付を処理する必要があります。

ターゲット属性: accountExpires

Switch([endDate],
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), "T23:59:59-04:00")),
    "12/31/9999 12:00:00 AM", NumFromDate("2099-12-31T23:59:59-04:00")
)

例:

  • 入力値: [endDate] = "12/31/9999 12:00:00 AM"
  • 式の出力: 441481535990000000 (2099-12-31T23:59:59-04:00 の数値表現)
  • 代替入力: [endDate] = "8/15/2025 12:00:00 AM"
  • 代替出力: 133877283990000000 (2025-08-15T23:59:59-04:00 の数値表現)

組織単位 (OU) の割り当て

部門ベースの OU の割り当て

シナリオ 1: 部署に基づいて異なる OU にユーザーを配置する必要がある。

ターゲット属性: parentDistinguishedName

Switch([department], "OU=SuccessFactors,DC=contoso,DC=com", 
    "Engineering SG", "OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com", 
    "Shared Services", "OU=Shared Services,OU=SuccessFactors,DC=contoso,DC=com", 
    "Retail - Finance", "OU=Retail Finance,OU=SuccessFactors,DC=contoso,DC=com", 
    "Information Technology BR", "OU=Information Technology,OU=SuccessFactors,DC=contoso,DC=com", 
    "Development", "OU=Development,OU=SuccessFactors,DC=contoso,DC=com"
)

例:

  • 入力値: [department] = "Engineering SG"
  • 式の出力: OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • 代替入力: [department] = "Marketing"
  • 代替出力: OU=SuccessFactors,DC=contoso,DC=com (既定)

雇用状況に基づく OU の割り当て

シナリオ 1: 雇用状態と場所に基づいて、ユーザーを異なる OU に割り当てる必要があります。

ターゲット属性: parentDistinguishedName

Join("",
Switch([emplStatus], "OU=SFProvisoinngUsers", 
"741", Switch([empJobNavCustomString13],
    "OU=SFProvisoinngUsers",
    "LOC1016", "OU=Mysore",
    "LOC1019", "OU=Baroda",
    "LOC1015", Switch([departmentId],
        "OU=Bangalore",
        "DU1026","OU=IT,OU=Bangalore",
        "DU1025","OU=IT,OU=Bangalore"
        )
    ), 
"749", Switch([empJobNavCustomString13],
    "OU=O365-NoSYNC,OU=SFProvisoinngUsers",
    "LOC1016", "OU=O365-NoSYNC,OU=Mysore",
    "LOC1019", "OU=O365-NoSYNC,OU=Baroda",
    "LOC1015", "OU=O365-NoSYNC,OU=Bangalore"
    )
),
",DC=contoso,DC=com")

例:

  • 入力値: [emplStatus] = "741", [empJobNavCustomString13] = "LOC1015", [departmentId] = "DU1026"
  • 式の出力: OU=IT,OU=Bangalore,DC=contoso,DC=com
  • 代替入力: [emplStatus] = "749", [empJobNavCustomString13] = "LOC1016"
  • 代替出力: OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • 代替入力: [emplStatus] = "741", [empJobNavCustomString13] = "LOC9999" (定義されていません)
  • 代替出力: OU=SFProvisoinngUsers,DC=contoso,DC=com (既定)

国ベースの OU の割り当て

シナリオ 1: 非アクティブなユーザーの OU が無効になっている国に基づいて、ユーザーを異なる OU に配置する必要がある。

ターゲット属性: parentDistinguishedName

Switch([activeEmploymentsCount],
    Switch([country], "OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Mexico", "OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Sweden", "OU=Sweden,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Colombia", "OU=Internal Accounts,OU=Colombia,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Brazil", "OU=Internal Accounts,OU=Brazil,OU=Accounts,DC=corp,DC=contoso,DC=com"
    ),
    "0", "OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com"
)

例:

  • 入力値: [activeEmploymentsCount] = "1", [country] = "Mexico"
  • 式の出力: OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • 代替入力: [activeEmploymentsCount] = "0",[country] = "Sweden"
  • 代替出力: OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (無効なユーザーは国に関係なく特別な OU に移動します)
  • 代替入力: [activeEmploymentsCount] = "1", [country] = "Germany"
  • 代替出力: OU=Accounts,DC=corp,DC=contoso,DC=com (特に定義されていない国の既定の OU)

名前の処理と表示名

共通名 (CN) の生成

シナリオ 1: 重複のフォールバック オプションを使用して、一意の共通名を生成する必要があります。

ターゲット属性: cn

SelectUniqueValue(
    NormalizeDiacritics(Join(" ", [firstName], [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], Mid([middleName],1,1), [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], [middleName], [lastName]))
)

例:

  • 入力値: [firstName] = "ホセ"、[lastName] = "García"、[middleName] = "Antonio"
  • 式の出力: Jose Garcia (最初のオプションを使用する場合は Jose A Garcia 、最初の 2 つが取得された場合は Jose Antonio Garcia )

優先名を持つ表示名

シナリオ 1: 使用可能な場合は優先名を使用する表示名を作成する必要があります。それ以外の場合は名にフォールバックします。

ターゲット属性: displayName

Join(", ", Join("", Mid([lastName], 1, 1), ToLower(Mid([lastName], 2, 64), )), Join("", Mid(Coalesce([preferredName], [firstName]), 1, 1), ToLower(Mid(Coalesce([preferredName], [firstName]), 2, 64), )))

例:

  • 入力値: [lastName] = "JOHNSON", [preferredName] = "Mike", [firstName] = "Michael"
  • 式の出力: Johnson, Mike
  • 代替入力: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Robert"
  • 代替出力: Smith, Robert

数値サフィックス付きの表示名

シナリオ 1: 重複する数値サフィックスを持つ一意の表示名を生成する必要がある。

ターゲット属性: displayName

SelectUniqueValue(
    Join("", NormalizeDiacritics(Join("", [lastName], ", ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "2, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "3, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "4, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName])))
)

例:

  • 入力値: [lastName] = "García", [preferredName] = "Mike", [firstName] = "Michael"
  • 式の出力: Garcia, Mike (最初のオプションを使用した場合は Garcia2, Mike など)
  • 代替入力: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
  • 代替出力: Smith, John (最初のオプションを使用した場合は Smith2, John など)

SamAccountName の生成

samAccountName の基本的な生成

シナリオ 1: 適切な文字サニタイズを使用して、最初の最初と最後の名前を使用して samAccountName を作成する必要があります。

ターゲット属性: sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"1"),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"2")
)

例:

  • 入力値: [firstName] = "ホセ", [lastName] = "García-López"
  • 式の出力: jgarcialopez (最初のオプションを使用する場合は jgarcialopez1 、最初の 2 つが取得された場合は jgarcialopez2 )

名の長さが可変の SamAccountName

シナリオ 1: 名から文字数を増やして重複を処理する必要がある。

ターゲット属性: sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,2), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,3), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )
)

例:

  • 入力値: [firstName] = "Christopher", [lastName] = "Anderson"
  • 式の出力: canderson (最初のオプションを使用する場合は chanderson 、最初の 2 つが取得された場合は chranderson )
  • 代替入力: [firstName] = "María", [lastName] = "Rodríguez-Santos"
  • 代替出力: mrodriguezsantos (最初のオプションを使用した場合は marodriguezsantos 、最初の 2 つが取得された場合は marrodriguezsantos )

外部ユーザー名からの SamAccountName

シナリオ 1: 電子メール スタイルの外部ユーザー名からユーザー名部分を抽出する。

ターゲット属性: sAMAccountName

Replace(Mid(Replace(Replace([username],,"(?<id>.*)@(?<domain>.*)",,"${id}",,), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )

例:

  • 入力値: [username] = "john.smith@external.com"
  • 式の出力: johnsmith

ProxyAddresses の構成

proxyAddresses の基本的なセットアップ

シナリオ 1: プライマリ SMTP アドレスとセカンダリ SMTP アドレスを含む複数のプロキシ アドレスを設定する必要がある。

ターゲット属性: proxyAddresses

Split(
    Join(",", 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.mail.onmicrosoft.com")), 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.com")), 
        Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com"))
    ), 
    ","
)

例:

  • 入力値: [personIdExternal] = "12345", [firstName] = "John", [lastName] = "Smith"
  • 式の出力: ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

除算ベースの proxyAddresses

シナリオ 1: 従業員部門に基づいて異なるプロキシ アドレス構成が必要です。

ターゲット属性: proxyAddresses

Split(
    Switch([divisionId], 
        Join(",", 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.mail.onmicrosoft.com")), 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.com")), 
            Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "woodgrove.com"))
        ),			
        "EXEC", Join(",", 
            Append("smtp:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com")), 
            Append("SMTP:", [email])
        )
    ),
    ","	
)

例:

  • 入力値: [divisionId] = "STANDARD", [personIdExternal] = "67890", [firstName] = "Sarah", [lastName] = "Johnson"
  • 式の出力: ["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"]
  • 代替入力: [divisionId] = "EXEC", [firstName] = "Michael", [lastName] = "Brown", [email] = "mbrown@fabrikam.com"
  • 代替出力: ["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

会社固有の proxyAddresses

シナリオ 1: 会社の所属に基づいてプロキシ アドレスを生成する必要がある。

ターゲット属性: proxyAddresses

SelectUniqueValue (
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "fabrikam.com"))
    ),
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "fabrikam.com"))
    )
)

例:

  • 入力値: [company] = "NGC", [firstName] = "必要", [lastName] = "Williams", [middleName] = "James"
  • 式の出力: SMTP:trinidad.williams@contoso.com (最初のオプションを使用した場合は SMTP:trinidad.j.williams@contoso.com )
  • 代替入力: [company] = "National Energy",[firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
  • 代替出力: SMTP:r.thompson@fabrikam.com (または最初のオプションを使用した場合は SMTP:r.m.thompson@fabrikam.com )
  • 代替入力: [company] = "Other Company", [firstName] = "David", [lastName] = "Jones", [middleName] = "Paul"
  • 代替出力: SMTP:david.jones@contoso.com (既定のドメイン、または最初のオプションを使用した場合は SMTP:david.p.jones@contoso.com )

電話番号の処理

基本的な電話番号の抽出

シナリオ 1: 国番号を含まない電話番号部分を抽出する。

ターゲット属性: telephoneNumber

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${phoneNumber}", , ), ,"[()\\s-]+", ,"", , )

例:

  • 入力値: [mobile] = "+1 (555) 123-4567"
  • 式の出力: 5551234567

シナリオ 2: 電話番号から国コードのみを抽出する必要があります。

ターゲット属性: c

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), ,"[()\\s-]+", ,"", , )

例:

  • 入力値: [mobile] = "+44 20 7946 0958"
  • 式の出力: 44

電話番号の既定値

シナリオ 1: フィールドが空のときに、既定の電話番号を指定する必要があります。

ターゲット属性: telephoneNumber

IIF(IsNullOrEmpty([telephoneNumber]),"000-000-0000",[telephoneNumber])
Switch([mobile],[mobile],"","000-000-0000")

例:

  • 入力値: [telephoneNumber] = ""
  • 式の出力: 000-000-0000
  • 代替入力: [mobile] = "555-123-4567"
  • 代替出力: 555-123-4567

プライマリ電話のロジック

シナリオ 1: プライマリとしてマークする電話番号を決定する必要があります。

ターゲット属性: extensionAttribute2

Switch(Join("+",Switch([businessPhoneIsPrimary],[businessPhoneIsPrimary],"","other"),Switch([cellPhoneIsPrimary],[cellPhoneIsPrimary],"","other")), "no primary phone", 
"false+false", "no primary phone",
"true+false", "business phone is primary",
"false+true", "cell phone is primary",
"true+true", "business phone is primary, cell phone is primary",
"other+true", "cell phone is primary",
"other+false", "no primary phone",
"true+other", "business phone is primary",
"false+other", "no primary phone")

例:

  • 入力値: [businessPhoneIsPrimary] = "true", [cellPhoneIsPrimary] = "false"
  • 式の出力: business phone is primary
  • 代替入力: [businessPhoneIsPrimary] = "false", [cellPhoneIsPrimary] = "true"
  • 代替出力: cell phone is primary
  • 代替入力: [businessPhoneIsPrimary] = "", [cellPhoneIsPrimary] = "true"
  • 代替出力: cell phone is primary

国と場所に基づくロジック

国コードマッピング

シナリオ 1: 国名を ISO 国コードにマップする必要がある。

ターゲット属性: c

Switch([country], ,
  "Trinidad and Tobago", "TT",
  "Barbados", "BB"
)

例:

  • 入力値: [country] = "トレニダーアンドトバゴ"
  • 式の出力: TT

シナリオ 2: 国を数値の国コードにマップする必要があります。

ターゲット属性: countryCode

Switch([country], ,
  "Trinidad and Tobago", "780",
  "Barbados", "52"
)

例:

  • 入力値: [country] = "バルバドス"
  • 式の出力: 52

場所ベースの電子メール ドメイン

シナリオ 1: 地理的な場所に基づいて異なる電子メール ドメインを割り当てる必要がある。

ターゲット属性: mail

SelectUniqueValue (
    Switch([country], 
        Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    ),
    Switch([country], 
        Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    )
)

例:

  • 入力値: [country] = "India", [firstName] = "Raj", [lastName] = "Patel"
  • 式の出力: raj.patel@fabrikam.com (最初のオプションを使用した場合は 1raj.patel@fabrikam.com )
  • 代替入力: [country] = "Netherlands", [firstName] = "Jan", [lastName] = "van der Berg"
  • 代替出力: jan.vanderberg@contoso.com (または最初のオプションを使用した場合は 1jan.vanderberg@contoso.com )
  • 代替入力: [country] = "Germany",[firstName] = "Klaus", [lastName] = "Müller"
  • 代替出力: klaus.muller@fabrikam.com (既定のドメイン、または最初のオプションを使用した場合は 1klaus.muller@fabrikam.com )

従業員の分類と臨時従業員

雇用の種類の分類

シナリオ 1: 従業員の種類コードを読み取り可能な説明にマップする必要があります。

ターゲット属性: extensionAttribute3

Switch([employeeType],"Default-value",
    "31202","Employee",
    "31230","Contractor"
)

例:

  • 入力値: [employeeType] = "31202"
  • 式の出力: Employee
  • 代替入力: [employeeType] = "99999"
  • 代替出力: Default-value

臨時作業者の識別

シナリオ 1: 特定のワーカーを識別し、別の方法で処理する必要があります。

ターゲット属性: extensionAttribute4

Switch([isContingentWorker], "N/A", "True", "Contractor", "False", "Employee")

例:

  • 入力値: [isContingentWorker] = "True"
  • 式の出力: Contractor

個人用タイトル マッピング

シナリオ 1: 個人用タイトル コードを適切なタイトルにマップする必要がある。

IgnoreFlowIfNullOrEmpty(Switch([personalTitle], "", "4443", "Dr.", "4444", "Prof.", "4445", "Prof. Dr."))

例:

  • 入力値: [personalTitle] = "4443"
  • 式の出力: Dr.
  • 代替入力: [personalTitle] = ""
  • 代替出力: (空 - 無視)

高度なシナリオ

条件付き部門の処理

シナリオ 1: 使用可能な場合はグローバル割り当て部門を使用し、それ以外の場合は通常の部門にフォールバックします。

ターゲット属性: department

Switch([globalAssignmentDepartment],[globalAssignmentDepartment],
"",[department])

例:

  • 入力値: [globalAssignmentDepartment] = "Global IT", [department] = "Local IT"
  • 式の出力: Global IT
  • 代替入力: [globalAssignmentDepartment] = "", [department] = "Sales"
  • 代替出力: Sales

論理的な削除の電子メール処理

シナリオ 1: 書き戻しシナリオでユーザーが論理的に削除された場合は、電子メール アドレスを変更する必要があります。

ターゲット属性: mail

IIF([IsSoftDeleted]="True", Join("_",FormatDateTime(Now(), , "M/d/yyyy h:mm:ss tt", "yyyy-MM-dd"),[mail]), [mail])

例:

  • 入力値: [IsSoftDeleted] = "True",[mail] = "john.smith@company.com" (現在の日付: 2025-07-30)
  • 式の出力: 2025-07-30_john.smith@company.com
  • 代替入力: [IsSoftDeleted] = "False",[mail] = "jane.doe@company.com"
  • 代替出力: jane.doe@company.com

終了ロジックを使用した複雑な OU の割り当て

シナリオ 1: 特定の日数が経過した後、終了したユーザーを特別な OU に移動する必要がある。

ターゲット属性: parentDistinguishedName

IIF(DateDiff("d", Now(), CDate(Switch([latestTerminationDate], [latestTerminationDate], "", "9999-01-01"))) <= -14,
    "OU=DELETED,DC=company,DC=com",
    Switch([department], "OU=Default,DC=company,DC=com", 
        "Engineering", "OU=Engineering,DC=company,DC=com", 
        "Finance", "OU=Finance,DC=company,DC=com"
    )
)

例:

  • 入力値: [latestTerminationDate] = "2025-07-10"、[department] = "Engineering" (現在の日付: 2025-07-30)
  • 式の出力: OU=DELETED,DC=company,DC=com (14 日以上前に終了)
  • 代替入力: [latestTerminationDate] = "2025-07-25", [department] = "Finance"
  • 代替出力: OU=Finance,DC=company,DC=com (14 日以内に終了)

従業員クラスを使用した複数会社の UPN 生成

シナリオ 1: 会社と従業員のクラス情報の両方に基づいて UPN を生成する必要があります。

ターゲット属性: userPrincipalName

SelectUniqueValue (
    Switch([employeeClass], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([employeeClass], 
        Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    )
)

例:

  • 入力値: [employeeClass] = "1915", [firstName] = "Anna", [lastName] = "Johnson"
  • 式の出力: anna.johnson@fabrikam.com (最初のオプションを使用した場合は 01anna.johnson@fabrikam.com )

アポストロフィと特殊文字の処理

シナリオ 1: Azure AD Connect の互換性のために、電子メール アドレスからアポストロフィとダッシュを削除する必要があります。

ターゲット属性: mail

SelectUniqueValue(
  Switch ([divisionId], 
    Replace(Join("@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
    "8900", [email]
  ), 
  Replace(Join("1@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
  Replace(Join("2@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , )
)

例:

  • 入力値: [divisionId] = "1200", [preferredName] = "Mary-Ann", [firstName] = "Mary", [lastName] = "O'Connor"
  • 式の出力: maryann.oconnor@contoso.com (アポストロフィとダッシュが削除されました)
  • 代替入力: [divisionId] = "8900"、[email] = "existing.user@company.com"
  • 代替出力: existing.user@company.com

SIP アドレスの生成

シナリオ 1: Skype for Business/Teams 統合用の SIP アドレスを生成する必要がある。

ターゲット属性: proxyAddresses

SelectUniqueValue( 
    Append("sip:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("02@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"))
)

例:

  • 入力値: [firstName] = "David", [lastName] = "Wilson"
  • 式の出力: sip:david.wilson@contoso.com (最初のオプションを使用した場合は sip:01david.wilson@contoso.com )
  • 代替入力: [firstName] = "María José", [lastName] = "González-Pérez"
  • 代替出力: sip:mariajose.gonzalezperez@contoso.com (最初のオプションを使用した場合は sip:01mariajose.gonzalezperez@contoso.com 、最初の 2 つが取得された場合は sip:02mariajose.gonzalezperez@contoso.com )

書き戻しの条件付きロジック

シナリオ 1: 特定の日付条件に基づいて、条件付きでメール アドレスを書き戻す必要があります。

ターゲット属性: mailNickname

IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]))

例:

  • 入力値: [extensionAttribute9] = "2025-07-31", [mail] = "user@company.com" (現在の日付: 2025-07-30)
  • 式の出力: (日付の差が 1 日であるため、空 - 無視)
  • 代替入力: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com"
  • 代替出力: user@company.com

シナリオ 2: ライトバック シナリオで不足している属性を処理する必要があります。

ターゲット属性: mailNickname

IgnoreFlowIfNullOrEmpty(IIF(IsPresent([extensionAttribute9]),IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]),"noemail@contoso.com"))

例:

  • 入力値: [extensionAttribute9] = "" (空)、[mail] = "user@company.com"
  • 式の出力: noemail@contoso.com
  • 代替入力: [extensionAttribute9] = "2025-08-01",[mail] = "user@company.com" (現在の日付: 2025-07-30)
  • 代替出力: user@company.com

ベスト プラクティス

  • 一意性を必要とするすべての属性 (UPN、samAccountName、電子メール) に SelectUniqueValue を使用します。

  • IsNullOrEmptyIsPresentSwitchCoalesceなどの関数を使用して、null 値と空の値を処理します。

  • 名前を処理するときに NormalizeDiacritics と StripSpaces を使用して、システム間の互換性を確保します。

  • 運用環境で実装する前に、JSONPath テスターで JSONPath 式を検証します。

  • 変換エラーを回避するには、SuccessFactors の日付フィールドを操作するときに適切な日付書式を使用します。

  • 日付比較とアカウントの有効期限ロジックを使用する場合は、タイム ゾーンを検討してください。

  • 条件付き属性フローと書き戻しシナリオでは IgnoreFlowIfNullOrEmpty を使用します。

  • 複雑な Switch ステートメント はデバッグが困難になる可能性があるため、十分にテストしてください。

  • ビジネス ロジック を明確に文書化します。特に、複雑な雇用状態とアカウント管理ルールについて説明します。

  • 正規表現パターンを慎重に使用 し、実装前にオンライン正規表現テスターで検証します。

その他のリソース