如何通过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; }
关键修改说明
- 修正Drive文件结构:把
driveFile.id改成driveFile.driveFileId,添加shareMode字段,移除不必要的title字段。 - 初始化空的materials数组:避免一开始就添加无效的Drive文件对象,只有在获取到有效
evidenceId后才push。 - 同步更新描述内容:因为你修改了
assessmentComments,需要同步更新materials.description,否则新的证据链接不会出现在Classroom的描述里。 - 优化文件名获取:不再用固定的"evidence",而是从URL提取文件名,让Drive里的文件名称更清晰。
可选的shareMode值说明
根据Google Classroom API文档,shareMode支持以下选项:
VIEW:学生只能查看文件,不能编辑或复制STUDENT_COPY:每个学生会获得文件的独立副本,自己可以编辑OWNER:学生获得文件的所有者权限(一般不推荐)
你可以根据实际需求选择合适的模式。
备注:内容来源于stack exchange,提问作者grantc
相关产品推荐
相关产品推荐

