2014-07-13 101 views
0

我正在創建一個應用程序腳本,該腳本允許教師將其成績複製並粘貼到Google電子表格中,並將計算HW,CW,Labs和Tests的學生平均值。然後它將採用最終的4個加權類別並計算學生的最終平均值。它們的關鍵在於HW,CW,Labs和Tests的數量是動態的。今天,可能有5項家庭作業,但明天可能會有7次,下週可能會有10次。與其他三種類別一樣。最後,腳本會將信息合併到文檔模板中,然後通過電子郵件發送成績。
我已完成部分做分級部分,現在我在文檔合併部分,我不知道什麼要搜索幫助在計算器上。在列數固定的正常情況下,例如表單輸入,我可以進行文檔合併,然後通過電子郵件發送文檔。你得到的數組中的值和變量定義爲每列數組中的可變長度數據

var data = sh.getRange(lastRow,1,1,lastCol).getValues(); 
var stufirstname = data[0][1]; 
var stulastname = data[0][2]; 
and so on an so forth 

.getRange(行,列,numRow行,numCol).getValues();是動態的,所以我如何從中提取信息?我正在尋找像下面這樣的工作。

var hw1 = data[0][1] 
var hw2 = data[0][2] 
var hw3 = data[0][3] 

就像我剛纔所說,下週可能會有更多的家庭作業,所以我不得不改劇本,以獲得其他任務的文檔合併。我確實有用戶在動態時輸入硬件分配的數量,這是由腳本知道的。有任何想法嗎?這可能很容易,但我一直無法找到任何東西。

+0

你必須更具體地確定你想要做什麼。也許可以使用示例電子表格並解釋您遇到的問題。還使用更好的代碼示例。 – AshClarke

回答

0

由於數據表的佈局未知,問題有點尷尬。以下是我如何接近它;希望它會給你一個開始:

function onOpen() { 
    var ss = SpreadsheetApp.getActive(); 
    var students = ss.getSheetByName('Students'); 
    var grades = ss.getSheetByName('Grades'); 
    var ui = SpreadsheetApp.GetUi(); 
    var app = UiApp.createApplication(); 
    var flow = app.createFlowPanel(); 
    var categoryArray = ['Homework', 'Classwork', 'Labs', 'Tests']; 
    var categoryList = app.createListBox().setId('categoryList'); 
    for (i=0;i<categoryArray.length;i++) {categoryList.addItem(categoryArray[i], categoryArray[i])} 
    var studentArray = []; 
    var studentValues = students.getDataRange().getValues(); 
    for (i=0;i<students.getLastRow();i++) {studentArray.push(studentValues[i][firstNameColumnInt] + ' ' + studentValues[i][lastNameColumnInt]);} 
    var studentList = app.createListBox().setId('student'); 
    for (i=0;i<studentArray.length;i++) {studentList.addItem(studentArray[i], categoryArray[i])}; 
    var grade = app.createTextBox().setId('grade');  
    var submit = app.createButton('Submit Grade'); 
    var report = app.createButton('Report Student Averages'); 

    var submitHandler = app.createServerHandler('submitHandler').addCallbackElement(flow); 
    var reportHandler = app.createServerHandler('reportHandler').addCallbackElement(flow); 

    submit.addClickHandler(submitHandler); 
    report.addClickHandler(reportHandler); 

    flow.add(studentList).add(categoryList).add(submit).add(report); 

    app.add(flow); 

    ui.showSidebar(app); 

} 

//我對你如何記錄成績做了一些假設。 //使用這個系統將動態代碼按名稱,類別,等級&時間戳

function submitHandler (e) { 
    var ss = SpreadsheetApp.getActive(); 
    var app = UiApp.getActive(); 
    var grades = ss.getSheetByName('Grades'); 

    grades.appendRow([e.parameter.student, e.parameter.category, e.parameter.grade, new Date()]); 

    return app; 

} 

// 
function reportHandler (e) { 

    var ss = SpreadsheetApp.getActive(); 
    var app = UiApp.getActive(); 
    var students = ss.getSheetByName('Students'); 
    var studentArray = []; 
    var studentValues = students.getDataRange().getValues(); 
    for (i=0;i<students.getLastRow();i++) {studentArray.push(studentValues[i][firstNameColumnInt] + ' ' + studentValues[i][lastNameColumnInt]);} 
    var body = DocumentApp.create('Report').getBody(); 
    var title = body.appendParagraph('Student Grades Report Generated: ' + new Date()); 
    var table = body.appendTable().appendTableRow(['Name', 'Category Averages 1 - 4 (or n)', 'Grade'); 
    for (i=0;i<students.getLastRow();i++) { 
     body.appendRow([studentArray[i], yourWeightedAverageFormulaForAGivenCategory(i), yourGPAFormula(i)])} 
     } 

    GmailApp.sendEmail(Session.getActiveUser().getEmail(), 'Generated Report', body); 

    app.close(); 
    return app; 
} 

每個條目反正我知道這個代碼是不完整的,但希望有足夠的在這裏,讓你在正確的道路上(也許賺取一些SO點......)每個類別的項目數量發生變化時,您可以通過計算等級表內兩個時間戳(星期開始/結束,或其他)之間的類別代碼數量來獲得除數。