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

如何在Google Sheets中登录需鉴权网站抓取Canvas成绩数据

解决方法

你使用的IMPORTXML是Google Sheets内置的无状态抓取函数,不会携带Canvas平台的登录身份凭证,因此请求成绩页时会被重定向到登录页面,无法抓取到目标成绩数据。

方案1:使用Canvas官方API(最稳定,推荐)

  • 步骤1:获取Canvas API访问令牌
    登录你的Canvas账号,进入「账户」-「设置」,下拉到「已批准的集成」区域,点击「+ 新访问令牌」,自定义填写令牌用途、过期时间后生成,复制生成的令牌(令牌仅显示一次,需妥善保存)
  • 步骤2:在Google Sheets中配置自定义脚本
    打开目标Google Sheets,点击顶部菜单栏「扩展程序」-「Apps 脚本」,删除默认代码后粘贴以下代码:
    function getCanvasGrades() {
      // 替换为你自己的Canvas访问令牌
      const API_TOKEN = "YOUR_CANVAS_API_TOKEN";
      const CANVAS_DOMAIN = "https://learn.canvas.net";
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      // 写入表头
      let currentRow = 1;
      sheet.getRange(currentRow, 1).setValue("课程名称");
      sheet.getRange(currentRow, 2).setValue("当前成绩");
      sheet.getRange(currentRow, 3).setValue("最终成绩");
      currentRow++;
    
      try {
        // 获取当前账号下的活跃课程列表
        const courseResp = UrlFetchApp.fetch(`${CANVAS_DOMAIN}/api/v1/courses?enrollment_state=active`, {
          headers: {
            "Authorization": `Bearer ${API_TOKEN}`
          }
        });
        const courses = JSON.parse(courseResp.getContentText());
        
        // 遍历拉取每门课的成绩
        courses.forEach(course => {
          if(!course.id || !course.name) return;
          const gradeResp = UrlFetchApp.fetch(`${CANVAS_DOMAIN}/api/v1/courses/${course.id}/enrollments?user_id=self`, {
            headers: {
              "Authorization": `Bearer ${API_TOKEN}`
            }
          });
          const enrollment = JSON.parse(gradeResp.getContentText())[0];
          const currentGrade = enrollment?.grades?.current_score || "暂无";
          const finalGrade = enrollment?.grades?.final_score || "暂无";
          // 写入表格
          sheet.getRange(currentRow, 1).setValue(course.name);
          sheet.getRange(currentRow, 2).setValue(currentGrade);
          sheet.getRange(currentRow, 3).setValue(finalGrade);
          currentRow++;
        })
      } catch (e) {
        SpreadsheetApp.getUi().alert("拉取成绩失败:" + e.toString());
      }
    }
    
  • 步骤3:运行脚本拉取成绩
    替换代码中的YOUR_CANVAS_API_TOKEN为你之前生成的令牌,点击保存,然后点击运行按钮,第一次运行需要按照提示完成Google账号授权,授权完成后成绩会自动写入当前表格中。

方案2:携带Cookie临时抓取(仅应急使用,不稳定)

如果不想申请API令牌,可以用携带登录态Cookie的方式临时抓取,缺点是Cookie过期或者退出Canvas账号后就会失效,需要重新操作:

  • 登录Canvas平台后打开成绩页,按F12打开浏览器开发者工具,切换到「网络」面板,刷新页面,找到请求地址为https://learn.canvas.net/grades的请求,点击进入后在「请求头」区域复制完整的Cookie字段内容
  • 同样打开Apps Script,使用以下代码抓取解析页面:
    function getGradesWithCookie() {
      const cookie = "你复制的完整Cookie内容";
      const resp = UrlFetchApp.fetch("https://learn.canvas.net/grades", {
        headers: {
          "Cookie": cookie
        }
      });
      const content = resp.getContentText();
      // 后续可自行用XmlService解析内容提取td节点,或直接用正则匹配成绩
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      sheet.getRange(1,1).setValue(content);
    }
    

内容的提问来源于stack exchange,提问作者UFTaco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:27:03