0

我正在使用 Google 表格收集数据,供教师用于确定有资格获得 Title 1 服务的学生。

该表单将数据提供给 Google 表格,我想自动按类别对分数求和,然后在每个类别中对它们进行排名。

我有这段代码可以将摘要从一列复制到另一列,但是我需要对列进行排名,这就是我卡住的地方。有人可以帮助我了解如何对数据进行排名吗?

我想我可能需要一个for循环——但我被困住了。

function CopyRankData() 
{
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var SourceSheet=spreadSheet.getSheetByName('Ranking')
  var srcRange = SourceSheet.getRange('D1:D31');
  var destSheet = spreadSheet.getSheetByName('Ranking');
  var destRange = destSheet.getRange('I1:I31');
  srcRange.copyTo(destRange);
  --Need to Rank the column ---[Link to spreadsheet][1]
}
4

1 回答 1

0

下面是一个非常简单的实用程序,可以正确模拟RANK公式(包括升序和降序)。如果您需要使其按范围的另一列排序或使用另一个比较器,则很容易更改并使其更加通用。

您需要做的是按某些标准对目标列值的副本进行排序,获取结果索引,并将其递增,1因为 Array 索引是0基于 - 的。

/**
 * @summary ranks a range by first column
 * @param {number[][]} range
 * @param {(1|0)} [ascending]
 * @return {number[][]}
 * @customfunction
 */
const rankRange = (values, ascending = 0) => {

    try {

        const rows = values.map(v => v).sort((a, b) => {
            const aParsed = parseFloat(a[0]);
            const bParsed = parseFloat(b[0]);
            return ascending ?
                aParsed - bParsed :
                bParsed - aParsed;
        });

        return values.map((row) => {
            return [rows.findIndex(r => r[0] === row[0]) + 1];
        });

    } catch (error) {
        console.warn(`failed to rank column: ${error}`);
        return [[]];
    }
};

确保在您的项目中启用 V8 运行时以使其正常工作(或在使用前将其转换为 ES5 语法)。


性能说明 -map(v => v)优先使用浅拷贝值。如果您预计项目数量会很高,请使用slice()(感谢 TheMaster 的评论,我决定调查性能损失是什么)。运行下面的交互式代码片段以查看差异:

const rng = document.querySelector("input[type=range]");

const arr = [];

const bench = (func, lbl) => {
  console.time(lbl);
  func();
  console.timeEnd(lbl);
}

rng.addEventListener("change", () => {
  const {
    value
  } = rng;

  const toAdd = new Array(+value).fill(42);

  arr.length = 0;
  arr.push( ...toAdd );

  bench(() => arr.slice(), "slice");
  bench(() => arr.map(v => v), "map");
});
.rng {
  width: 100%
}
<input class="rng" type="range" min="1" max="1e5" step="1">

于 2020-07-21T12:00:37.180 回答