【问题标题】:Reports API access for Google Admin报告 Google 管理员的 API 访问权限
【发布时间】:2022-01-19 00:29:43
【问题描述】:

首先,我对我的域具有管理员权限,但我无权访问安全性。我正在使用我的 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.

据我所知,我符合上述链接的三个要求,分别是:

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

感谢任何帮助。

【问题讨论】:

    标签: google-apps-script google-admin-sdk


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

    【讨论】:

    • 在尝试 API Explorer 后,我得到了同样的错误。根据此处提供的信息,我认为问题在于我没有 Reports API 管理员角色。经过一番阅读,如果我不是超级管理员,似乎必须通过自定义角色添加它。我将与我的超级管理员一起完成这项工作,并在我知道后确认。非常感谢。
    【解决方案2】:

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

    我建议首先使用API explorer 中的“试用此 API”功能进行测试,以放弃管理员角色问题。如果它失败并出现相同的错误,则意味着问题与管理员角色有关。或者您可以询问您的用户是否分配了Reports admin role

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2013-12-20
      • 2015-07-27
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多