2017-02-27 86 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