Office関連

Excel REST APIをPowerShellから呼び出す方法

以前Excel REST APIをVBAから呼び出す方法を紹介しましたが(下記記事参照)、そのときはまだAPIがベータ版でした。

今月初めにようやく正式版がリリースされたので、今回はリリースされたばかりのAPIをPowerShellから呼び出してみたいと思います。

下準備

APIを利用するためにAzure ADの設定やらクライアント IDの取得やらが必要になりますが、細かい説明はここでは割愛します。
下記記事をご参照ください。

  1. アプリケーションの種類:ネイティブ クライアント アプリケーション
  2. リダイレクト URI:http://localhost/ERASample
  3. 他のアプリケーションに対するアクセス許可:Microsoft Graph
  4. デリゲートされたアクセス許可: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のサインイン画面が表示されます。

ExcelRestAPI_PowerShell_01

認証後、問題なくAPIの呼び出しが行われると、指定したセルの値がコンソールに表示されます。

ExcelRestAPI_PowerShell_02

おわりに

今回のコードは、実は「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呼べるんだー!”的に思っていただければ幸いです。

コメント

  • コメント (0)

  • トラックバックは利用できません。

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP