数组中的可变长度数据

时间:2014-07-13 19:39:18

标签: google-apps-script

我正在创建一个应用脚本,允许教师将其成绩复制并粘贴到Google电子表格中,并计算学生的平均成绩,包括硬件,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]

就像我之前说过的那样,下周可能会有更多的家庭作业,所以我必须更改脚本才能获得文档合并的其他作业。我确实让用户输入硬件分配的数量,因此当它是动态的时,脚本就知道了。有任何想法吗?这可能很容易,但我找不到任何东西。

1 个答案:

答案 0 :(得分: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点......)虽然每个类别的项目数量有所变化,但你可以到达以编程方式通过在成绩表内的两个时间戳(周开始/结束或其他)之间计算类别代码的数量来进行除数。