如何使用 Google Apps 脚本从 Google Analytics Management API 请求非抽样报告?

How to request unsampled report from Google Analytics Management API using Google Apps Script?

我做了什么:

  1. 我有 Google Analytics Premium
  2. 我已按照以下说明为 Apps 脚本授权 OAuth2:https://github.com/googlesamples/apps-script-oauth2
  3. 我在高级 Google 服务和开发者控制台上启用了 Google Analytics API 和 Drive API。
  4. 我正在尝试按照此说明请求非抽样报告:https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/unsampledReports/insert#request

我的问题:

我在 Google Apps 脚本编辑器上编写了以下代码,以请求来自 Google Analytics API 的非抽样报告。据我所知,如果它工作正常,它应该会触发 Google Analytics 接口上的非抽样请求。但是,我在界面的待定或已完成部分中看不到它。而当我 运行 代码时,什么也没有发生。我什至没有看到任何错误。你能帮我解决我做错了什么吗?提前谢谢你。

这是我的代码:

function insertView()
var request = gapi.client.analytics.management.unsampledReports.insert(
    {
      'accountId': 'XXXXXX',
      'webPropertyId': 'UA-XXXXXX-XX',
      'profileId': 'XXXXXXXX',
      'resource': {
        'title': 'A test Report',
        'start-date': '2016-03-31',
        'end-date': '2016-04-04',
        'metrics': 'ga:itemRevenue',
        'dimensions': 'ga:date'
    
      }
    });
return request;
}
}
  
  function outputToSpreadsheetNext(request) {

  var sheetId = '1RSkx8n-YRMq7Cnco-mvC83bJPKSnsb3QPx3BItAWmN8';  
  var sheetPrevious= SpreadsheetApp.openById(sheetId).getSheets()[0];

  var headerNamesPrevious = []
 for (var i = 0, header; header = request.getColumnHeaders()[i]; ++i) {
    headerNamesPrevious.push(header.getName());
  }

  sheetPrevious.getRange(1, 1, 1, headerNamesPrevious.length)
      .setValues([headerNamesPrevious]);

    // Print the rows of data.
  sheetPrevious.getRange(2, 1,request.getRows().length,headerNamesPrevious.length)
      .setValues(request.getRows()); 

}
}

我在这里写了如何操作的说明:http://sophearychiv.com/how-to-pull-and-automate-unsampled-reports-from-google-analytics-into-google-spreadsheet/

这是您可能想尝试的工作版本。

说明

  1. 创建一个新的 Google 传播sheet。
  2. 将以下内容复制到新脚本中
  3. 进入资源 > 高级 Google 服务
  4. 启用 Google 分析 API 将其切换为 ON
  5. 单击仍在高级 Google 服务对话框中的 Google 开发人员控制台 link
  6. 从云端 API 经理找到并启用分析 API

现在您可以 运行 函数 insertReport(),这将使用 API 插入非抽样报告。请记住,就像我在 中告诉您的那样,处理这些可能需要几个小时。

运行 updateAllReports() 函数会在一段时间后尝试获取报告的更新状态。

作为奖励,如果状态为完整,它将为您提供 link 到 Google 驱动器上的文件,并将数据从 CSV 导入第二个 sheet .

var LOG_SHEET_NAME = 'Unsampled Report Logs';
var ss = SpreadsheetApp.getActive();
var ui = SpreadsheetApp.getUi();

function insertReport() {
  var resource = {
        'title': 'A test Report',
        'start-date': '2016-03-31',
        'end-date': '2016-04-04',
        'metrics': 'ga:itemRevenue',
        'dimensions': 'ga:date'

      };
  var accountId = 'XXXXXXXX';
  var webPropertyId = 'UA-XXXXXXXX-1';
  var profileId = 'YYYYYYYY';

  try {
    var request = Analytics.Management.UnsampledReports.insert(resource, accountId, webPropertyId, profileId);
  } catch (error) {
    ui.alert('Error Performing Unsampled Report Query', error.message, ui.ButtonSet.OK);
    return;
  }

  var sheet = ss.getSheetByName(LOG_SHEET_NAME);

  if (!sheet) {
    sheet = ss.insertSheet(LOG_SHEET_NAME);
    sheet.appendRow(['User', 'Account', 'Web Property', 'View', 'Title', 'Inserted Time', 'Updated Time', 'Status', 'Id', 'File']);
    sheet.getRange(1, 1, 1, 10).setFontWeight('bold');
  }
  sheet.appendRow([
    Session.getEffectiveUser().getEmail(),
    request.accountId,
    request.webPropertyId,
    request.profileId,
    request.title,
    request.created,
    request.updated,
    request.status,
    request.id
  ]);

}

// Scans LOG_SHEET_NAME and tries to update any report that is PENDING
function updateAllReports() {
  var sheet = ss.getSheetByName(LOG_SHEET_NAME);
  var lastRow = sheet.getLastRow();

  var dataRange = sheet.getRange(2,1, lastRow, 10);

  var data = dataRange.getValues();

  for (var i=0; i<data.length; i++) {
    // If data is PENDING let's try to update it's status. Hopefully it's complete now
    // but it may take up to 24h to process an Unsampled Reprot
    if (data[i][0] == Session.getEffectiveUser().getEmail() && data[i][7] == 'PENDING') {
      try {
      var request = Analytics.Management.UnsampledReports.get(data[i][1], data[i][2], data[i][3], data[i][8]);
      } catch (error) {
        ui.alert('Error Performing Unsampled Report Query', error.message, ui.ButtonSet.OK);
        return;
      }

      data[i] = [
        Session.getEffectiveUser().getEmail(),
        request.accountId,
        request.webPropertyId,
        request.profileId,
        request.title,
        request.created,
        request.updated,
        request.status,
        request.id,
        request.status == 'COMPLETED' ? DriveApp.getFileById(request.driveDownloadDetails.documentId).getUrl() : ''
      ];


      // If data is Complete let's import it into a new sheet
      if (request.status == 'COMPLETED') {
        importReportFromDrive(request.title, request.driveDownloadDetails.documentId);
      }
    }
  }

  // Write only once to the spreadsheet this is faster
  dataRange.setValues(data);

}

function importReportFromDrive(title, fileId) {
  var file = DriveApp.getFileById(fileId);
  var csvString = file.getBlob().getDataAsString();
  var data = Utilities.parseCsv(csvString);

  // Find a suitable name for the new sheet
  var i=1;
  var sheetName = title;
  while (ss.getSheetByName(sheetName)) {
    sheetName = title + ' ('+ i++ +')';
  }

  var sheet = ss.insertSheet(sheetName);
  var range = sheet.getRange(1, 1, data.length, data[0].length);
  range.setValues(data);
}

PS:我为 Google Analytics 支持工作,正如 "Zig Mandel" 在评论中所说,请随时联系 Google Analytics Premium Support,我们正在很高兴能帮助你。我们很友好。