【问题标题】:Having issues with the Appscript pulling data from Google workspace using Reports APIAppscript 使用 Reports API 从 Google 工作区提取数据时遇到问题
【发布时间】:2021-08-11 16:56:06
【问题描述】:

以下代码使用 Reports API 从 Google 工作区将数据提取到 Google 工作表。但是它只给了我最近 2 天的数据,不知道为什么,脚本中没有设置限制。

代码是以下问题的参考:

How to pull deleted, archived, suspended users data to Google sheets from Admin SDK >> Reports API using Appscript

函数列表用户(){

var sheet = SpreadsheetApp.getActive().getActiveSheet();
var values = [];
var userKey = 'all';
var applicationName = 'admin';
var optionalArgs = {
  maxResults: 100
};

var response = AdminReports.Activities.list(userKey, applicationName, optionalArgs);
var activities = response.items;
if (activities && activities.length > 0) {
  Logger.log('REPORTS:');
  for (i = 0; i < activities.length; i++) {
    var activity = activities[i];

    //ONLY GET DATA IF ACTION IS EITHER "SUSPEND_USER", "DELETE_USER", or "ARCHIVE_USER"
    if(activity.events[0].name == "SUSPEND_USER" || activity.events[0].name == "DELETE_USER" || activity.events[0].name == "ARCHIVE_USER"){
        Logger.log('%s: %s (%s)', activity.id.time, activity.events[0].parameters[0].value,
        activity.events[0].name);
        //RETRIEVES THE TIMESTAMP, USER'S EMAIL, & THE EVENT NAME THAT WAS PERFORMED TO THE USER
        values = [[activity.id.time, activity.events[0].parameters[0].value,activity.events[0].name]]; 

        //SET THE DATA TO SHEET
        var lrow = sheet.getLastRow()+1;
        sheet.getRange("A"+lrow+":C"+lrow).setValues(values); 
    }

  }
} else {
  Logger.log('No reports found.');
}

}

【问题讨论】:

  • 我猜您需要将其设为页面请求并使用 pageToken 浏览所有可用页面。
  • 您知道如何尝试吗?
  • 这是一个简单的例子:stackoverflow.com/a/55307907/7215091

标签: google-apps-script google-sheets google-api google-workspace google-directory-api


【解决方案1】:

您的代码包含每页结果最大值的限制:

var optionalArgs = {
  maxResults: 100
};

将此值设置为 1000 而不是 100 或将其删除 - maxResults 的默认值为 1000 - 根据 documentation

如果您要检索超过 1000 个结果,则需要从响应中检索 nextPageToken 并将其作为 pageToken 传递给 optionalArgs 以进行下一个请求。

您可以循环重复请求,直到获得所有结果。

代码修改:

function listUsers() {

    var sheet = SpreadsheetApp.getActive().getActiveSheet();
    var userKey = 'all';
    var applicationName = 'admin';
    var optionalArgs = {
        maxResults: 1000
    };

    var response = AdminReports.Activities.list(userKey, applicationName, optionalArgs);
    var activities = response.items;
    if (activities && activities.length > 0) {
        Logger.log('REPORTS:');
        for (i = 0; i < activities.length; i++) {
            var activity = activities[i];

            //ONLY GET DATA IF ACTION IS EITHER "SUSPEND_USER", "DELETE_USER", or "ARCHIVE_USER"
            if (activity.events[0].name == "SUSPEND_USER" || activity.events[0].name == "DELETE_USER" || activity.events[0].name == "ARCHIVE_USER") {
                Logger.log('%s: %s (%s)', activity.id.time, activity.events[0].parameters[0].value,
                    activity.events[0].name);
                //RETRIEVES THE TIMESTAMP, USER'S EMAIL, & THE EVENT NAME THAT WAS PERFORMED TO THE USER
                values = [
                    [activity.id.time, activity.events[0].parameters[0].value, activity.events[0].name]
                ];

                //SET THE DATA TO SHEET
                var lrow = sheet.getLastRow() + 1;
                sheet.getRange("A" + lrow + ":C" + lrow).setValues(values);
            }

        }
    } else {
        Logger.log('No reports found.');
    }


    //////// ADD THE FOLLOWING TO YOUR EXISTING CODE:


    while (response.nextPageToken) {
        var optionalArgs = {
            maxResults: 1000,
            pageToken: response.nextPageToken
        }
        var response = AdminReports.Activities.list(userKey, applicationName, optionalArgs);
        var activities = response.items;
        if (activities && activities.length > 0) {
            Logger.log('REPORTS:');
            for (i = 0; i < activities.length; i++) {
                var activity = activities[i];

                //ONLY GET DATA IF ACTION IS EITHER "SUSPEND_USER", "DELETE_USER", or "ARCHIVE_USER"
                if (activity.events[0].name == "SUSPEND_USER" || activity.events[0].name == "DELETE_USER" || activity.events[0].name == "ARCHIVE_USER") {
                    Logger.log('%s: %s (%s)', activity.id.time, activity.events[0].parameters[0].value,
                        activity.events[0].name);
                    //RETRIEVES THE TIMESTAMP, USER'S EMAIL, & THE EVENT NAME THAT WAS PERFORMED TO THE USER
                    values = [
                        [activity.id.time, activity.events[0].parameters[0].value, activity.events[0].name]
                    ];

                    //SET THE DATA TO SHEET
                    var lrow = sheet.getLastRow() + 1;
                    sheet.getRange("A" + lrow + ":C" + lrow).setValues(values);
                }

            }
        } else {
            Logger.log('No reports found.');
        }
    }
}

【讨论】:

  • 谢谢先生,现在可以正常使用了。最后一件事,这段代码给了我事件日期、用户电子邮件、事件名称。是否可以在同一代码中提取有关这些用户的更多信息,例如用户名、用户创建日期等?
  • 不是直接的,但是一旦您获得用户电子邮件,您可以再次调用方法activities.list - 现在使用eventName CREATE_USER 并将filters 设置为USER_EMAIL==XXX - 其中@ 987654338@ 是已删除用户的电子邮件。有关正确实施,请参阅 thisthis 文档。
  • 如何按日期过滤数据?假设我只想要过去 10 天的数据,我尝试了这个但没有工作: if (activity.events[0].name == "DELETE_USER" && Utilities.formatDate(new Date(activity.id.time), "GMT+ 1", "mm/dd/yyyy") > Utilities.formatDate(new Date('05/20/2021'), "GMT+1", "dd/mm/yyyy"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多