AdMobの売上をSpreadsheetに自動で出力する方法

# 概要
GoogleAppsScriptを使ってGoogleSpreadSheetにAdMobの売上を自動で取得して出力する方法です。

枠毎にシートが作られて、出力されるので適時`importrange`でなどで取得して必要な形式にして使ってください。

`getAdUnitCodeList`で取得する範囲内で広告リクエストがあれば自動で取得されるので広告枠が追加されたりアプリが追加されても
同じアカウント内で管理されていれば自動で追加されます。
ただ、運用上長い年月運用すると行数が増えて重くなりそうなので1年毎に運用する想定になっています。

年をまたいだら、スケジュールを止めて定期実行を停止し新しくSpreadsheetをコピーして取得期間を変更してから
スケジュールを追加して定期実行を再開してください。

# 使い方
1. Google Spreadsheetで新しくスプレッドシートを作成して、メニューのツール＞スクリプトエディタでGASを開いて
以下のソースコードを貼って`AD_CLIENT_ID`,`START_DATE`,`END_DATE`を適時変更してください。

2. GASのメニューにあるリソース＞Googleの拡張サービスを開いて
AdSenseManagementAPIをオンにしてください。
<img width="776" alt="スクリーンショット 2020-01-06 16.20.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30928/41765a19-90f8-44b9-9e52-d4a882d8dd67.png">


3. 関数 `run` を実行すればシートが自動で作られて出力されます。
必要に応じてスケジュールを登録して定期実行してください。

除外せずに無駄に出力してしまった場合は、`truncateSheet`を実行してください。
すべてのシートが削除されます。
※すでに`importrange`などで参照していると参照が壊れる可能性があるのでお気をつけください。

※すべて上書き保存されるので、出力されたところにメモとか書いても消えちゃったり位置がズレたりするので
あくまでもデータソースとしてご利用ください。


# ソースコード
```javascript
var AD_CLIENT_ID = 'ca-app-pub-xxxxxxxxxx' // 取得するレポートのID
var START_DATE = '2019-01-01'// 取得する範囲の開始日
var END_DATE = '2019-12-31' // 取得する範囲の終了日を入れる
var CODE_LIST_METRIC = ['REACHED_AD_REQUESTS']
var CODE_LIST_DEMENSION = ['APP_ID', 'AD_UNIT_CODE', 'APP_NAME', 'APP_PLATFORM']
var REPORT_METORIC = ['VIEWED_IMPRESSIONS','AD_REQUESTS_COVERAGE','CLICKS','MATCHED_AD_REQUESTS_CTR', 'COST_PER_CLICK','MATCHED_AD_REQUESTS_RPM','EARNINGS']
var REPORT_DEMENSION = ['DATE'] 
var AD_UNIT_SHEET = '枠管理(自動更新)' // 取得した枠一覧が入るシート名
// 除外するアプリがあればここに入れる
var IGNORE_APP_IDS = []
  
// メインロジック
// この関数をスケジュール実行してください
function run() {
  var adUnitCodes = getAdUnitCodeList(AD_CLIENT_ID, START_DATE, END_DATE).filter(function(adUnitCode) {
     return IGNORE_APP_IDS.indexOf(adUnitCode[0]) == -1
  })
  updateAdUnitList(adUnitCodes)
  adUnitCodes.forEach(function(adUnitCode) {
    var report = getReport(adUnitCode[0], adUnitCode[1], START_DATE, END_DATE)
    updateReportSheet(adUnitCode[1], report)
  })
}

// IGNORE_APP_IDSを後から追加したりして要らないシートが大量にできた時に削除したりするのに使ってください。
// AD_UNIT_SHEET以外のシートをすべて削除します。
// 別のSpreadsheetから参照とかしてると全部消えちゃうので気をつけてください。
function truncateSheet() {
  var sheet = SpreadsheetApp.getActive().getSheetByName( AD_UNIT_SHEET );
  if (sheet == null) {
     SpreadsheetApp.getActive().insertSheet( AD_UNIT_SHEET )
  }
  
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  sheets.filter(function(sheet){ return sheet.getName() != AD_UNIT_SHEET }).forEach(function(sheet) {
    SpreadsheetApp.getActive().deleteSheet(sheet)
  })
}

function updateReportSheet(sheetName, report) {
  var sheet = SpreadsheetApp.getActive().getSheetByName( sheetName );
  if (sheet == null) {
    sheet = SpreadsheetApp.getActive().insertSheet(sheetName)
  }
  
  var header = [REPORT_DEMENSION.concat(REPORT_METORIC)]
  sheet.getRange( 1, 1, header.length, header[0].length ).setValues(header)
  sheet.getRange( 2, 1, report.length, report[0].length ).setValues(report)
}

function updateAdUnitList(adUnitCodes) {  
  var sheet = SpreadsheetApp.getActive().getSheetByName( AD_UNIT_SHEET );
  if (sheet == null) {
    SpreadsheetApp.getActive().insertSheet(AD_UNIT_SHEET)
  }
  var header = [CODE_LIST_DEMENSION.concat(CODE_LIST_METRIC)]
  sheet.getRange( 1, 1, header.length, header[0].length ).setValues(header)
  sheet.getRange( 2, 1, adUnitCodes.length, adUnitCodes[0].length ).setValues(adUnitCodes)
}

function getAdUnitCodeList(adClientId, startDate, endDate) {
  var args = {
    'metric': CODE_LIST_METRIC,
    'dimension': CODE_LIST_DEMENSION,
    'filter': ['AD_CLIENT_ID==' + adClientId],
    'useTimezoneReporting': ['true'], // タイムゾーンを取得するアカウントに揃えるフラグ
  };
  
  return AdSense.Reports.generate(startDate, endDate, args).getRows();  
}

function getReport(appId, adUnitCode, startDate, endDate) {
  var args = {
    'metric': REPORT_METORIC,
    'dimension': REPORT_DEMENSION,
    'filter': ['APP_ID==' + appId, 'AD_UNIT_CODE==' + adUnitCode],
    'useTimezoneReporting': ['true'], // タイムゾーンを取得するアカウントに揃えるフラグ
  };
  return AdSense.Reports.generate(startDate, endDate, args).getRows();    
}

```



# 参考資料
AdMobの[AdSense Management APIのマニュアル](https://developers.google.com/admob/ios/reporting)