首页 > 解决方案 > Getting User Activity Reports for a given list of users in G Suite

问题描述

I'm trying to use the Admin SDK Reports Service to get the last login time and some other data for 20 users. It's not feasible to get the data for the whole domain and then filter down due to the size of the domain, so I want to get the data for only these 20 users, but I can't seem to find a way to do that. My current code fails with Admin user usage reports get failed with error: GoogleJsonResponseException: API call to reports.userUsageReport.get failed with error: Bad Request

I know this is wrong but looking at the docs I'm not sure what to do. I can use one user and that works fine on the website, but it seems weird that the only option would be to get all users or one user. I tried to modify my code to get one user multiple times in a loop, but fails with the above error. the userList value is pulled from a table in the AppMaker user interface. I can also use the documentation website's API explorer with no problems.

Here's my current function:

function generateLoginActivityReport(userList) {
  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');

  userList = JSON.parse(userList);
  //console.log("server code: " + list);

  for (var a = 0; a < userList.length; a++) {
    //console.log(userList[a]);
    var parameters = [
      'accounts:last_login_time',
      'drive:num_items_created'
    ];
    var rows = [];
    var pageToken;
    var page;
    do {
    page = AdminReports.UserUsageReport.get('all', date, {
      parameters: parameters.join(','),
      maxResults: 1,
      pageToken: pageToken,
      userKey: userList[a]
    });

    var reports = page.usageReports;

    if (page.warnings) {
      for (var q = 0; q < page.warnings.length; q++) {
        var warning = page.warnings[a];
        Logger.log(warning.message);
      }
    }

    if (reports) {
      for (var i = 0; i < reports.length; i++) { 
        var report = reports[i];
        try {
          var parameterValues = getParameterValues(report.parameters);
          var row = [
            report.date,
            report.entity.userEmail,
            parameterValues['accounts:last_login_time'],
            //parameterValues['drive:num_items_created']
          ];
          rows.push(row);
          var ar = app.models.ActivityReport.newRecord();
          ar.LastLogin = parameterValues['accounts:last_login_time'];
          console.log(report.entity.userEmail);
          ar.DocsAdded = 0; //getting this value is another issue but unrelated so it's set to 0 for now.
          ar.Email = report.entity.userEmail.toString();
          app.saveRecords([ar]);
        }
        catch(error) {
          console.error("Error! Did not write last item to model: \n"+error);
        }
      }
    }
  } while (pageToken);
  }
}

标签: javascriptgoogle-apps-scriptgoogle-admin-sdkgoogle-app-maker

解决方案



推荐阅读