Как создать сценарий OnEdit (), который повторно сортирует мои данные по 3 столбцам, когда я заполняю запись для строки? - PullRequest
0 голосов
/ 27 мая 2020

Я ищу сценарий OnEdit (), который повторно сортирует мои данные по 3 столбцам по мере того, как я заполняю запись для строки.

Вот пример Raw-примера типа таблиц, которые я составляю, и еще один пример того, что я хотел бы видеть как обработанный пример - то есть примерно то, как я бы хотел, чтобы листы сценария группировались и сортируются листы в следующем порядке:

- ПЕРВАЯ СОРТИНА G: Столбец A -> Агентство [сортировка A - Z] - чтобы все строки агентства были группами вместе и отсортированы от A до Z

-Затем ВТОРАЯ СОРТИРОВКА : Столбец B -> Подагентство [сортировка от A до Z] - чтобы все Подагентства -Строки агентства объединяются в группы и отсортированы от A до Z

-И, наконец, ТРЕТЬЯ СОРТИРОВКА : Столбец C -> Дата: отправлено или получено [sort Z - A] - так что после того, как строки агентства сгруппированы и отсортированы, а строки субагентства сгруппированы и отсортированы, строки могут быть отсортированы по значениям «Дата: отправлено или получено», startti ng с самой ранней датой внизу

Кроме того, , если возможно, , я бы создал строку или какое-то определение между каждым новым значением, введенным в один из моих столбцов. В частности, я хотел бы, чтобы между каждым новым субагентством было какое-то пространство / определение строки, которые представляют собой значения, которые я ввожу в столбец B моей электронной таблицы.

Любые идеи / предложения о том, как это сделать ?

Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 27 мая 2020

Я вижу другой вопрос, который вы задали, и кажется идентичным. Попробуйте отредактировать вопрос, чтобы улучшить их, вместо того, чтобы создавать новые.

Тем не менее, я сделал очень образец скрипта, чтобы показать вам способ упорядочивания по строкам индивидуальным способом.

function onEdit(e) {
    const sheet = SpreadsheetApp.getActiveSheet();
    const targetRange = sheet.getRange("A2:C8" );

    let data = targetRange.getValues();

    Logger.log(data)

    data.sort((a, b) => {
        if (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]) {
            return 0; // Same row 
        }
        if (a[0] == b[0] && a[1] == b[1]) { // Third column is different
            return a[2] < b[2] ? 1 : -1;

        }
        if (a[0] == b[0]) { // Second column is different
            return a[1] > b[1] ? 1 : -1;

        }

        return a[0] > b[0] ? 1 : -1; // Reaching this point first column is differen
    })
    Logger.log(data);
    targetRange.setValues(data);
}

Идея проста: собрать все значения и затем решить, какие критерии вы хотите применить, чтобы определить, что должно появиться первым.

Если вы все еще не понимаете, что здесь происходит, посмотрите документацию для sort(). В частности, как работает compareFunction.

Результат

Начиная с этих данных:

First

После срабатывания триггера onEdit:

After

...