以前Excel REST APIをVBAから呼び出す方法を紹介しましたが(下記記事参照)、そのときはまだAPIがベータ版でした。
今月初めにようやく正式版がリリースされたので、今回はリリースされたばかりのAPIをPowerShellから呼び出してみたいと思います。
下準備
APIを利用するためにAzure ADの設定やらクライアント IDの取得やらが必要になりますが、細かい説明はここでは割愛します。
下記記事をご参照ください。
- アプリケーションの種類:ネイティブ クライアント アプリケーション
- リダイレクト URI:http://localhost/ERASample
- 他のアプリケーションに対するアクセス許可:Microsoft Graph
- デリゲートされたアクセス許可:Have full access to user files
PowerShellコード
#Using PowerShell and the Office 365 REST API with OAuth. #https://blogs.technet.microsoft.com/ronba/2016/05/09/using-powershell-and-the-office-365-rest-api-with-oauth/ Function Show-OAuthWindow { param( [System.Uri]$Url ) Add-Type -AssemblyName System.Windows.Forms $form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width=440;Height=640} $web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width=420;Height=600;Url=($url)} $DocComp = { $Global:uri = $web.Url.AbsoluteUri if($Global:Uri -match "error=[^&]*|code=[^&]*"){$form.Close()} } $web.ScriptErrorsSuppressed = $true $web.Add_DocumentCompleted($DocComp) $form.Controls.Add($web) $form.Add_Shown({$form.Activate()}) $form.ShowDialog() | Out-Null $queryOutput = [System.Web.HttpUtility]::ParseQueryString($web.Url.Query) $output = @{} foreach($key in $queryOutput.Keys){ $output["$key"] = $queryOutput[$key] } $output } #------------------------------ # 要変更 #------------------------------ $client_id = "(クライアント ID)" $redirectUrl = "http://localhost/ERASample" $targetFile = "SampleBook.xlsx" $targetSheet = "SampleSheet" #------------------------------ #authorization code取得 Add-Type -AssemblyName System.Web $loginUrl = "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&redirect_uri=" + [System.Web.HttpUtility]::UrlEncode($redirectUrl) + "&client_id=$client_id" $queryOutput = Show-OAuthWindow -Url $loginUrl #access token取得 $AuthorizationPostRequest = "grant_type=authorization_code" + "&" + "redirect_uri=" + [System.Web.HttpUtility]::UrlEncode($redirectUrl) + "&" + "client_id=$client_id" + "&" + "code=" + $queryOutput["code"] + "&" + "resource=" + [System.Web.HttpUtility]::UrlEncode("https://graph.microsoft.com/") $Authorization = Invoke-RestMethod -Method Post ` -ContentType application/x-www-form-urlencoded ` -Uri https://login.microsoftonline.com/common/oauth2/token ` -Body $AuthorizationPostRequest #OneDriveのファイル列挙 #ファイル名を指定してファイルID取得 $items = Invoke-RestMethod -Method Get ` -Headers @{Authorization = ("Bearer "+ $Authorization.access_token)} ` -Uri https://graph.microsoft.com/v1.0/me/drive/root/children $items.value | ForEach-Object{ if($_.name -eq $targetFile){ $fileId = $_.id } } #指定したワークシートのセルC2の値を取得 $apiUrl = "https://graph.microsoft.com/v1.0/me/drive/items/$fileId/workbook/worksheets/$targetSheet/Range(address='C2')" $rng = Invoke-RestMethod -Method Get ` -Headers @{Authorization = ("Bearer "+ $Authorization.access_token)} ` -Uri $apiUrl Write-Host $rng.values
上記コードを実行すると、Office 365のサインイン画面が表示されます。
認証後、問題なくAPIの呼び出しが行われると、指定したセルの値がコンソールに表示されます。
おわりに
今回のコードは、実は「Using PowerShell and the Office 365 REST API with OAuth. – Ron Ben Artzi」のコードをほぼそのまま持ってきただけなのですが、思った以上にシンプルに書けてビックリしました。
WebBrowserコントロールを配置したWindows フォームを動的に作成するこの方法、なかなか使いやすいです。
Invoke-RestMethodコマンドも便利ですね!
PowerShell 3.0以降でないと使えませんが、簡単にWeb APIの呼び出しを行うことができます。
VBAに比べるとだいぶ短くコードが書けるので、ちょっとAPIを試したいときは便利だと思いますが、使いやすさでいうと「Graph Explorer」には遠く及びません。
“PowerShellでもExcel REST API呼べるんだー!”的に思っていただければ幸いです。
この記事へのコメントはありません。