google-apps-scriptgoogle-classroom

how to use nextPageToken


I have a script that archives old classrooms, until the end of 2021 it was working fine. In the lasts months I got an error (the script works ok, but terminate with error) and today I was investigating it, the script runs only once per month. The error is due to a supposed change in .nextPageToken function.

  var parametri = {"courseStates": "ARCHIVED"};
  var page = Classroom.Courses.list(parametri);
  var listaClassi = page.courses;

  var xyz = page.nextPageToken;
  
  if (page.nextPageToken !== '') {
      parametri.pageToken = page.nextPageToken;
      page = Classroom.Courses.list(parametri);
      listaClassi = listaClassi.concat(page.courses);
  };

var xyz has been added to better understand what was happening. So, in this case the list does not have pagination, is only one page. var xyz returns "undefined", and the "if" statement results "true", this makes that variable listaClassi got appended the same content a second time. That generate the error and the abnormal end of the script.

I found an issue reported here https://issuetracker.google.com/issues/225941023?pli=1 that may be related with my problem.

Now I could change .nextPageToken with .getNextPageToken but I found no docs on the second function and many issues reporting that is not working, can anyone help me?


Solution

  • When using the nextPageToken value obtained to the response make sure to enter it as a separate parameter with a slightly different name. You will obtain nextPageToken in the response, the pageToken parameter needs to be entered in the request. It does look like you are doing it right, the way you add the parameter is a bit odd, yet it should be functional.

    To discard problems with the Classroom API (that we can certainly take a look at) try with this simple code example in a new Google Apps Script project, remember you will need to add an Advanced service, information about advanced services can be found in this documentation article https://developers.google.com/apps-script/guides/services/advanced. Use listFiles as the main method in your Apps Script project.

    function listFiles() {
      var totalClasses = 0;
      nextPageToken = "";
    
      console.log("Found the following classes:")
      do {
        var response = loadPage(nextPageToken);
        var classes = response.courses;
    
        for (let x in classes){
          console.log("Class ID: " + classes[x].id + " named: '" + classes[x].name + "'.");
        }
    
        totalClasses += classes.length;
      } while (nextPageToken = response.nextPageToken)
    
      console.log("There are " + totalClasses + " classes.")
    }
    
    function loadPage(token = ""){
      return Classroom.Courses.list({
        fields: 'nextPageToken,courses(id,name)',
        pageSize: 10,
        pageToken: token
      });
    }
    

    When we first make the API call with Apps Script we don't specify a pageToken, since it is the first run we don't have one. All calls to the List method may return a nextPageToken value if the returned page contains an incomplete response.

    while (nextPageToken = response.nextPageToken)
    

    In my code at the line above once response.nextPageToken is empty (not in the response) inside the condition block JavaScript will return false, breaking the loop and allowing the code to finish execution.

    To have your incident reviewed by a Google Workspace technician you can also submit a form to open a ticket with the Google Workspace API Support team at https://support.google.com/a/contact/wsdev.