报告 Google 管理员的 API 访问权限

Reports API access for Google Admin

首先,我对我的域拥有管理员权限,但我无权访问安全性。我正在使用我的 I.T。部门,它确实具有安全访问权限,但是,我们发现的所有内容似乎都已在我们的帐户上启用。应用程序访问控制设置为“信任内部、域拥有的应用程序”。每次我尝试 运行 只是 UserUsageReport (https://developers.google.com/apps-script/advanced/admin-sdk-reports#reference) 的基本快速入门时,我都会收到错误消息:

/**
 * Generates a user usage report for this day last week as a spreadsheet. The
 * report includes the date, user, last login time, number of emails received,
 * and number of drive files created.
 */
function generateUserUsageReport() {
  var today = new Date();
  var oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
  var timezone = Session.getScriptTimeZone();
  var date = Utilities.formatDate(oneWeekAgo, timezone, 'yyyy-MM-dd');

  var parameters = [
    'accounts:last_login_time',
    'gmail:num_emails_received',
    'drive:num_items_created'
  ];
  var rows = [];
  var pageToken;
  var page;
  do {
    page = AdminReports.UserUsageReport.get('all', date, {
      parameters: parameters.join(','),
      maxResults: 500,
      pageToken: pageToken
    });
    if (page.warnings) {
      for (var i = 0; i < page.warnings.length; i++) {
        var warning = page.warnings[i];
        Logger.log(warning.message);
      }
    }
    var reports = page.usageReports;
    if (reports) {
      for (var i = 0; i < reports.length; i++) {
        var report = reports[i];
        var parameterValues = getParameterValues(report.parameters);
        var row = [
          report.date,
          report.entity.userEmail,
          parameterValues['accounts:last_login_time'],
          parameterValues['gmail:num_emails_received'],
          parameterValues['drive:num_items_created']
        ];
        rows.push(row);
      }
    }
    pageToken = page.nextPageToken;
  } while (pageToken);

  if (rows.length > 0) {
    var spreadsheet = SpreadsheetApp.create('G Suite User Usage Report');
    var sheet = spreadsheet.getActiveSheet();

    // Append the headers.
    var headers = ['Date', 'User', 'Last Login', 'Num Emails Received',
      'Num Drive Files Created'];
    sheet.appendRow(headers);

    // Append the results.
    sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);

    Logger.log('Report spreadsheet created: %s', spreadsheet.getUrl());
  } else {
    Logger.log('No results returned.');
  }
}

/**
 * Gets a map of parameter names to values from an array of parameter objects.
 * @param {Array} parameters An array of parameter objects.
 * @return {Object} A map from parameter names to their values.
 */
function getParameterValues(parameters) {
  return parameters.reduce(function(result, parameter) {
    var name = parameter.name;
    var value;
    if (parameter.intValue !== undefined) {
      value = parameter.intValue;
    } else if (parameter.stringValue !== undefined) {
      value = parameter.stringValue;
    } else if (parameter.datetimeValue !== undefined) {
      value = new Date(parameter.datetimeValue);
    } else if (parameter.boolValue !== undefined) {
      value = parameter.boolValue;
    }
    result[name] = value;
    return result;
  }, {});
}

我得到的错误是:

GoogleJsonResponseException: API call to reports.userUsageReport.get failed with error: Caller does not have access to the customers reporting data.

我满足上面link的三个要求,据我所知,分别是:

API 访问已启用

Google 具有管理员权限的帐户

访问 Google 驱动器

那为什么我总是收到这个错误?有没有我的 I.T 的设置。缺少启用此功能?我可以完全访问 directory_v1 但是 reports_v1 每次我尝试调用它时都会给我同样的错误。我们甚至按照此处的说明进行操作:https://support.google.com/a/answer/7281227?visit_id=637781417279518974-3468793296&rd=1#zippy=%2Creview-the-third-party-apps-in-your-environment%2Cblock-all-third-party-api-access

感谢任何帮助。

我认为问题可能与您的帐户可能拥有的特定管理员角色有关。由于您提到您无权访问管理控制台的“安全”部分,这意味着您不是超级管理员,只是为您的帐户分配了特定的管理员角色。

我建议使用分配的 API explorer first, just to discard the admin roles issue. If it fails with the same error it means the problem is related to the admin roles. Or you can just ask if your user has the Reports admin role 中的“试试这个 API”功能进行测试。

  • 一定要尝试在 API 资源管理器中调用 same method,如@Fernando Lara 所述,以调查用户权限并排除任何会话问题。
  • 除此之外,请确保此脚本的调用者已启用报告管理员权限,如 this documentation 所述。
  • 您可能遇到的一种情况是关于脚本项目中的“范围 cache/caller”。由于 Apps 脚本编辑器会自动控制给定代码上下文的授权范围,我注意到有时当您修改域级权限时,项目中会保留某种范围缓存。为了解决这个问题,我只是将我的代码剪切到记事本,添加一个调用 DriveApp.getFiles(); 的空白函数,保存我的项目和 运行 这个方法。重新授权云端硬盘范围,让它完成,然后删除所有内容并再次粘贴您的代码,然后 运行 它再次触发 OAuth 流程。