Google Apps ScriptでVault APIを叩く【GAS】
G Suite Business時代は使えた情報開示やデータの丸ごとエクスポートの為の機能がGoogle Vault。現在はBusiness Plus以上でなければ使うことが出来ません。情報開示用のツールということですが、現場では退職者の方の情報を万が一に備えて丸ごとエクスポートして塊でとっておけるサービスとして活用されています。
このVualtですがGMail、Drive以外にもChatメッセージ、Meetの録画データ、Google Sitesなど丸ごと出力が可能であり、一般ユーザだとGoogle Takeoutで似たような事が可能です。これをREST APIから叩いてGASから操作の自動化をしてみようと思います。
目次
今回利用するスプレッドシート
- Google Vault API - Google Spreadsheet
本APIはREST APIとして公開されてるものであり、事前準備が必要になっています。エンドポイントに対して単純にUrlfetchAppで叩いても実行は出来ません。リファレンスはこちらのページにあります。
また、Google Vault自体のQuotaとして、同時進行は20件まで、1分辺りのリクエスト等が非常に細かく設定されていますので、一気に大容量のデータをエクスポートするというのはなかなか難しいのではないかと思います。
ちなみに既存のプランに対してVaultだけを追加するということも可能で、600円/1月1ユーザでBusiness Standardに追加して運用といった事も可能です。この場合、business plusよりも低価格で運用が可能となります。追加はAdminコンソールの新しいサブスクリプションから可能で試用プランで30日間利用体験が可能になっています。無償体験申し込み後は必ずユーザに割り当てを行いましょう。でなければ使えません。
図:無償体験プランもあります。
事前準備
本APIを利用する為には、GCP側でAPIをオンにして、尚且Google Apps Script側でもappsscript.jsonの編集が必要です。また、Google Vaultは管理者権限でなければ実行出来ないAPIであるため、Admin SDK同様特定のアカウントで実行する必要があります。
GASのプロジェクトを紐付けする
Google Apps ScriptとCloud Consoleのプロジェクトを紐付けする作業が必要です。以下の手順でプロジェクトの変更を行います。前述のプロジェクトの控えておいた番号を利用します。
- Cloud Console側のプロジェクトのホームを開き、「プロジェクト番号」を控えておく
- Google Apps Scriptのスクリプトエディタを開く
- サイドバーからプロジェクト設定を開く
- GCPプロジェクトの「プロジェクトを変更」をクリック
- GCPのプロジェクト番号に、1.の番号を入力して、プロジェクトを設定をクリック
- これで紐付けが完了しました。
図:プロジェクトの移動も必須の作業です
appsscript.jsonに記述を追加する
スクリプトエディタの左サイドバーから「プロジェクト設定」を開き、「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを入れて、appsscript.jsonを表示する。その後そのファイルを開き、以下のように記述を行います。
1 2 3 4 5 6 7 8 |
{ ... "oauthScopes": [ "https://www.googleapis.com/auth/ediscovery", "https://www.googleapis.com/auth/script.external_request" ], ... } |
Vault APIで使うScopeを上記のように指定する必要があります。これを指定しておかないと403エラー Permission Denied等のエラーが発生してしまいます。
APIを有効にする
Google Cloud Console側でもAPIを有効化する必要性があります。
- GCPのプロジェクトを開く
- 左サイドバーからAPIとサービスにて、「APIとサービスの有効化」をクリックする
- vaultと検索すると出てくるので、クリックします。
- 有効化をクリックします。
- 認証情報の作成は不要です
図:有効化をしておくだけでOK
初回認証をしておく
ここまでの準備で適当な関数を用意して実行すると認証が始まります。この時、eDiscoveryの管理という項目が出てるはず。これが出ていれば準備完了で認証を完了するとはじめて、Vault APIを実行できるようになります。逆にこのScopeの認証が出ていないと、403エラーなどが出てしまいます。
図:認証を実行するとこの画面が出る
ソースコード
案件を作成する
案件とは、Google Vaultにログイン直下に現れる、エクスポート出力などをする為の器みたいなもので、必ず作成する必要のあるものです。この案件単位毎に様々な出力を行わせることになります。この時、URLには案件のIDが含まれており、これを指定して次項のエクスポートを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//Vault API Endpoint var endpoint = "https://vault.googleapis.com/v1/matters"; //Google Vault の案件を作成する function execvault(){ //OAuth Tokenを取得 let token = ScriptApp.getOAuthToken(); //リクエストボディを作成 let payload = { "name" : "GASから作成" } //リクエストオプション let options = { "method" : "Post", "payload" : JSON.stringify(payload), "muteHttpExceptions": true, "headers": { "Authorization": 'Bearer ' + token, "Content-Type" : 'application/json; charset=UTF-8' } } //HTTPリクエストを投げる var response = UrlFetchApp.fetch(endpoint,options); //matteridを取得する let res = response.getContentText() let matid = res.matterId; } |
- エンドポイントURLはvault.googleapis.comとなります。
- 認証後の場合、ScriptApp.getOAuthToken()でVault APIへのアクセス権を含めたAccess Tokenが取得できます。
- payloadは基本的にはname(案件名)だけを指定すればOK
- UrlfetchAppにてアクセスするresponseが返ってくる。其の中のmatterIdが案件IDとなります。URLは「https://vault.google.com/matter/案件ID/search」の形式になります。
図:無事に案件内に作成が出来ました。
指定の案件でエクスポートを実行する
前述の案件IDを加えた形でendpointを構築し、queryに対してエクスポートの様々な条件を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//案件IDを指定する var matterid = "ここに案件IDを入れる" //Vaultのexport実行 function exportmatter(){ //OAuth Tokenを取得 let token = ScriptApp.getOAuthToken(); //リクエストURL let requrl = endpoint + "/" + matterid + "/exports" //リクエストボディを作成 let payload = { "name" : "GASから作成", "query":{ "corpus": "MAIL", "dataScope": "ALL_DATA", "searchMethod": "ACCOUNT", "accountInfo": { "emails": [ "ここに対象者のメールアドレス" ] } } } //リクエストオプション let options = { "method" : "Post", "payload" : JSON.stringify(payload), "muteHttpExceptions": true, "headers": { "Authorization": 'Bearer ' + token, "Content-Type" : 'application/json; charset=UTF-8' } } //HTTPリクエストを投げる var response = UrlFetchApp.fetch(requrl,options); //matteridを取得する let res = response.getContentText() console.log(res) } |
- corpusがMAILだとGmail、DRIVEだとGoogle Driveのファイルのエクスポートを実行します。
- emailsにはカンマ区切りで複数のメールアドレス指定が可能です。
- mailのエクスポートの場合MBOXやPSTなどの形式でエクスポートが可能です。
- dataScopeがALL_DATAだとすべてのデータの出力になります。
- UrlfetchAppでリクエストを送るとresponseが返ってきます。この時Vaultのエクスポートタブを見るとエクスポート処理が実行されてるのがわかります。
- exportの細かなオプション指定の方法は、リファレンスのこちらを参考に構築します。
- 完了したらVaultにログインしてエクスポートタブからダウンロードをクリックしますが、この進行状況もVault APIで取得できたりします。
- 但しこのエクスポート指示なのですが、同時にリクエスト投げられるのがどうも2件までのようで・・・前のエクスポートが終わらないと次のリクエストが投げられないので、要注意。429エラーが出てしまいます。
図:ここをqueryで指定する
図:exportの実行を指定出来ました。
図:完了するとダウンロードが可能になる
注意点
Vault APIを使う上でのいくつかの注意点としては
- 同じ名前でエクスポートを実行するとエラーになります、必ず案件内で重複しないように名前をつけましょう
- GCPとGASをプロジェクト連結した場合、oauthScopeにDrive APIを入れるだけでなく、GCP側でもDrive APIをオンにしなければPrivateAppを作れず、「we're sorry a server occured」となる。ハマりどころなので要注意