以多个阈值为基础编写公式/脚本&在多行中应用它

时间:2016-08-17 14:24:18

标签: google-apps-script google-sheets excel-formula

我正在尝试编写一个公式或脚本,它将接受两个输入,一个学生的出勤和GPA,并吐出他们的On-Track评级,如此处所述。

on-track-matrix

My Google Sheet

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

的模糊查找

我做了参考表

ontrack reference table

这些是我尝试过的公式,其中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))))

1 个答案:

答案 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;)用于替换。