google-apps-script - “调用者没有权限 - google-apps-script”
问题描述
我正在尝试使用 google-apps-script 创建对 google 教室的扩展,但我似乎遇到了权限问题——“调用者没有权限”。有人可以告诉我为什么会这样以及我需要做什么
我已经尝试访问谷歌云平台提供的所有库,希望其中一个提供所需的权限,但无济于事。
function listCourses() {
var optionalArgs = {
pageSize: 10
};
var response = Classroom.Courses.list(optionalArgs);
var courses = response.courses;
if (courses && courses.length > 0) {
for (i = 0; i < courses.length; i++) {
var course = courses[i];
Logger.log('%s (%s)', course.name, course.id);
var submissions = Classroom.Courses.CourseWork.list(course.id, optionalArgs);
for (i = 0; i < submissions.length; i++) {
var submission = submissions[i];
Logger.log('%s', submission);
}
}
} else {
Logger.log('No courses found.');
}
}
该代码旨在列出特定班级中课程的课程ID
解决方案
该解决方案涉及做两件事 -
- 更新清单文件 (
appsscript.json
) - 更新
Code.gs
文件
任务1
更新清单文件 ( appsscript.json
)
此任务的相应 Classroom API 参考在此处。
看起来即使在启用Advanced Google services...之后,您也只会添加以下 OAuth Scopes -
- 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
您可以通过导航到File > Project properties > Scopes来查看这些内容。
但是,当您从文档链接尝试 API 时,在Credentials > Google OAuth 2.0选项卡下,它会显示另外 4 个完全不同的 OAuth 范围;这些如下 -
- 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
您需要在您的 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"
}
任务 2
更新Code.gs
文件
一旦你拥有了正确的权限,你就可以自由地使用实际的代码——你最初共享的那个缺少一些组件,我已经修改了它以使它在这里工作——
function listCourses() {
var optionalArgs = {
pageSize: 10
};
var response = Classroom.Courses.list(optionalArgs);
var courses = response.courses;
if (courses && courses.length > 0) {
for (var i = 0; i < courses.length; i++) {
var course = courses[i];
Logger.log('%s (%s)', course.name, course.id);
var submissions = Classroom.Courses.CourseWork.list(course.id, optionalArgs);
for (var j = 0; j < submissions.courseWork.length; j++) {
var submission = submissions.courseWork[j];
Logger.log('%s', submission);
}
}
} else {
Logger.log('No courses found.');
}
}
希望这会有所帮助:) 但我实际上并不知道为什么这些范围不会自动添加,也许会为此向 Google 提出问题。
编辑说明:纠正语法错误
推荐阅读
- azure - 为什么我可以在部署槽之间交换某些设置,而不能交换其他设置?
- asp.net - ClosedXML - 无法加载文件或程序集异常
- android - React-native TextInput 在 Android 平台上的不同行为
- php - wp_insert_post 未显示在 WP 管理面板中
- google-bigquery - 获取项目中所有表的 Table_Id 和行数
- javascript - 如何在 Vuejs 2 中声明全局方法/对象?
- codenameone - 视频和地图点的代号 One ShareButton
- python-2.7 - 张量流需要GPU吗
- java - 如何将docker容器日志保存在机器上而不是容器中
- excel - 带有大量小数的字符串数据类型中的小数始终解释为大整数(区域小数分隔符问题)