我正在尝试使用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,但没有解释如何做到这一点。
我已经碰壁了,所以如果有人有建议,我真的很感激。感谢。
答案 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',
});
}