GOOGLE ADS

суббота, 7 мая 2022 г.

Сценарий приложения — как ускорить функцию setBackground()?

Я борюсь со своей setBackground()функцией в сценарии приложения. Как я могу ускорить его? Это работает, но выполнение очень медленное.

Я написал это:

function changeColor(sheetName, startColorCol, sizeCellCol, totalCellCol) {
var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
for (z = startColorCol; z <= totalCellCol; z = z + sizeCellCol) {
// As this is called onEdit() we don't want to perform the entire script every time a cell is
// edited- only when a status cell is mofified.
// To ensure this, before anything else we check to see if the modified cell is actually in the status column.
if (sSheet.getActiveCell().getColumn() == z) {
var row = sSheet.getActiveRange().getRow();
var value = sSheet.getActiveCell().getValue();
var col = "white"; // Default background color
var colLimit = z; // Number of columns across to affect
switch (value) {
case "fait":
col = "MediumSeaGreen";
break;
case "sans réponse":
col = "Orange";
break;
case "proposition":
col = "Skyblue";
break;
case "Revisions Req":
col = "Gold";
break;
case "annulé":
col = "LightCoral";
break;
default:
break;
}
if (row >= 3) {
sSheet.getRange(row, z - 2, 1, sizeCellCol).setBackground(col);
}
}
}
}

Я видел, что мне может понадобиться использовать пакетные операции, но я понятия не имею, как заставить это работать.

Дело в том, что мне нужно покрасить диапазон ячеек, когда значение одного из них изменилось. Любые идеи?

Спасибо


Решение проблемы

Проблемы:

  • Вы хотите проверить только одну ячейку, ячейку, которая была отредактирована ( var value = sSheet.getActiveCell().getValue();). Поэтому нет смысла использовать цикл.

  • Решение:

  • Используйте объект события, чтобы получить данные об отредактированной ячейке (лист, индекс столбца, индекс строки и т. д.), вместо использования цикла и проверки getActiveCell().getColumn()каждый раз. Этот объект события передается в onEditкачестве параметра по умолчанию ( eв приведенном ниже примере), но вы должны передать его в свою changeColorфункцию в качестве аргумента.

  • Прежде чем делать что-либо еще, проверьте, является ли редактируемая ячейка одной из редактируемых ячеек в диапазоне, который вы отслеживаете (правильный лист, строка более 3, столбец между startColorColи totalCellCol.

  • Если редактируемая ячейка находится в правильном диапазоне, обновите цвета фона.

  • Пример кода:

    function onEdit(e) {
    //...Some stuff...
    changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol);
    }
    function changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol) {
    const range = e.range;
    const column = range.getColumn();
    const row = range.getRow();
    const sSheet = range.getSheet();
    if (sSheet.getName() === sheetName && column >= startColorCol && column <= totalCellCol && row >= 3) {
    const value = range.getValue();
    let col = "white"; // Default background color
    switch (value) {
    case "fait":
    col = "MediumSeaGreen";
    break;
    case "sans réponse":
    col = "Orange";
    break;
    case "proposition":
    col = "Skyblue";
    break;
    case "Revisions Req":
    col = "Gold";
    break;
    case "annulé":
    col = "LightCoral";
    break;
    default:
    break;
    }
    sSheet.getRange(row, column-2, 1, sizeCellCol).setBackground(col);
    }
    }

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...