LoginSignup
2
1

GASでGCS上のプロジェクトのレポートをダウンロードする

Posted at

はじめに

Google Play Consoleの1日のインストール数のレポートを自動で取得しようと考えたのがきっかけです。GASを選んだ理由ですが、定期実行するのに都合がいいのと、Google関連のサービスだから簡単に終わるだろと算段をつけたからです。蓋を開けてみればあまり参考にできるものが見当たらず手探りで進めたものの記録を残します。
完全自動でアクセスしたいため、サービスアカウントを使用します。ドキュメントを参考に進めます。

Step1.サービスアカウントを作成する

  1. Google Developers Consoleを開き、プロジェクトを選択する

  2. 左上のimage.png > [IAMと管理] > [サービスアカウント] > [サービスアカウントを作成]を選択しますimage.png

  3. サービスアカウント名・サービスアカウントの説明を入力し、[作成] を選択します

  4. アカウント情報が書かれたjsonがダウンロードされるので、安全な場所に保存します

  5. 表示されたメールアドレスをコピーします
    例: accountName@project.iam.gserviceaccount.com

Step2.Google Play Console にサービス アカウントを追加する

  1. Google Play Console を開きます
  2. 左上のimage.png > [ユーザーと権限] > [新しいユーザーを招待] を選択します
  3. メールアドレスに先ほどコピーしたメールアドレスを貼り付けます
  4. [アプリの権限]でレポートを取得したいプロジェクトを選択します
  5. [アカウントの権限]で
    [アプリ情報の閲覧、一括レポートのダウンロード(読み取り専用)]を選択します
  6. [ユーザーを追加] をクリックします

Step3.API 呼び出しを使用してレポートを取得する

  1. GASでOauth2を行うためのライブラリを追加します。現在のIDは1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDFですが、変更される可能性もあるのでGitHubで確認してください

  2. サンプルを参考に、(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_KEYCLIENT_EMAILは、Step1でダウンロードしたものです。

  3. 同様にサンプルを参考に、レポートをダウンロードする関数を作成します

    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());
      }
    }
    
    

    BUCKETpubsite_prod_xxx~という形式です。Google Play Consoleの[レポートのダウンロード] > [任意のレポートの種類] > [Cloud Storage URIをコピー]から確認できます。
    OBJECTは入手したいレポートのパスです。ドキュメントのレポートのコマンドとファイル形式から確認できます。
    例えばインストール数では以下のように記載されています。stats/installs/installs_[package_name]_yyyyMM_[dimension].csvOBJECTに該当し、developer_bucket_idBUCKETのことです。
    スクリーンショット 2024-03-24 22.50.21.png
    package_namecom.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');
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1