Search code examples
google-apps-scriptgoogle-classroom

Update Classroom courseState using patch


I am trying to write an Apps Script function to archive a whole bunch of courses in Google Classroom.

function myFunction() {
  var response = Classroom.Courses.list();
  var optionalArgs = {'courseState': 'ARCHIVED'};

  var courses = response.courses;
  if (courses && courses.length > 0) {
    for (i = 0; i < courses.length; i++) {
      var course = courses[i];

      Classroom.Courses.update(course.name, course.id, {'updateMask':'courseState'}, body=optionalArgs); // Line 10
      //Logger.log('%s (%s) [%s]', course.name, course.id, course.enrollmentCode);
    }
  }
}

I get the following error when running the above code:

Invalid number of arguments provided. Expected 2-3 only (line 10, file "ArchiveAll")

What is the correct way of doing this with Google Apps Script and the Classroom advanced service?


Solution

  • Based on the code, it looks like you may have previously used the Python client libraries (specifically the body=optionalArgs portion). In JavaScript / Google Apps Script, keyword parameter assignment isn't a thing, at least not like it is in Python.

    The format expected by class methods in Google's "Advanced Services" client libraries are derived from the HTTP REST API specification for the associated API. For the Classroom.Courses.update call, this is courses#update (or per your title, courses#patch).

    The REST API spec for update is for 1 path parameter (the course id), and a request body with a Course resource. As with all Google APIs, you can additionally add any of the Standard Query Parameters as an optional argument. This count - 2 required, 1 optional) corresponds with the error message you received:

    Invalid number of arguments provided. Expected 2-3 only

    Thus, your function should be something like:

    function updateCourse_(course) {
      course.courseState = 'ARCHIVED';
      const options = {
        fields: "id,name,courseState" // data sent back in the response.
      };
      return Classroom.Courses.update(course, course.id, options);
    }
    

    The patch method has an additional optional argument, the updateMask query parameter. As with other optional parameters (like Standard Query Parameters), this is passed in an object as the last parameter to the class method:

    function patchCourse_(courseId) {
      const newMetaData = {
        courseState: 'ARCHIVED',
        // other options, must be valid Course fields per patch documentation:
        // https://developers.google.com/classroom/reference/rest/v1/courses/patch#query-parameters
      };
      const options = {
        updateMask: "courseState", // CSV string of things you alter in the metadata object 
        fields: "id,name,courseState" // data sent back in the response
      };
      return Classroom.Courses.patch(newMetaData, courseId, options);
    }
    

    The updateMask allows you to use some template Course resource and only apply the specified portions of it to a specified course. If you were to use update instead of patch, you would alter all fields to use the template's values:

    function patchedViaTemplate_(templateCourse, courseId, fieldsToAlter) {
      const options = { updateMask: fieldsToAlter };
      return Classroom.Courses.patch(templateCourse, courseId, options);
    }