はじめに
Google Play Consoleの1日のインストール数のレポートを自動で取得しようと考えたのがきっかけです。GASを選んだ理由ですが、定期実行するのに都合がいいのと、Google関連のサービスだから簡単に終わるだろと算段をつけたからです。蓋を開けてみればあまり参考にできるものが見当たらず手探りで進めたものの記録を残します。
完全自動でアクセスしたいため、サービスアカウントを使用します。ドキュメントを参考に進めます。
Step1.サービスアカウントを作成する
-
Google Developers Consoleを開き、プロジェクトを選択する
-
サービスアカウント名・サービスアカウントの説明を入力し、[作成] を選択します
-
アカウント情報が書かれたjsonがダウンロードされるので、安全な場所に保存します
-
表示されたメールアドレスをコピーします
例: accountName@project.iam.gserviceaccount.com
Step2.Google Play Console にサービス アカウントを追加する
- Google Play Console を開きます
- 左上の > [ユーザーと権限] > [新しいユーザーを招待] を選択します
- メールアドレスに先ほどコピーしたメールアドレスを貼り付けます
- [アプリの権限]でレポートを取得したいプロジェクトを選択します
- [アカウントの権限]で
[アプリ情報の閲覧、一括レポートのダウンロード(読み取り専用)]を選択します - [ユーザーを追加] をクリックします
Step3.API 呼び出しを使用してレポートを取得する
-
GASでOauth2を行うためのライブラリを追加します。現在のIDは
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
ですが、変更される可能性もあるのでGitHubで確認してください -
サンプルを参考に、(https://www.googleapis.com/auth/devstorage.read_only )への権限を要求する関数を作成します
function getService_() { return OAuth2.createService('GCS') .setTokenUrl('https://oauth2.googleapis.com/token') .setPrivateKey(PRIVATE_KEY_GCS) .setIssuer(CLIENT_EMAIL_GCS) .setPropertyStore(PropertiesService.getScriptProperties()) .setScope('https://www.googleapis.com/auth/devstorage.read_only'); }
PRIVATE_KEY
とCLIENT_EMAIL
は、Step1でダウンロードしたものです。 -
同様にサンプルを参考に、レポートをダウンロードする関数を作成します
function run() { var service = getService_(); if (service.hasAccess()) { var url = `https://storage.googleapis.com/${BUCKET}/${OBJECT}` var response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + service.getAccessToken(), }, method:"GET" }); //responseを出力。utf-16であることに注意 var content = response.getBlob() var csvContent = content.getDataAsString("UTF-16") var csvData = Utilities.parseCsv(csvContent);//二次元配列に変換 Logger.log(csvData) } else { Logger.log(service.getLastError()); } }
BUCKET
はpubsite_prod_xxx~
という形式です。Google Play Consoleの[レポートのダウンロード] > [任意のレポートの種類] > [Cloud Storage URIをコピー]から確認できます。
OBJECT
は入手したいレポートのパスです。ドキュメントのレポートのコマンドとファイル形式から確認できます。
例えばインストール数では以下のように記載されています。stats/installs/installs_[package_name]_yyyyMM_[dimension].csv
がOBJECT
に該当し、developer_bucket_id
はBUCKET
のことです。
package_name
はcom.my.app
の形式です。Google Play Consoleで確認することができます。
dimention
は先ほどのドキュメントにも書いてありますが、Google Play Consoleに表示されているものの方が種類が多いようです。一度手動でレポートをダウンロードし、dimension
を確認して指定するといいです。
スクリプトを実行した際に、権限がない旨のエラーが返ってくる可能性があります。
筆者は翌日同じ環境、スクリプトで実行したところエラーが解消されたため、Google Play Consoleの設定反映に時間がかかるのかもと推測しています。
私はこのエラーで数時間溶かしましたが、同様の状況になった方は大人しく待ってみることをお勧めします。
まとめ
実際に完成したコードはこちらです。用途に合わせてGoogleDriveに保存するなど、処理を加えることになると思います。
function run() {
var service = getService_();
if (service.hasAccess()) {
var url = `https://storage.googleapis.com/${BUCKET}/${OBJECT}`
var response = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + service.getAccessToken(),
},
method:"GET"
});
//responseを出力。utf-16であることに注意
var content = response.getBlob()
var csvContent = content.getDataAsString("UTF-16")
var csvData = Utilities.parseCsv(csvContent);//二次元配列に変換
Logger.log(csvData)
} else {
Logger.log(service.getLastError());
}
}
function getService_() {
return OAuth2.createService('GCS')
.setTokenUrl('https://oauth2.googleapis.com/token')
.setPrivateKey(PRIVATE_KEY_GCS)
.setIssuer(CLIENT_EMAIL_GCS)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://www.googleapis.com/auth/devstorage.read_only');
}