【问题标题】:How to request unsampled report from Google Analytics Management API using Google Apps Script?如何使用 Google Apps 脚本从 Google Analytics Management API 请求非抽样报告?
【发布时间】:2016-04-08 00:34:31
【问题描述】:

我做了什么:

  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 请求非抽样报告。据我所知,如果它工作正常,它应该会触发谷歌分析界面上的非抽样请求。但是,我在界面的 Pending 或 Completed 部分中没有看到它。当我运行代码时,什么也没发生。我什至没有看到任何错误。你能帮忙解决我做错了什么吗?提前谢谢你。

这是我的代码:

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/

【问题讨论】:

  • gapi 用于客户端,不用于服务器端。
  • 那么我可以在 Google Apps 脚本中使用什么?
  • 查看高级服务或使用 urlFetch 进行直接休息调用。我很惊讶谷歌没有为你提供专业的帮助,因为你有溢价。

标签: google-apps-script google-analytics google-api google-analytics-api


【解决方案1】:

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

说明

  1. 创建一个新的 Google 电子表格。
  2. 将以下内容复制到新脚本中
  3. 进入资源 > 高级 Google 服务
  4. 启用 Google Analytics API,将其切换为开启
  5. 点击仍然在“高级 Google 服务”对话框中的 Google 开发者控制台链接
  6. 从 Cloud API Manager 中找到并启用 Analytics API

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

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

作为奖励,如果状态为完整,它将为您提供指向 Google Drive 上文件的链接,并将数据从 CSV 导入到第二张表中。

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”在 cmets 中所说,请随时联系 Google Analytics(分析)高级支持,我们很乐意提供帮助。我们非常友好。

【讨论】:

  • 这太棒了!它现在正在工作。非常感谢。感谢您的帮助。
  • 嗨,爱德华多,我可以再问你一个问题吗?我正在尝试更改代码以从 Google 电子表格中读取查询,以便不了解 Google Apps 脚本的人在想要更改开始日期、结束日期等查询时可以使用它......代码可以读取开始日期、结束日期、指标、维度和过滤器。但是,它无法识别名为“报告配置”的工作表中的 accountId、webPropertyId 和 profileId。我收到一个错误 404。你能帮我解决这个问题吗?以下是我更改的代码:
  • @Sopheary Per SO 指南,您可以将其作为新问题发布而不是作为该问题的答案发布吗?
  • 好的,我刚刚在这里发布了另一个问题:stackoverflow.com/questions/36781302/…
  • 没关系。我弄清楚为什么它不起作用。谢谢!
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多