以前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呼べるんだー!”的に思っていただければ幸いです。



















この記事へのコメントはありません。