2017-02-27 54 views
-1

我们的一所高中正尝试为当前失败一个或多个班级的学生创建每周报告。报告格式如下。如何将数据追加到Google Apps脚本的行尾

如果学生失败多个班级,信息是在不同的行。这些信息需要合并,每个学生在一列中 - 第1列是名称,随后的列是针对年级/班级/教师的信息。

目前,我有代码删除空白工作表,创建一个标题为“输出”的新工作表,写入标题行,并在第1列中写入唯一名称(部分注释掉,因此不会创建重复的“输出”片每次):

function copyRows() { 
    //Initialize variables 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var dataSheet = ss.getSheetByName("Sheet1"); 

/* 
    //Create output Sheet 
    ss.insertSheet("Output"); 
    */ 
    var writeSheet = ss.getSheetByName("Output"); 
    /* 

    //Delete unwanted columns (1, 3, 4, 7, 9) 
    dataSheet.deleteColumn(1); //Deletes first column 
    dataSheet.deleteColumn(2); // Deletes third column (because it shifts after every deletion) 
    dataSheet.deleteColumn(2); //Deletes fourth column 
    dataSheet.deleteColumn(4); //Deletes 7th column 
    dataSheet.deleteColumn(5);//Deletes 9th column 


    //Delete unwanted Sheets 
    var deleteSheet2 = ss.getSheetByName("Sheet2"); 
    var deleteSheet3 = ss.getSheetByName("Sheet3"); 
    ss.deleteSheet(deleteSheet2); 
    ss.deleteSheet(deleteSheet3); 

    //Write data to header row 
    var headerRange = writeSheet.getRange("A1:V1"); 
    var headerValues = [ 
    ["name", "class1", "grade1", "teacher1","class2", "grade2", "teacher2","class3", "grade3", "teacher3","class4", "grade4", "teacher4","class5", "grade5", "teacher5","class6", "grade6", "teacher6","class7", "grade7", "teacher7"] 
    ] 
    headerRange.setValues(headerValues); 
    */ 

    var lastRow = dataSheet.getLastRow(); 
    var mainArray = dataSheet.getRange(1, 1, lastRow, 4).getValues(); 

    var allNames = []; //List of all names, including duplicates 
    var uniqueNames = []; //List of all unique names 

    for (i = 0; i < mainArray.length; i++) { //Sets allNames 
    allNames.push(mainArray[i][0]); 
    } 

    for (i = 0; i < allNames.length; i++) { //Sets uniqueNames 
    if (allNames[i+1] != allNames[i]) { 
     uniqueNames.push(allNames[i]); 
    } 
    } 
    var uniqueNamesArray = uniqueNames; 


    //New method that converts 1d array to 2d array 

    Array.prototype.reshape = function(rows, cols) { 
    var copy = this.slice(0); // Copy all elements. 
    this.length = 0; // Clear out existing array. 

    for (var r = 0; r < rows; r++) { 
     var row = []; 
     for (var c = 0; c < cols; c++) { 
      var i = r * cols + c; 
      if (i < copy.length) { 
       row.push(copy[i]); 
      } 
     } 
     this.push(row); 
    } 
    }; 
    var uniqueNamesRow = uniqueNames; 
    uniqueNames.reshape(uniqueNames.length, 1); //Changing uniqueNames from row to column 


    var writeNamesRange = writeSheet.getRange(2,1,uniqueNames.length,1); //writeSheet column 1 
    writeNamesRange.setValues(uniqueNames); 

示例数据:

  1. 院长John Doe的50个波段先生
  2. 玛丽·史密斯60美国历史琼斯女士
  3. 玛丽小号MITH 25化学Dyar女士
  4. 玛丽·史密斯40代数2哈里斯女士院长
  5. 拉里·琼斯22代数2哈里斯女士

随着输出

  • 鲍勃·米勒55乐队先生:

    院长

  • 玛丽·史密斯60美国历史琼斯女士

    1. 李四50个波段先生25化学Dyar 40代数女士2哈里斯女士

    2. 鲍勃·米勒55乐队先生院长

    3. 拉里·琼斯22代数2哈里斯女士

    需要注意的是玛丽·史密斯的数据被组合成一排。

    我只是无法弄清楚如何遍历行并将数据追加到相应行的末尾。

    对不起以前缺乏的细节,并感谢您的反馈意见。

  • +0

    尝试更具体地了解问题,您拥有的数据,您编写的代码而不是解释学校情况,并且不链接外部文档。欢迎来到堆栈溢出 –

    +1

    有许多Stack Overflow会员想要帮助你,并同情你的情况。通过发布一个问题,已经有一个需要的假设。从你的名誉1我们可以看到你在这里是新的。如果可以隔离导致问题的一行代码或一小段代码,则提供帮助会更容易。 –

    +0

    你想让你的输出看起来像什么?失败的标准是什么?你有没有能够唯一识别每个人的学生号码? – Cooper

    回答

    0

    我根据您的输入和输出(而不是您的代码)编写了一些代码。由于学生的姓名是主键,所以我认为字典数据结构在这里是适合的。下面的代码不是很优雅,许多文字都是硬编码的,但我想你可以把握这个想法。示例表是here

    function myFunction() { 
        var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('input'); 
        var rows = 6; 
        var cols = 4; 
        var input = ss.getRange(1,1, rows,cols).getValues(); 
    
        var students = []; 
        for(var i = 0; i < input.length; i++) { 
        var name = input[i][0]; 
        var class = { 
         score: input[i][1], 
         class: input[i][2], 
         teacher: input[i][3] 
        }; 
    
        var j; 
        for(j = 0; j < students.length; j++) { 
         if(students[j].name == name) { 
         students[j].classes.push(class); 
         break; 
         } 
        } 
        if(j == students.length) { 
         students.push({ 
         name: name, 
         classes: [class] 
         }); 
        } 
        } 
    
        var ts = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('output'); 
    
        var output = []; 
        for(var i = 0; i < students.length; i++) { 
        output[i] = [students[i].name]; 
        for(var j = 0; j < students[i].classes.length; j++) { 
         output[i].push(students[i].classes[j].score, 
            students[i].classes[j].class, 
            students[i].classes[j].teacher); 
        } 
        ts.getRange(i+1,1, 1,output[i].length).setValues([output[i]]); 
        } 
    } 
    
    +0

    太棒了,谢谢!我没有考虑过使用字典......还有很多东西需要学习。 – misterbastean

    相关问题