Blue Prism で Google Spread Sheet を読み書きする

# はじめに

この記事では、Blue Prism の標準VBO である 「Google Sheets VBO」 を使って、Google Spread Sheet を読み書きする手順を紹介します。
Blue Prism 上での手順はとても簡単なのですが、Google API 側の事前準備が少々面倒です。[標準ドキュメント（要ログイン）](https://portal.blueprism.com/documents/v65-data-sheet-google-sheets-vbo-ja-jp)にも2Pほどで簡潔に説明されています。
あとで忘れそうな内容なので、備忘録として記述しました。

利用前の準備
------------------------------------------------

### Goole API を利用するプロジェクトを作成する
連携したい Google Spread Sheet と同じ Google Account にログインした状態で、
[Google Cloud Platform のコンソール](https://console.cloud.google.com/)を開き、プロジェクトの選択ボタンをクリックします。
<img width="1201" alt="00.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/b461f8e9-3197-c385-1512-586fe2bbfeda.jpeg">


「プロジェクトの選択」ダイアログが表示されるので、「新しいプロジェクト」をクリックします。
<img width="779" alt="01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/c2f24b29-7ff7-50eb-61c8-a807f7e83e8a.jpeg">


適当な情報を入力し、「作成」ボタンをクリックします。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/67306f65-dfe2-d037-dc79-6bfb2e79dc04.jpeg)



先ほど作成したプロジェクトが選択されていることを確認し、ハンバーガーメニューをクリックします。
<img width="1199" alt="03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/a5ccbbfa-3471-d99b-74f1-7b35c6fab58e.jpeg">



### Sheet APIを有効化する

「APIとサービス > ダッシュボード」を選択します。
<img width="941" alt="04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/46ab2802-baa0-2fc9-b377-55d9855e6e07.jpeg">


「APIとサービスを有効化」をクリックします。
<img width="946" alt="05.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/532b71c4-a235-872a-6cce-a848c086be5f.jpeg">


「APIライブラリへようこそ」画面の「APIとサービスを検索」フォームに、"Sheet" と入力します。
<img width="993" alt="06.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/6eacc4b0-c2d6-5565-5f05-4c728180e330.jpeg">


「Google Sheets API」画面が表示されるので、「有効にする」をクリックします。
<img width="949" alt="07.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/e35adb74-7812-4b20-4d3a-88355f3ee732.jpeg">


### 同意画面を作成する

ハンバーガーメニューから、「APIとサービス > OAuth同意画面」をクリックします。
<img width="942" alt="100.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/f971f0c2-4db9-338c-0fb9-54d50e9cd29e.jpeg">


「OAuth同意画面」にて「外部」を選択し、「作成」をクリックします。
※ GSuiteのユーザーであれば、「内部」も選択できそうです。
<img width="942" alt="12.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/d9649eca-35f7-1cec-330b-c105086600a2.jpeg">


「OAuth同意画面」にて、適当な「アプリケーション名」を記入し、「スコープを追加」をクリックします。
<img width="956" alt="13.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/2f6511f8-4359-f7e5-3129-9633021c1339.jpeg">


「Google Sheets API」を選択し、「追加」をクリックします。
<img width="781" alt="14.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/4c66f354-e185-c2a3-036e-565ebb90c1c5.jpeg">


「OAuth同意画面」に戻ってくるので、「保存」をクリックします。
<img width="945" alt="15.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/df067b2a-f6ae-7fc8-00d6-ff344379a7f2.jpeg">


### 認証情報を作成する

メニューから、「認証情報」をクリックします。
<img width="944" alt="101.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/e42c78a0-8b59-91bd-f866-dcf858a5d891.jpeg">


「認証情報を作成」をクリックし、「OAuthクライアントID」を選択します。
<img width="952" alt="16.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/b27adb67-2712-dfc1-6c66-dd7aaa64e3bc.jpeg">


「OAuthクライアントIDの作成」画面で、「アプリケーションの種類」の「デスクトップアプリ」を選択します。
「名前」に適切な値を入力し「作成」をクリックします。
（以前はアプリケーションの種類で、「その他」が選択できましたが、2020年8月現在はできなくなっているようです）
![17_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/dda729ef-7a74-3c31-48cb-004b05ad619c.jpeg)


「OAuthクライアントを作成しました」というダイアログが表示されます。
「クライアントID」「クライアントシークレット」を手元にコピーしておきます。
<img width="551" alt="18.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/9db7c4ca-310c-a2fe-ffff-e51ee3412847.jpeg">


「認証情報」画面に戻ると、「OAuth2.0クライアントID」のところに、先ほど作成したIDが表示されていることが確認できます。
<img width="1191" alt="19.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/4718b061-79d1-ba6c-ab9d-4cc5ceef78c9.jpeg">



### 読み取るスプレッドシートを作成する

先ほど作成した認証情報と同じ Google アカウントでログインした状態で、読み取る対象のスプレッドシートを適当に準備します。今回は下図のようなものを用意しました。
このとき、「Sheet ID」と呼ばれる値が必要になりますので、URLから該当する部分（図の赤枠部分）をコピーして控えておきます。
<img width="865" alt="21_2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/a8bd6a6b-1540-d98a-1d79-e406327121ab.jpeg">


Blue Prism 側の手順
------------------------------------------------

### 環境変数を設定する
インタラクティブクライアントのシステムタブを開き、「オブジェクト > 環境変数」にて、「Google Sheets API Client ID」「Google Sheets API Client Secret」の2つの環境変数を定義します。値は先ほど控えておいたものを設定し、右下の「適用」ボタンをクリックします。
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/e528f81f-2aa7-329b-fb03-cfd41c5ba4ee.jpeg)


### シートのデータを読み取るプロセスを作成する
新しいプロセスを作成し、「Google Sheets::Get Range Values」アクションを図のように設定します。出力結果をマップするデータアイテムも作成しておきます。
![21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/d1266388-d84c-1064-0329-d425b4aaa7ac.jpeg)


「Google Sheets::Get Range Values」を開き、入力タブで値を設定します。
* 「Sheet ID」には、先ほど控えておいた Google Spread Sheet のURLの一部の値を設定します。
* 「Range」には、Excel でいうところの「R1C1」形式で読み取るレンジの値を設定します。
![21_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/c6c68629-345f-a6b8-b626-4e00e03c4871.jpeg)


出力タブではデータアイテムへのマップを定義しておきます。
![21_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/54543bc1-00aa-685a-3106-f61c86aca9a4.jpeg)


### 認証し、同意画面で同意する
作成したプロセスを初回実行すると、ブラウザが立ち上がり、Googleにログインを促されますので、認証します。
![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/67f7a285-3efc-385e-3308-bf637565e1c6.jpeg)


「このアプリは確認されていません」という画面が表示されるので、「詳細」をクリックします。
![23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/2a993d2f-5c1c-ccda-1a29-7498410727a5.jpeg)


表示された「Google Spread Sheet VBO Test（安全ではないページ）に移動」をクリックします。（文言は Google Cloud Platform のコンソールで設定した内容に依存します）
![24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/524a321d-192b-3049-6139-29a781c293b7.jpeg)


「権限の付与」ダイアログが表示されるので、「許可」をクリックします。
![25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/77412f4c-1775-9e31-8454-fe6c316af7f3.jpeg)


一旦権限の付与が成功すると、アクセストークン/リフレッシュトークンが保存され、プロセスが最後まで実行できます。データアイテムの「現在値」タブを開くと、読み込んだ値を確認できます。
![26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/a332848a-e9db-caba-e645-e424463e107b.jpeg)



### 補足：トークンの保存先

[OAuth 2.0 for Google Regular Accounts (installed applications)](https://afterlogic.com/mailbee-net/docs/OAuth2GoogleRegularAccountsInstalledApps.html) というドキュメントの "Using MailBee.NET and Google API to access a user's e-mail account" というセクションに記載があります。
```C:\Users\UserName\AppData\Roaming\Google.Apis.Auth\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user ``` というファイル名で accessToken, refreshToken が保存されます。

### 補足：認証情報について
[こちらの記事](https://qiita.com/muuuuuwa/items/822c6cffedb9b3c27e21)にも書きましたが、Refresh Token の有効期限については、下記に記載があります。一度認証して Refresh Token が払い出されると、6ヶ月放置するか、50以上のトークンが払い出されない限り、期限切れになることはないようです。今回のような自動化の仕組みでも許容できそうです。
https://developers.google.com/identity/protocols/OAuth2#expiration

### シートのデータを追加するプロセスを作成する

読み取りと同様、データの追加もできます。
新しいプロセスを作成し、「Google Sheets::Append Data」アクションを図のように設定します。追加するデータアイテムも作成しておきます。
![27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/5aeb43b1-e394-0306-a945-692fbf03bf58.jpeg)


追加するデータアイテムを下記のように準備します。
![28_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/a9419632-8bc1-4d6e-96b3-b5b94874be69.jpeg)
![28_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/735e0c3d-90cc-2ea8-26a9-5e685f3edd0f.jpeg)


「Google Sheets::Append Data」アクションの入力値タブは、下図のように設定します。
![append_data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/8052a477-6bb9-c29a-ac6a-45de178489be.jpeg)

* 「Sheet ID」には、先ほど控えておいた Google Spread Sheet のURLの一部の値を設定します。
* 「Range」には、Excel でいうところの「R1C1」形式で読み取るレンジの値を設定します。列の幅だけあっていればよく、あとは空欄になる行にデータを追記してくれるようです。

実行すると、データが追記されていることが確認できます。
<img width="860" alt="30.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/3e1b26a8-d27d-d557-d772-1406fdca497f.jpeg">


さいごに
--------------------------
アクセストークン/リフレッシュトークンがない状態だと、最初に人間が介在してブラウザからの認証を行う必要がある点は注意が必要だと思いました。新しいランタイムリソースで実行する時は、取得済みのトークンファイルを手で事前に設置しておくなど、対応が必要そうです。