前回の記事で新しく追加されたGoogle Docs APIを紹介しました。
今回はDocs APIをVBAから呼び出して、既存ドキュメントの情報の取得や新規ドキュメントの作成を行いたいと思います。
大まかな処理の流れ
VBAからDocs APIを呼び出す場合、大まかな処理の流れは下記のようになります。
authorization code取得
↓
access token取得
↓
Authorizationヘッダーにaccess tokenを含めてAPI呼び出し
一般的なREST APIの呼び出しと同様ですね!
クライアントIDとクライアントシークレットの取得
※下記手順は 2019/2/18 時点のものです。今後のバージョンアップによって、画面や手順が変更される可能性がありますので、その点はご注意ください。
まずはAPIの呼び出しに必要なクライアントIDとクライアントシークレットを取得します。
- Google Developers Consoleにアクセスし、Google アカウントでログインします。
- ダッシュボード画面が表示されるので、「プロジェクトの選択」から「新しいプロジェクト」を選択します。既存のプロジェクトを使用したい場合は、新しいプロジェクトではなく既存プロジェクトを選択してください。
- 新しいプロジェクト画面が表示されるので、プロジェクト名を入力し、「作成」ボタンをクリックします。
- プロジェクトが作成されたら、作成されたプロジェクトが選択されていることを確認し、「ライブラリ」をクリックします。
- 検索ボックスに“docs”と入力し、結果としてヒットする「Google Docs API」をクリックします。
- 「有効にする」ボタンをクリックします。
- Google Docs AP画面が表示されるので、「認証情報」から「認証情報を作成」ボタンをクリックします。
- 使用するAPIは「Google Docs AP」、APIを呼び出す場所は「その他のUI (Windows、 CLI ツールなど)」、アクセスするデータの種類は「ユーザーデータ」を選択し、「必要な認証情報」ボタンをクリックします。
- 適当なOAuthクライアント名を入力し、「OAuth クライアント IDを作成」ボタンをクリックします。
- OAuth 2.0 同意画面のメールアドレスとユーザーに表示するサービス名を入力し、「次へ」ボタンをクリックします。
- クライアントIDが表示されたら「完了」ボタンをクリックします。
- 認証情報画面から、作成したクライアントの「OAuth クライアントを編集」ボタンをクリックします。
- クライアントIDとクライアントシークレットが表示されるので、メモ帳などのテキストエディタにコピーしておきます。
Google Docs APIを使ってGoogle ドキュメントを操作するVBAマクロ
下準備ができたので実際にコードを書いていきます。
認証処理など、詳しい処理の流れはGoogle Developers ガイドをご参照ください。
下記コードはScriptControlを使用しているため、64ビット版のOfficeでは動作しません。
また、実行する際はコード中のclient_id、client_secret、document_idを書き換えてください。
Option Explicit '-------------------------------------------------- '※ 要変更 '-------------------------------------------------- Private Const client_id As String = "(クライアントID)" Private Const client_secret As String = "(クライアントシークレット)" Private Const document_id As String = "(情報を取得したいドキュメントのID)" '-------------------------------------------------- Private Const redirect_uri As String = "urn:ietf:wg:oauth:2.0:oob" Public Sub CallGoogleDocsAPI() 'Google Docs API v1の呼び出し Dim access_token As String Dim json_str As String Dim new_document_id As String Dim sc As Object Dim json As Object Dim req As Object Dim dat As Variant Const request_base_url As String = "https://docs.googleapis.com/v1/documents" access_token = GetAccessToken If Len(Trim(access_token)) > 0 Then Set req = CreateObject("WinHttp.WinHttpRequest.5.1") Set sc = CreateObject("ScriptControl") sc.Language = "JScript" '指定したドキュメントのタイトル取得 With req .Open "GET", request_base_url & "/" & document_id, False .SetRequestHeader "Content-Type", "application/json; charset=UTF-8" .SetRequestHeader "Authorization", "Bearer " & access_token .Send Select Case .Status Case 200 json_str = "(" & .responseText & ")" Set json = sc.CodeObject.eval(json_str) Debug.Print "ドキュメントのタイトル:" & VBA.CallByName(json, "title", VbGet) End Select End With '新規ドキュメントの作成 With req dat = "{""title"": ""APIから作成した文書""}" 'タイトル設定 .Open "POST", request_base_url, False .SetRequestHeader "Content-Type", "application/json; charset=UTF-8" .SetRequestHeader "Authorization", "Bearer " & access_token .Send dat Select Case .Status Case 200 json_str = "(" & .responseText & ")" Set json = sc.CodeObject.eval(json_str) new_document_id = VBA.CallByName(json, "documentId", VbGet) End Select End With '文字列の挿入 If Len(Trim(new_document_id)) > 0 Then With req dat = "{""requests"":[{""insertText"":{""location"":{""index"":1},""text"":""こんにちは、世界!""}}]}" '挿入する文字列設定 .Open "POST", request_base_url & "/" & new_document_id & ":batchUpdate", False .SetRequestHeader "Content-Type", "application/json; charset=UTF-8" .SetRequestHeader "Authorization", "Bearer " & access_token .Send dat Select Case .Status Case 200 Debug.Print "新規作成した文書(ドキュメントID:" & new_document_id & ")への文字列挿入が成功しました。" End Select End With End If End If End Sub Private Function GetAccessToken() As String 'access token取得 Dim auth_code As String Dim access_token As String Dim json_str As String Dim sc As Object Dim json As Object Dim dat As Variant Const token_base_url As String = "https://accounts.google.com/o/oauth2/token" Const grant_type As String = "authorization_code" auth_code = GetAuthorizationCode If Len(Trim(auth_code)) > 0 Then dat = "code=" & auth_code & "&" & _ "client_id=" & client_id & "&" & _ "client_secret=" & client_secret & "&" & _ "redirect_uri=" & redirect_uri & "&" & _ "grant_type=" & grant_type With CreateObject("WinHttp.WinHttpRequest.5.1") .Open "POST", token_base_url, False .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" .Send dat Select Case .Status Case 200 Set sc = CreateObject("ScriptControl") sc.Language = "JScript" json_str = "(" & .responseText & ")" Set json = sc.CodeObject.eval(json_str) access_token = VBA.CallByName(json, "access_token", VbGet) End Select End With End If GetAccessToken = access_token End Function Private Function GetAuthorizationCode() As String 'authorization code取得 Dim url_auth As String Dim approval_title As String Dim code As String Dim scopes As Variant Dim ary As Variant, ary2 As Variant Dim i As Long Const READYSTATE_COMPLETE = 4 Const auth_base_url As String = "https://accounts.google.com/o/oauth2/auth" Const approval_url As String = "https://accounts.google.com/o/oauth2/approval/" Const response_type As String = "code" 'スコープ設定 scopes = Array("https://www.googleapis.com/auth/drive", _ "https://www.googleapis.com/auth/documents") url_auth = auth_base_url & "?redirect_uri=" & EncodeURL(redirect_uri) & _ "&client_id=" & client_id & _ "&response_type=" & response_type & _ "&scope=" & EncodeURL(Join(scopes, " ")) With CreateObject("InternetExplorer.Application") .Visible = True .AddressBar = False .MenuBar = False .StatusBar = False .Toolbar = False .Width = 600 .Height = 480 .Navigate url_auth While .ReadyState <> READYSTATE_COMPLETE Or _ .Busy = True Or _ (StrComp(Left(.LocationURL, Len(approval_url)), approval_url) <> 0) DoEvents Wend approval_title = .document.Title .Quit End With If InStr(approval_title, "Success ") Then approval_title = Replace(approval_title, "Success ", "") ary = Split(approval_title, "&") For i = LBound(ary) To UBound(ary) ary2 = Split(ary(i), "=") If LCase(ary2(0)) = "code" Then code = ary2(1) Exit For End If Next End If GetAuthorizationCode = code End Function Private Function EncodeURL(ByVal str As String) As String 'URLエンコード With CreateObject("ScriptControl") .Language = "JScript" EncodeURL = .CodeObject.encodeURIComponent(str) End With End Function
実行結果
上記コード(CallGoogleDocsAPI)を実行し、問題なくAPIの呼び出しが行われると、指定したドキュメントのタイトルの取得(documents.get)と、新規ドキュメントの作成(documents.create)、及び文字列の挿入(documents.batchUpdate)が行われます。
Docs APIを使って具体的にどのような処理ができるのかは、公式のリファレンスを見ると良いでしょう。
おわりに
APIの呼び出しはJSONでやり取りすることになるので、上記コードを見れば分かる通り、素のVBAでは処理が非常に冗長になります。
認証含めて、いちいち面倒くさい処理を行わなければならないので、私個人としてはVBAからのAPI呼び出しは正直お薦めしません😅
ただ単にAPIを試したいだけであれば、素直にGoogle APIs Explorerを使うことをお薦めします。
この記事へのコメントはありません。