代码之家  ›  专栏  ›  技术社区  ›  Jason Jurotich

在Google课堂API查询中列出一个班级中的30多名学生

  •  3
  • Jason Jurotich  · 技术社区  · 7 年前

    目前,我有一个脚本可以正确地列出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);  
        }
      }
    }
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   tehhowch    6 年前

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

    例如,考虑鲍勃(来自会计)。这种请求分页方式意味着他无法请求一个包含20000个项目的响应,在此期间,其他人的服务速度较慢。然而,他可以要求接下来的100件物品,200次。虽然Bob正在使用他最近查询中的100个项目,但其他人可以在不中断的情况下使用该服务。

    要进行设置,需要使用保证至少执行一次的代码循环,并使用 nextPageToken 这包括在对呼叫的响应中 .list() 控制回路。在Javascript/Google应用程序脚本中,这可以是 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
  •  0
  •   elmizan    4 年前

    对于那些与此抗争的人,以下是代码

        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
  •  0
  •   hminjx    3 年前

    我修改了Google提供的示例中的getlotser函数( https://developers.google.com/apps-script/add-ons/editors/sheets/quickstart/attendance )如下所示,这对我很有效。

    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 }
    }