Google Apps Script - Как написать код для ранжирования столбца данных

Используя Google Forms, я собираю данные для учителей, чтобы использовать их при определении учеников, которые имеют право на получение услуг по титулу 1. Форма подает данные в Google Sheets, и я хочу автоматизировать процесс суммирования баллов по категориям, а затем ранжировать их в каждой категории. У меня есть этот код, который копирует резюме из одного столбца в другой, но затем мне нужно ранжировать столбец, и вот где я застрял. Может кто-нибудь помочь мне понять, как ранжировать данные? Я думаю, что мне может понадобиться цикл 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]
}

0 ответов

Ниже представлена ​​довольно простая утилита, которая может правильно эмулировать RANKформула (включая ранжирование по возрастанию и убыванию). Если вам нужно отсортировать его по другому столбцу диапазона или использовать другой компаратор, его легко изменить и сделать более универсальным.

Что вам нужно сделать, так это отсортировать копию значений целевого столбца по некоторым критериям, получить результирующий индекс и увеличить его на 1 поскольку индексы массива 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).

Другие вопросы по тегам