【问题标题】:List more than 30 students in a class in Google Classroom API query在 Google Classroom API 查询中列出一个班级的 30 多名学生
【发布时间】:2018-03-17 14:39:09
【问题描述】:

此时,我有一个脚本可以正确列出 Google 课堂中某个班级的学生,但它没有列出所有学生,只列出前 30 名。我需要它来列出所有学生,不不管有多少。我现在拥有的是以下内容:

function listStudents() {
  var s = SpreadsheetApp.getActiveSpreadsheet();
  var sh = s.getSheetByName('CLASS');
  var r = sh.getDataRange();
  var n = r.getNumRows();
  var d = r.getValues();
  for (x = 0; x < n; x++) {
    var i = d[x][0];
    if(i == ''){ continue; } else if (i == 'D') {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getSheetByName('LISTSTUDENTS');
      var tea = Classroom.Courses.Students.list(d[x][8]);
      var t = tea.students;
      var arr = [];

      try {
        for (i = 0; i < t.length; i++) {
          var c = t[i]; 
          var ids = c.profile;
          var em = ids.emailAddress;
          arr.push([em]);   
        }
      }
      catch (e) { continue; } 

      sh.getRange(d[x][14], d[x][15], arr.length, arr[0].length).setValues(arr);  
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    您在查询中只收到 30 名学生,因为您只访问结果的第一页。几乎每个“高级服务”都以类似的方式在集合方面发挥作用,因为它们在调用中返回可变数量的项目(通常达到可以在查询中指定的大小,但有限制)。这是为了确保每个使用它的人都能及时获得服务。

    例如,考虑 Bob(来自会计)。这种请求分页方式意味着他不能请求包含 20,000 个项目的单个响应,在此期间其他人的服务速度较慢。但是,他可以请求接下来的 100 项,200 次。当 Bob 使用他最近查询的这 100 项时,其他人可以使用该服务而不会中断。

    要进行此设置,您需要使用保证至少执行一次的代码循环,并使用包含在对.list() 调用的响应中的nextPageToken 来控制循环。在 Javascript/Google Apps 脚本中,这可以是一个 do .. while 循环:

    // Runs once, then again until nextPageToken is missing in the response.
    const roster = [],
        // The optional arguments pageToken and pageSize can be independently omitted or included.
        // In general, 'pageToken' is essentially required for large collections.
        options = {pageSize: /* reasonable number */};
    
    do {
      // Get the next page of students for this course.
      var search = Classroom.Courses.Students.list(courseId, options);
    
      // Add this page's students to the local collection of students.
      // (Could do something else with them now, too.)
      if (search.students)
        Array.prototype.push.apply(roster, search.students);
    
      // Update the page for the request
      options.pageToken = search.nextPageToken;
    } while (options.pageToken);
    Logger.log("There are %s students in class # %s", roster.length, courseId);
    

    【讨论】:

    • 这在集成到原始脚本中时有效。
    【解决方案2】:

    对于那些为此苦苦挣扎的人,这里是代码

        function listStudent() {
        var pageSizeValue = 300; /*** change with numbers that you want*/
        var nextPageToken = '';
        var courseID = 1234; /*** change with numbers that you want*/
        var ownerArray = [];
    
        do {
            var optionalArgs = {
                pageSize: pageSizeValue,
                pageToken: nextPageToken
            };
            var cls = Classroom.Courses.Students.list(courseID, optionalArgs);
            var nextPageToken = cls.nextPageToken;
            
           const ssData = cls.students.map(c => {
           return [c.profile.id,c.profile.name.fullName,c.profile.emailAddress]
                  });
    
            Array.prototype.push.apply(ownerArray, ssData);
    
           } while (nextPageToken);
             const ss = SpreadsheetApp.openById("1234"); // <<< UPDATE THIS
             const sheet = ss.getSheetByName("Sheet1"); // <<< UPDATE THIS
         sheet.getRange(2,1,ownerArray.length,ownerArray[0].length).setValues(ownerArray); // <<< UPDATE THIS
        }
              
    

    【讨论】:

      【解决方案3】:

      我将 Google (https://developers.google.com/apps-script/add-ons/editors/sheets/quickstart/attendance) 提供的示例中的 getRoster 函数修改如下,它对我有用。

      function getRoster(courseId) {
        var studentNames = []
        var studentEmails = []
        var nextPageToken = ''  
      
        do {
          var optionalArgs = {
            pageSize: 30,
            pageToken: nextPageToken
          };
          var response = Classroom.Courses.Students.list(courseId, optionalArgs)
          var students = response.students
          nextPageToken = response.nextPageToken    
      
          for (var i = 0; i <= students.length; i++) {
            try {
              studentNames.push(students[i].profile.name.fullName)
              studentEmails.push(students[i].profile.emailAddress)
            } catch (err) {        
            }
          }
        } while (nextPageToken);
        return { "studentNames":studentNames, "studentEmails":studentEmails }
      }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2019-09-24
      • 2012-02-06
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多