【问题标题】:Google Apps Script to list all Google Classroom courses and put them in a Google Spreadsheet用于列出所有 Google 课堂课程并将它们放入 Google 电子表格的 Google Apps 脚本
【发布时间】:2018-01-17 00:36:28
【问题描述】:

我正在尝试创建一个 Google Apps 脚本,该脚本将列出所有有效和存档的 Google 课堂课程,以及 ID、NAME、SECTION 和 COURSESTATE。一切正常,除了我不知道如何修复 .getRange 以便它将所有信息放入 Google 电子表格中。我得到的错误是“不正确的范围高度,是 4 但应该是 10”。如果我将 .getRange 简单地放在“A1:D1”中,它将覆盖每个类的内容,直到脚本完成,所以我知道脚本的其余部分有效,但我不知道如何放置范围以便可以列出所有类。我到现在为止是这样的:

function listCourses() {
var response = Classroom.Courses.list();
var courses = response.courses;
 if (courses && courses.length > 0) {
  for (i = 0; i < courses.length; i++) {
   var course = courses[i];
   var ids = course.id;
   var title = course.name;
   var sec = course.section;
   var state = course.courseState; 
   var arr1 = [];
   arr1.push(ids,title,sec,state); 
   var arr2 = [];
   while(arr1.length) arr2.push(arr1.splice(0,1));

var s = SpreadsheetApp.getActiveSpreadsheet();
var sh = s.getSheetByName('LISTS');

  for (var x=0; x<arr2.length; x++){   
  var newRow = sh.getLastRow() + 1; 

// Here in the .getRange is where it gives me the error. A new row should be added for each Class until all the Classes (with the information mentioned above) are listed. 

  sh.getRange(1, 1, newRow, arr2[0].length).setValues(arr2);   
  }

}}}

【问题讨论】:

  • 试试sh.getRange(1,1,arr2.length,arr2[0].length).setValues(arr2)。消除最后一个循环并从您希望开始宽度的任何行开始一次加载它。我假设第 1 行。
  • 这一行只将最后一个类放在电子表格中。我尝试了有无循环。最重要的是,当我需要按行(A1:D1、A2:D2 等)的信息时,它会将其放在 A1:A4 中。我不知道为什么,但是现在,如果我输入 for (var x=0; x
  • 看看我刚刚发布的答案。

标签: google-apps-script google-sheets google-classroom


【解决方案1】:

试试这样的: 我不怎么使用 Classroom API,而且我只有一个类,但这对它有用。

function listCourses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('LISTS');
  var response = Classroom.Courses.list();
  var courses = response.courses;
  var arr=[];//You could put column headers in here
  for (i = 0; i < courses.length; i++) {
    var course = courses[i];
    var ids = course.id;
    var title = course.name;
    var sec = course.section;
    var state = course.courseState;  
    arr.push([title,sec,state]); //you could also go sh.appendRow([title,sec,state]); here if you wish and avoid the use of the two dimensional array all together as suggested in the other answer.
  }
  sh.getRange(1, 1, arr.length, arr[0].length).setValues(arr);   
}

【讨论】:

    【解决方案2】:

    杰森。您可以使用附加行绕过范围问题。然而,这将意味着操纵数据,以便每个类的详细信息都在一行上。我更喜欢这种方法,因为它容易出错。它还会自动找到工作表中的下一个空行,因此您不需要获取最后一行。

    function appendRow() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Sheet1');
    
      // Try is added to catch failures on automated scripts
      try {
        sheet.appendRow(['cell1','cell2','cell3'])
      } catch (e){
        Logger.log(e)
        // Could send an email here to alert script failure
      }
      // In a loop
      var data = [['row 1 cell 1','row 1 cell 2'],['row 2 cell 1','row 2 cell 2 ']]
      data.forEach(function(item){
        sheet.appendRow(item)
      })
    }
    

    【讨论】:

    • 我用 .appendRow 尝试了 4 种方法,但没有结果。我试过 var s = SpreadsheetApp.getActiveSpreadsheet(); var sh = s.getSheetByName('LISTS'); sh.appendRow(arr2); var s = SpreadsheetApp.getActiveSpreadsheet(); var sh = s.getSheetByName('LISTS'); for (var x=0; x
    • 抱歉,您遇到了困难。我更新了功能。确保您的附加数组是平坦的。我还添加了一个循环示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多