PowerShell を使用して Blue Yonder Workforce Managementへの Shifts 接続を管理する

概要

Blue Yonder 用の Microsoft Teams Shifts コネクタを使用すると、Microsoft Teams の Shifts アプリを Blue Yonder Workforce Management (Blue Yonder WFM) と統合できます。 接続を設定すると、フロントライン ワーカーは、Shifts 内から Blue Yonder WFMでスケジュールをシームレスに表示および管理できます。

Microsoft 365 管理センターまたは PowerShellShifts コネクタ ウィザードを使用して接続を設定できます。 接続が設定されたら、 Shifts コネクタの PowerShell コマンドレットを使用して管理します。

この記事では、PowerShell を使用して次の操作を行う方法について説明します。

注意

この記事では、ウィザードまたは PowerShell を使用して、Blue Yonder WFMへの接続が既に設定されていることを前提としています。

はじめに

この記事の手順を完了するには、Microsoft 365グローバル管理者または Shifts コネクタ管理者である必要があります。

Shifts コネクタ管理者ロールは、Azure ADで作成し、ユーザーに割り当てるカスタム ロールです。 ロールの名前は、"Shifts コネクタ管理者" である必要があります。 ロールには特定のアクセス許可が必要ありませんが、作成時に少なくとも 1 つのアクセス許可を設定する必要があります。 このサービスは、アクセス許可ではなく、ユーザーに対するロールの存在に依存します。 詳細については、「Azure ADでカスタム ロールを作成して割り当てる」と「Azure AD ロールをユーザーに割り当てる」を参照してください。 ロールを作成してユーザーに適用するには、最大で 24 時間かかる場合があることに注意してください。

環境を設定する

注意

この記事のコマンドまたはスクリプトを実行する前に、次の手順に従って環境を設定してください。

  1. PowerShell バージョン 7 以降をインストールします。 詳細なガイダンスについては、「Windowsへの PowerShell のインストール」を参照してください。

  2. PowerShell を管理者モードで実行します。

  3. Microsoft Graph PowerShell モジュールをインストールします。

    Install-Module Microsoft.Graph
    Import-Module Microsoft.Graph
    

    バージョン 1.6.1 以降であることを確認します。

    Get-InstalledModule Microsoft.Graph 
    
  4. Teams プレビュー PowerShell モジュールをインストールします。

    Install-Module -Name MicrosoftTeams -AllowPrerelease -Force
    Import-Module MicrosoftTeams 
    

    少なくともバージョン 4.1.0 で、Shifts コネクタコマンドレットが含まれていることを確認します。

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. スクリプトの実行時にエラーが発生した場合は、PowerShell を終了するように設定します。

    $ErrorActionPreference = "Stop" 
    
  6. スクリプトをWindowsで実行できるようにします。

    Set-ExecutionPolicy bypass 
    
  1. Teams に接続します。

    Connect-MicrosoftTeams
    

    メッセージが表示されたら、管理者の資格情報を使用してサイン インします。 この記事のスクリプトと Shifts コネクタコマンドレットを実行するように設定しました。

接続セットアップの状態を確認する

電子メールで受信した操作 ID を使用して設定した接続の状態を確認するには、

  1. 環境を設定します (まだ設定していない場合)。

  2. 次のコマンドを実行します。 このコマンドは、接続のチーム マッピングの全体的な状態を示します。

    Get-CsTeamsShiftsConnectionOperation -OperationId <YourOperationId>
    

詳細については、「 Get-CsTeamsShiftsConnectionOperation」を参照してください。

接続のエラー レポートを表示する

接続のエラーの詳細を示すレポートを実行できます。 レポートには、成功と失敗したチームとユーザーのマッピングが一覧表示されます。 また、接続に関連付けられているアカウントに関連するすべての問題に関する情報も提供されます。

  1. 環境を設定します (まだ設定していない場合)。

  2. 接続のエラー レポートの一覧を取得します。

    Get-CsTeamsShiftsConnectionErrorReport -ConnectorInstanceId <ConnectorInstanceId>
    
  3. 特定のエラー レポートを表示するには、次のコマンドを実行します。

    Get-CsTeamsShiftsConnectionErrorReport -ErrorReportId <ErrorReportId>
    

詳細については、「 Get-CsTeamsShiftsConnectionErrorReport」を参照してください。

接続エラーを解決する

ユーザー マッピング エラー

Blue Yonder WFM インスタンスの 1 人以上のユーザーが Teams でマップされたチームのメンバーでない場合、ユーザー マッピング エラーが発生する可能性があります。 この問題を解決するには、マップされたチームのユーザーが Blue Yonder WFM インスタンスのユーザーと一致していることを確認します。

マップされていないユーザーの詳細を表示するには、(まだない場合は) 環境を設定 し、次のスクリプトを実行します。

#View sync errors script
Write-Host "View sync errors"
Start-Sleep 1

#Ensure Teams module is of version x
Write-Host "Checking Teams module version"
try {
    Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 4.1.0
} catch {
    throw
}

#List connection instances available
Write-Host "Listing connection instances"
$InstanceList = Get-CsTeamsShiftsConnectionInstance
write $InstanceList

#Get an instance
if ($InstanceList.Count -gt 0){
    $InstanceId = Read-Host -Prompt 'Input the instance ID that you want to retrieve user sync results from'
}
else {
    throw "Instance list is empty"
}

#Get a list of the mappings
Write-Host "Listing team mappings"
$mappings = Get-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId
write $mappings

#For each mapping, retrieve the failed mappings
ForEach ($mapping in $mappings){
    $teamsTeamId = $mapping.TeamId
    $wfmTeamId = $mapping.WfmTeamId
    Write-Host "Failed mapped users in the mapping of ${teamsTeamId} and ${wfmTeamId}:"
    $userSyncResult = Get-CsTeamsShiftsConnectionSyncResult -ConnectorInstanceId $InstanceId -TeamId $teamsTeamId
    Write-Host "Failed AAD users:"
    write $userSyncResult.FailedAadUser
    Write-Host "Failed WFM users:"
    write $userSyncResult.FailedWfmUser
}

アカウント承認エラー

Blue Yonder WFM サービス アカウントまたは Microsoft 365 システム アカウントの資格情報が正しくない場合、または必要なアクセス許可がない場合、アカウント承認エラーが発生する可能性があります。

接続の Blue Yonder WFMサービス アカウントまたは Microsoft 365 システム アカウントの資格情報を変更するには、Set-CsTeamsShiftsConnectionInstance コマンドレットを実行するか、この記事の [接続設定の変更] セクションの PowerShell スクリプトを使用します。

接続設定を変更する

このスクリプトを使用して接続設定を変更します。 変更できる設定には、Blue Yonder WFMサービス アカウントとパスワード、Microsoft 365 システム アカウント、チーム マッピング、同期設定が含まれます。

同期設定には、同期頻度 (分単位) と、Blue Yonder WFMと Shifts の間で同期されるスケジュール データが含まれます。 スケジュール データは、 Get-CsTeamsShiftsConnectionConnectionConnector を実行して表示できる次のパラメーターで定義されています。

  • enabledConnectorScenarios パラメーターは、Blue Yonder WFMから Shifts に同期されるデータを定義します。 オプションは Shift、 , , SwapRequest``UserShiftPreferences, OpenShift, TimeOff``OpenShiftRequest``TimeOffRequest, .

  • enabledWfiScenarios パラメーターは、Shifts から Blue Yonder WFMに同期されるデータを定義します。 オプションは SwapRequest、 、 OpenShiftRequestTimeOffRequest. UserShiftPreferences

    注意

    オープン シフト、オープン シフト要求、スワップ要求、または Shifts と Blue Yonder WFMの間の休暇要求を同期しない場合は、Shifts で機能を非表示にするには、別の手順を実行する必要があります。 このスクリプトを実行した後は、この記事の後半の「 オープン シフトを無効にする、シフト要求を開く、要求をスワップする、および休暇要求を無効にする 」セクションの手順に従っていることを確認します。

重要

変更しない設定の場合は、スクリプトからメッセージが表示されたら、元の設定を再入力する必要があります。

環境をセットアップし (まだない場合)、次のスクリプトを実行します。

#Update connector instance and mapping script
Write-Host "Update connector instance and mapping"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Host "Checking Teams module version"
try {
    Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 4.1.0
} catch {
    throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Host "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
write $connectors
$blueYonder = $connectors | where {$_.Id -match $BlueYonderId}

#List connection instances available
Write-Host "Listing connection instances available"
$InstanceList = Get-CsTeamsShiftsConnectionInstance
write $InstanceList

#Prompt for the WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your WFM user name'
$WfmPwd = Read-Host -Prompt 'Input your WFM password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Get the instance ID
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$InstanceId = Read-Host -Prompt 'Input the instance ID that you want to update'
$Instance = Get-CsTeamsShiftsConnectionInstance -ConnectorInstanceId $InstanceId
$Etag = $Instance.etag

#Change sync setting
$designatorName = Read-Host -Prompt "Input designated actor's user name"
$designator = Get-MgUser -UserId $designatorName
$teamsUserId = $designator.Id
$UpdatedInstanceName = Read-Host -Prompt 'Input new connection instance name'
$updatedConnectorScenarioString = Read-Host -Prompt 'Input new enabled connector scenarios'
$updatedWfiScenarioString = Read-Host -Prompt 'Input new enabled WFI scenarios'
$Delimiters = ",", ".", ":", ";", " ", "`t"
$updatedConnectorScenario = $updatedConnectorScenarioString -Split {$Delimiters -contains $_}
$updatedConnectorScenario = $updatedConnectorScenario.Trim()
$updatedConnectorScenario = $updatedConnectorScenario.Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
$updatedWfiScenario = $updatedWfiScenarioString -Split {$Delimiters -contains $_}
$updatedWfiScenario = $updatedWfiScenario.Trim()
$updatedWfiScenario = $updatedWfiScenario.Split('', [System.StringSplitOptions]::RemoveEmptyEntries)
$adminApiUrl = $Instance.ConnectorSpecificSettingAdminApiUrl
$cookieAuthUrl = $Instance.ConnectorSpecificSettingCookieAuthUrl
$essApiUrl = $Instance.ConnectorSpecificSettingEssApiUrl
$federatedAuthUrl = $Instance.ConnectorSpecificSettingFederatedAuthUrl
$retailWebApiUrl = $Instance.ConnectorSpecificSettingRetailWebApiUrl
$siteManagerUrl = $Instance.ConnectorSpecificSettingSiteManagerUrl
$syncFreq = Read-Host -Prompt 'Input new sync frequency'

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
$AdminEmailList += $AdminEmail
$title    = 'Adding another email'
$question = 'Would you like to add another admin email?'
$choices  = '&Yes', '&No'
$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
if ($decision -eq 1) {
    break
}
}
$UpdatedInstance = Set-CsTeamsShiftsConnectionInstance -ConnectorId $BlueYonderId -ConnectorInstanceId $InstanceId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -DesignatedActorId $teamsUserId -EnabledConnectorScenario $updatedConnectorScenario -EnabledWfiScenario $updatedWfiScenario -Name $UpdatedInstanceName -SyncFrequencyInMin $syncFreq -IfMatch $Etag -ConnectorAdminEmail $AdminEmailList

#Get a list of the mappings
Write-Host "Listing mappings"
$TeamMaps = Get-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId
write $TeamMaps

#Modify a mapping
#Remove a mapping
Write-Host "Removing a mapping"
$TeamsTeamId = Read-Host -Prompt 'Input the Teams team ID that you want to unlink'
$WfmTeamId = Read-Host -Prompt 'Input the WFM team ID that you want to unlink'
Remove-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId -TeamId $TeamsTeamId
Write-Host "Success"

#Add a mapping
Write-Host "Adding a mapping"
$TeamsTeamId = Read-Host -Prompt 'Input the Teams team ID that you want to link'
$WfmTeamId = Read-Host -Prompt 'Input the WFM team ID that you want to link'
New-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId $InstanceId -TeamId $TeamsTeamId -TimeZone "America/Los_Angeles" -WfmTeamId $WfmTeamId
Write-Host "Success"

オープン シフト、オープン シフト要求、スワップ要求、および休暇要求を無効にする

重要

この記事の「 接続設定の変更 」セクションのスクリプトを使用するか、 Set-CsTeamsShiftsConnectionInstance コマンドレットを使用して、オープン シフト、オープン シフト要求、スワップ要求、または休暇要求を無効にすることを選択した場合にのみ、次の手順に従います。 この手順を完了すると、Shifts で機能が非表示になります。 この 2 番目の手順を実行しないと、Shifts で機能が表示され、使用しようとすると"サポートされていない操作" というエラー メッセージが表示されます。

Shifts でオープン シフト、スワップ要求、および休暇要求を非表示にするには、リソースの種類をスケジュールGraph API使用して、Blue Yonder WFM インスタンスにマップした各チームに対してfalse次のパラメーターを設定します。

  • 開いているシフト: openShiftsEnabled
  • スワップ要求: swapShiftsRequestsEnabled
  • 休暇要求: timeOffRequestsEnabled

Shifts で開いているシフト要求を非表示にするには、Shifts の [設定] に移動し、[シフトを 開く ] 設定をオフにします。

ある接続からチームのマップを解除し、別の接続にマップする

注意

Microsoft 365 システム アカウントは、両方の接続で同じである必要があります。 そうでない場合は、"この指定されたアクター プロファイルにチーム所有権の特権がありません" というエラー メッセージが表示されます。

ある接続からチームのマップを解除し、別の接続にマップする場合は、次のようにします。

  1. 環境を設定します (まだ設定していない場合)。

  2. 接続のすべてのチーム マッピングの一覧を表示します。

    Get-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId <ConnectorInstanceId>
    
  3. 接続からチーム マッピングを削除します。

    Remove-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId <ConnectorInstanceId> -TeamId <TeamId>
    
  4. チームを別の接続にマップします。

    New-CsTeamsShiftsConnectionTeamMap -ConnectorInstanceId <ConnectorInstanceId> -TeamId <TeamId> -WfmTeamId <SiteId> -TimeZone <TimeZone>
    

詳細については、「 Get-CsTeamsShiftsConnectionTeamMapRemove-CsTeamsShiftsConnectionTeamMapおよび New-CsTeamsShiftsConnectionTeamMap」を参照してください。

接続の同期を無効にする

このスクリプトを使用して、接続の同期を無効にします。 このスクリプトでは、接続が削除または削除されないことに注意してください。 指定した接続の Shifts と Blue Yonder WFM間でデータが同期されないよう、同期がオフになります。

環境をセットアップし (まだない場合)、次のスクリプトを実行します。

#Disable sync script
Write-Host "Disable sync"
#Ensure Teams module is at least version x
Write-Host "Checking Teams module version"
try {
    Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 4.1.0
} catch {
    throw
}

#List connection instances available
Write-Host "Listing connection instances"
$InstanceList = Get-CsTeamsShiftsConnectionInstance
write $InstanceList

#Get an instance
if ($InstanceList.Count -gt 0){
    $InstanceId = Read-Host -Prompt 'Input the instance ID that you want to disable sync'
    $Instance = Get-CsTeamsShiftsConnectionInstance -ConnectorInstanceId $InstanceId
    $Etag = $Instance.etag
    $InstanceName = $Instance.Name
    $DesignatedActorId = $Instance.designatedActorId
    $adminApiUrl = $Instance.ConnectorSpecificSettingAdminApiUrl
    $cookieAuthUrl = $Instance.ConnectorSpecificSettingCookieAuthUrl
    $essApiUrl = $Instance.ConnectorSpecificSettingEssApiUrl
    $federatedAuthUrl = $Instance.ConnectorSpecificSettingFederatedAuthUrl
    $retailWebApiUrl = $Instance.ConnectorSpecificSettingRetailWebApiUrl
    $siteManagerUrl = $Instance.ConnectorSpecificSettingSiteManagerUrl
    $ConnectorAdminEmail = $Instance.ConnectorAdminEmail
}
else {
    throw "Instance list is empty"
}

#Remove scenarios in the mapping
Write-Host "Disabling scenarios in the team mapping"
$UpdatedInstanceName = $InstanceName + " - Disabled"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$WfmUserName = Read-Host -Prompt 'Input your WFM user name'
$WfmPwd = Read-Host -Prompt 'Input your WFM password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

$UpdatedInstance = Set-CsTeamsShiftsConnectionInstance -ConnectorId $BlueYonderId -ConnectorInstanceId $InstanceId -ConnectorSpecificSettingAdminApiUrl $adminApiUrl -ConnectorSpecificSettingCookieAuthUrl $cookieAuthUrl -ConnectorSpecificSettingEssApiUrl $essApiUrl -ConnectorSpecificSettingFederatedAuthUrl $federatedAuthUrl -ConnectorSpecificSettingLoginPwd $plainPwd -ConnectorSpecificSettingLoginUserName $WfmUserName -ConnectorSpecificSettingRetailWebApiUrl $retailWebApiUrl -ConnectorSpecificSettingSiteManagerUrl $siteManagerUrl -DesignatedActorId $DesignatedActorId -EnabledConnectorScenario @() -EnabledWfiScenario @() -Name $UpdatedInstanceName -SyncFrequencyInMin 60 -IfMatch $Etag -ConnectorAdminEmail $ConnectorAdminEmail

if ($UpdatedInstance.Id -ne $null) {
    Write-Host "Success"
}
else {
    throw "Update instance failed"
}

Shifts コネクタコマンドレット

Shifts コネクタ コマンドレットのヘルプについては、Teams PowerShell コマンドレットリファレンスCsTeamsShiftsConnection を検索してください。 一般的に使用されるコマンドレットへのリンクを次に示します。