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 365アイコン(imageMso)一覧を作成するにあたって

    Office 2013のアイコン一覧を公開してから4年ほど経ち、その間…

  2. Office関連

    蛍光ペンでマークした部分の文字数をカウントするWordマクロ

    Twitterでたまたま下記のツイートを見つけたので、簡単な処理を考え…

  3. Office関連

    Adobe Readerを利用してPDFファイルのページ数を取得するVBAマクロ

    mougの回答用に書いたコードです。mougは半年でログが消えてし…

  4. Office関連

    シート見出しの右クリックメニューから「コードの表示」を消す方法

    いつもお世話になっている「インストラクターのネタ帳」の管理人である伊藤…

  5. アイコン一覧

    Office 365アイコン(imageMso)一覧(C)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP