“呼叫者没有权限-google-apps-script”

时间:2019-10-13 14:30:52

标签: google-apps-script google-api permissions google-developers-console

我正在尝试使用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

1 个答案:

答案 0 :(得分:7)

此解决方案涉及两件事-

  1. 更新清单文件(appsscript.json
  2. 更新Code.gs文件

任务1

更新清单文件(appsscript.json

适合该任务的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"
}

任务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带来麻烦。

编辑说明:纠正的语法错误