"The caller does not have permission - google-apps-script"

"The caller does not have permission - google-apps-script"

我正在尝试使用 google-apps-script 创建 google classroom 的扩展,但我似乎 运行 遇到权限问题- "the caller does not have permission"。谁能告诉我为什么会这样以及我需要做什么

我已经尝试访问 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 class

这个解决方案涉及做两件事 -

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

任务 1

正在更新清单文件(appsscript.json

此任务的适当课堂 API 参考是 here

看起来甚至在启用 高级 Google 服务之后...,您只会添加以下 OAuth 范围 -

您可以通过导航到 文件 > 项目属性 > 范围.

查看这些

但是,当您尝试文档 link 中的 API 时,在 Credentials > Google OAuth 2.0 选项卡下,它显示还有 4 个完全不同的 OAuth 范围;这些如下 -

您需要在 Apps 脚本清单文件中手动添加所有这 8 个。为此,请导航至 View 并选中 Show manifest file。您需要在此处添加此代码,可能在 dependencies -

下面
"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"
],

Note1: Only adding the newer 4 will not do the trick as the script would assume only these and not the original 5 that were auto-populated when your script ran for the first time.

Note2: The blank line is simply to differentiate between the scopes that get generated automatically vs. the ones you need to add manually (its redundant).

我的 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 为它打开一个问题。

编辑备注:更正语法错误