2014-07-13 2 views
0

교사가 성적을 복사하여 Google 스프레드 시트에 붙여 넣을 수있는 앱 스크립트를 만들고 HW, CW, 실험실 및 테스트에 대한 학생 평균을 계산합니다. 그런 다음 최종 4 가지 가중 카테고리를 가져 와서 학생들의 최종 평균을 계산합니다. 핵심은 HW, CW, Labs 및 Tests의 수가 동적이라는 것입니다. 오늘 5 가지 숙제가있을 수 있지만 내일에는 7 일과 다음 주 10 일이 될 수 있습니다. 다른 세 가지 카테고리와 동일합니다. 결국 스크립트는 정보를 문서 템플릿에 병합 한 다음 성적을 이메일로 보냅니다.
나는 부분을 채우는 작업을 마쳤으며 이제는 문서 병합 부분을 다루고 있으며 stackoverflow에 대한 도움말을 검색 할 항목이 무엇인지 확실하지 않습니다. 양식 입력과 같이 열의 수가 고정되어있는 일반적인 상황에서는 문서 병합을 수행 한 다음 문서를 전자 메일로 보낼 수 있습니다. 넌 배열의 값을 얻고, 각 열배열의 가변 길이 데이터

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] 

, 다음 주에 더 많은 숙제가있을 수 있습니다. 사용자가 HW 할당 수를 입력하도록하여 동적 인 동안 스크립트에서 알 수 있도록합니다. 어떤 아이디어? 이것은 쉬울 수도 있지만 아무것도 찾을 수 없었습니다.

+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 포인트를 얻으십시오 ...) 카테고리 당 항목의 수가 바뀌는 동안 성적 시트 안에 두 개의 타임 스탬프 (주 시작/종료 또는 기타) 사이의 카테고리 코드 수를 COUNT하는 방식으로 프로그래밍 방식으로 약수에 도달 할 수 있습니다.