首页 > 解决方案 > 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?

标签: google-apps-scriptgoogle-classroom

解决方案


根据代码,您可能以前使用过 Python 客户端库(特别是该body=optionalArgs部分)。在 JavaScript / Google Apps 脚本中,关键字参数分配不是一件事,至少不像在 Python 中那样。

Google 的“高级服务”客户端库中的类方法所期望的格式源自相关 API 的 HTTP REST API 规范。对于Classroom.Courses.update通话,这是courses#update(或根据您的标题,courses#patch)。

REST API 规范适用update于 1 个路径参数(课程 ID)和带有Course资源的请求正文。与所有 Google API 一样,您可以另外添加任何标准查询参数作为可选参数。此计数 - 2 个必需,1 个可选)对应于您收到的错误消息:

提供的参数数量无效。预计只有 2-3 个

因此,您的函数应该类似于:

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

patch方法有一个额外的可选参数,即updateMask查询参数。与其他可选参数(如标准查询参数)一样,这是在对象中作为类方法的最后一个参数传递的:

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

updateMask允许您使用某些模板资源Course,并且仅将其指定部分应用于指定课程。如果您要使用update而不是patch,您将更改所有字段以使用模板的值:

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

推荐阅读