Google课堂应用脚本 - CourseWork.list权限错误

时间:2017-03-14 21:11:38

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

我正在尝试使用Classroom API v1在Google Apps脚本中访问Google课堂中的课程作业。我按照快速入门中的步骤成功检索了我的课程列表,但是当我尝试使用以下内容访问我的某个课程中的课程时:

var coursework = Classroom.Courses.CourseWork.list('valid courseId');

我得到了一个'来电者没有得到许可'错误。不过,我可以使用API​​ Explorer成功检索课程作业列表。

通过使用API​​资源管理器,它看起来像" classroom.coursework.students.readonly"此命令需要范围。但是,当我点击“允许”时,该范围不会添加到我的项目中。权限对话框中的按钮。有没有办法将其添加到项目的范围列表中?我已经搜索过SO,并且已经看到过用其他语言设置范围(例如python),但在Apps脚本中却没有。我还在应用脚本中看到有人authorizing a scope manually,但没有解释如何做到这一点。

我已经碰壁了,所以如果有人有建议,我真的很感激。感谢。

4 个答案:

答案 0 :(得分:6)

我最初在this SO thread上发了言。

适合该任务的Classroom API参考是here

即使启用了高级Google服务... ,您看起来也只会添加以下OAuth范围-

您可以通过导航到文件>项目属性>范围来查看这些内容。

但是,当您通过文档链接尝试使用API​​时,在 Credentials> Google OAuth 2.0 标签下,它会显示4个完全不同的OAuth范围;如下-

您需要在Apps脚本清单文件中手动添加所有这8种。为此,请导航至查看并选中显示清单文件。在那里,您需要添加此代码,也许要在依赖项下方添加

"oauthScopes": [
  "https://www.googleapis.com/auth/classroom.courses",
  "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
  "https://www.googleapis.com/auth/classroom.profile.emails",
  "https://www.googleapis.com/auth/classroom.profile.photos",
  "https://www.googleapis.com/auth/classroom.rosters",

  "https://www.googleapis.com/auth/classroom.coursework.me",
  "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
  "https://www.googleapis.com/auth/classroom.coursework.students",
  "https://www.googleapis.com/auth/classroom.coursework.students.readonly"
],
  

注意1:仅添加较新的4并不能解决问题,因为脚本将仅假设这些,而不是最初运行脚本时自动填充的原始5。

     

注2:空行只是为了区分自动生成的作用域和需要手动添加的作用域(其冗余)。

我的appsscript.json文件看起来像这样;您的可能会有所不同-

{
  "timeZone": "Asia/Kolkata",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Classroom",
      "serviceId": "classroom",
      "version": "v1"
    }]
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/classroom.courses",
    "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
    "https://www.googleapis.com/auth/classroom.profile.emails",
    "https://www.googleapis.com/auth/classroom.profile.photos",
    "https://www.googleapis.com/auth/classroom.rosters",

    "https://www.googleapis.com/auth/classroom.coursework.me",
    "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
    "https://www.googleapis.com/auth/classroom.coursework.students",
    "https://www.googleapis.com/auth/classroom.coursework.students.readonly"
  ],
  "exceptionLogging": "STACKDRIVER"
}

答案 1 :(得分:0)

如此thread中所述,请确保应用脚本与正确的开发控制台项目相关联。

  

该脚本应与使用的OAuth 2.0客户端ID对应的开发控制台项目ID相关联(此开发控制台项目还应具有" Apps脚本执行API"已启用)。

     

要更改应用脚本的开发者控制台项目,请选择以下菜单项:资源>开发者控制台项目...

     

在此屏幕上输入开发控制台的项目编号。

您必须提供有效的OAuth令牌才能使用API​​,这需要一个开发者控制台项目。

答案 2 :(得分:0)

我遇到同样的问题 - 当作为项目教师运行Google Apps脚本插件时,对Courses.CourseWork.list的调用工作正常。

当我切换到在课程中作为学生运行相同的脚本加载项时,我得到'来电者没有权限'错误。

除了打开Classroom API之外,加载项的开发人员无法控制这种情况,开发人员无法控制范围。

核心问题是 - 代码适用于课程教师。课程的学生代码失败。

所有这一切,而Classroom APi参考本身工作正常。 https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/list

这很可能是一个错误 - 至少与@abielita上面给出的通用的全部答案无关。

我看到这个bug已经过时了,所以我没有希望得到答案,但是希望如此。

答案 3 :(得分:0)

我在重复运行代码时遇到了这个错误,无论是域管理员还是我正在测试的课程的老师(即我真的应该有访问权限)。

在试图找出权限问题时,我尝试调用Classroom.Courses.CourseWork.create,这会触发另一个授权对话框,其中包含访问课程作业的其他权限。即使我的创建调用失败了(我还在使用API​​并且没有正确的语法),它触发的权限就是我需要的课程列表正确的。

简而言之,这里的代码最初因您描述的权限错误而失败:

function getCoursework(id) {
  var resp = Classroom.Courses.CourseWork.list(id);
  work = resp.courseWork
  if (work && work.length > 0) {
    for (var i=0; i< work.length; i++) {
      piece = work[i]
      Logger.log('Work: %s (%s)',piece.title,JSON.stringify(piece));
    }
  }
}

该代码没有触发权限对话框,因为它应该具有。但是,一旦我运行了以下(损坏的)代码,我确实得到了一个权限对话框,然后上面的代码工作:

function createCoursework (id) {
  Classroom.Courses.CourseWork.create(id,
    { // doesn't work but triggers permissions correctly
  "courseId": id,
  "title": 'foo',
  "description": 'desc',
    });
}