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

【まほうのルミティア】ルミティアステッキ2が発売開始されたよ。前のページ

Officeファイルから作成者などのプロパティを取得するVBScript次のページ

関連記事

  1. Office関連

    Gmail APIを使ってメール送信するVBAマクロ(2)

    前回の記事でGmail APIを使ってメールを送信するVBAマクロを紹…

  2. Office関連

    Gmail APIを使ってメール送信するVBAマクロ(3)

    前回、前々回とGmail APIを扱ってきましたが、今回は前々回の記事…

  3. Windows 10

    【2017年1月版】Microsoft Edgeを操作するVBAマクロ(DOM編)(2)

    昨日の記事で、Microsoft Edgeを操作するVBAコードを改め…

  4. Office関連

    SharpDevelopでExcel用COMアドインを作成する方法

    「SharpDevelopのインストールと日本語化」で紹介しているSh…

  5. Office関連

    PowerPointの自動実行マクロ

    ExcelのAuto_OpenやWordのAutoOpenのように、P…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP