You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Apps Script将文件附加到Google Classroom的CourseWorkMaterials(资料类作业)中?

如何通过Apps Script将文件附加到Google Classroom的CourseWorkMaterials(资料类作业)中?

看起来你遇到的问题是Google Classroom API对CourseWorkMaterials里的Drive文件格式有严格要求,报错里提到的"Unknown name"就是因为你用了API不识别的字段名。我来帮你一步步修复:

问题根源

Google Classroom的CourseWorkMaterials API中,materials.driveFile的结构和你写的不一样:

  • 不能用id字段,正确的字段名是**driveFileId**
  • API不需要你手动传title,它会自动从Drive文件中读取标题
  • 必须指定shareMode(比如VIEW表示学生只能查看,STUDENT_COPY表示每个学生获得副本)

另外你的代码还有两个小问题:

  • 初始化materials数组时,evidenceId还没赋值,会导致第一个元素是无效的Drive文件对象
  • 后来又push了一次,相当于添加了两个文件(其中第一个是无效的)

修复后的完整代码调整

我把你的代码修改后,标注了关键修改点:

function createMaterialsFromGoogleSheet() {
  // 假设你已经定义了data和courseId变量
  var data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getValues();
  var courseId = "你的课程ID"; // 替换成实际课程ID

  // 遍历每一行数据,为每个学生创建资料
  for (var i = 1; i < data.length; i++) {
    var pupil = data[i][1];
    var curriculumArea = data[i][2];
    var learningIntentions = data[i][3];
    var successCriteria = data[i][5];
    var assessmentComments = data[i][6];
    var nextSteps = data[i][7];
    var evidenceLink = data[i][8];

    // 先初始化空的materials数组,避免提前添加无效项
    var materials = {
      title: pupil + " - " + curriculumArea,
      description: "Learning intentions: " + learningIntentions + "\n\nSuccess criteria: " + successCriteria + "\n\nAssessment comments: " + assessmentComments + "\n\nNext steps: " + nextSteps,
      materials: [] // 初始为空数组
    };

    var evidenceId = "";
    var fileName = "";

    if (evidenceLink) {
      evidenceId = uploadFileToDrive(evidenceLink);
      if (!evidenceId) {
        Logger.log("Could not upload file: " + evidenceLink);
        continue;
      }

      // 从Drive链接提取文件名(也可以调用Drive.Files.get获取更准确的名称)
      fileName = evidenceLink.split("/").pop();
      
      // 修正Drive文件结构:用driveFileId,添加shareMode,移除title字段
      materials.materials.push({
        driveFile: {
          driveFileId: evidenceId, // 替换原有的id为driveFileId
          shareMode: "VIEW" // 根据需求选择:VIEW/STUDENT_COPY/OWNER
        }
      });

      // 将证据链接添加到描述中,并同步更新materials的description
      assessmentComments += "\n\nEvidence: " + evidenceLink;
      materials.description = "Learning intentions: " + learningIntentions + "\n\nSuccess criteria: " + successCriteria + "\n\nAssessment comments: " + assessmentComments + "\n\nNext steps: " + nextSteps;
    }

    if (pupil) {
      var studentId = getStudentId(pupil, courseId);
      if (!studentId) {
        Logger.log("Could not find student with name '" + pupil + "' in course. Skipping row.");
        continue;
      }

      // 调用API时保持正确的结构
      Classroom.Courses.CourseWorkMaterials.create({
        assigneeMode: "INDIVIDUAL_STUDENTS",
        individualStudentsOptions: { studentIds: [studentId] },
        title: pupil + " - " + curriculumArea,
        description: materials.description,
        materials: materials.materials
      }, courseId);
    }
  }
}

function uploadFileToDrive(url) {
  var response = UrlFetchApp.fetch(url, {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  });

  // 优化:使用从URL提取的文件名,而非固定的"evidence"
  var contentType = response.getHeaders()['Content-Type'];
  var fileName = url.split("/").pop();
  
  var file = Drive.Files.insert({
    title: fileName,
    mimeType: contentType
  }, response.getBlob());

  return file.id;
}

关键修改说明

  1. 修正Drive文件结构:把driveFile.id改成driveFile.driveFileId,添加shareMode字段,移除不必要的title字段。
  2. 初始化空的materials数组:避免一开始就添加无效的Drive文件对象,只有在获取到有效evidenceId后才push。
  3. 同步更新描述内容:因为你修改了assessmentComments,需要同步更新materials.description,否则新的证据链接不会出现在Classroom的描述里。
  4. 优化文件名获取:不再用固定的"evidence",而是从URL提取文件名,让Drive里的文件名称更清晰。

可选的shareMode值说明

根据Google Classroom API文档,shareMode支持以下选项:

  • VIEW:学生只能查看文件,不能编辑或复制
  • STUDENT_COPY:每个学生会获得文件的独立副本,自己可以编辑
  • OWNER:学生获得文件的所有者权限(一般不推荐)

你可以根据实际需求选择合适的模式。

备注:内容来源于stack exchange,提问作者grantc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:09:07