我正在尝试编写一个公式或脚本,它将接受两个输入,一个学生的出勤和GPA,并吐出他们的On-Track评级,如此处所述。
function ONTRACK(Att, GPA){
function getAttendanceRow(number){
if(number>=98){row="A";}
else if(number>=95){row="B";}
else if(number>=90){row="C";}
else if(number>=80){row="D";}
else {row="E";}
return row
}
function getGPACol(number){
if(number<1){col="F";}
else if(number<2){col="G";}
else if(number<3){col="H";}
else {col="I";}
return col
}
var matrix=getAttendanceRow(Att) + getGPACol(GPA)
var matrix_hash={'AI':5, 'BI':5,
'AH':4, 'CI':4,
'AG':3, 'BG':3, 'BH':3, 'CH':3, 'DI':3,
'BF':2, 'CF':2, 'CG':2, 'DG':2, 'DH':2,'EH':2,
'DF':1, 'EF':1, 'EG':1 }
return matrix_hash[matrix]
}
两个问题
1。如何在不产生超时错误的情况下跨大量行应用此功能?
我试过使用setFormula
function makeN(){
ss.getRange("N2").setFormula("=ONTRACK(G2*100,H2)");
ss.getRange("N2").copyTo(ss.getRange("N2:N"+lastRow));
}
我也使用了map文档中建议的map方法,但是得到了关于第一个未定义元素的错误。我不熟悉地图方法,所以我的问题就在那里。
function ONTRACK2(input){
if (input.map) { // Test whether input is an array.
return input.map(ONTRACK2); // Recurse over array if so.
} else {
// do actual function work here
return ONTRACK(input[0][0]*100, input[0][1])
}
};
类似于GPA,我正在计算GPA而没有错误:
function GPA2(input){
if (input.map) { // Test whether input is an array.
return input.map(GPA2); // Recurse over array if so.
} else {
// do actual function work here
return myAverage(getPoints(input[0][0]), getPoints(input[0][1]), getPoints(input[0][2]), getPoints(input[0][4]))
}
};
另一个基于脚本的想法是通过迭代构建某种数组对象,存储“On Track”值,然后将它们写入正确的列。
2。这可以在没有AppScripts的情况下完成,而不是作为in-Sheets公式吗?
我正在使用引用here
的模糊查找我做了参考表
这些是我尝试过的公式,其中G列和H列分别是我的出勤率和GPA。
=INDEX('Reference Table'!F2:F20,MATCH(2,INDEX(1/(('Reference Table'!D2:D20=G2)*('Reference Table'!E2:E20<=H2)),0)))
=ArrayFormula(INDEX('Reference Table'!$F$2:$F$20,MAX(ROW('Reference Table'!$D$2:$D$20)*(('Reference Table'!$D$2:$D$20)=G2)*(('Reference Table'!$E$2:$E$20)<=H16))))
答案 0 :(得分:2)
我不确定表单公式,但您可以使用apps脚本执行此操作。
转到your sheet,在菜单上点击&#34;找到学生跟踪&#34;和&#34;计算音轨&#34;。专栏&#34; P&#34;将填写学生跟踪数据。瞧!
这是我的功能
private class Segment
{
internal volatile T[] m_array; // should be readonly too
internal volatile VolatileBool[] m_state; // should be readonly too
private volatile Segment m_next;
internal readonly long m_index;
private volatile int m_low;
private volatile int m_high;
private volatile ConcurrentQueue<T> m_source; // should be readonly too
internal Segment(long index, ConcurrentQueue<T> source)
{
m_array = new T[SEGMENT_SIZE]; // field only assigned here
m_state = new VolatileBool[SEGMENT_SIZE]; // field only assigned here
m_high = -1;
m_index = index; // field only assigned here
m_source = source; // field only assigned here
}
internal void Grow()
{
// m_index and m_source need to be volatile since race hazards
// may otherwise arise if this method is called before
// initialization completes (or appears to complete)
Segment newSegment = new Segment(m_index + 1, m_source);
m_next = newSegment;
m_source.m_tail = m_next;
}
// ...
}
你可以查看你的床单&#39;相关代码(&#34; GPA&#34;)用于替换。