Условное форматирование скрипта Google Sheets для whenNumberLessThanOrEqualTo (строка)

В таблицах Google я добавил условное форматирование, связанное с различными буквенными кодами. Здесь A-D - красные, E-F - желтые, а G и более поздние - зеленые:

введите здесь описание изображения

Это работает так, как я ожидаю и хочу.

При попытке сделать то же самое с помощью сценария приложений, похоже, это не поддерживается, потому что здесь более строгая проверка типов, чем в пользовательском интерфейсе:

  SpreadsheetApp.newConditionalFormatRule()
    .whenNumberLessThanOrEqualTo('D')
    .setBackground('#ff0000')
    .setRanges([range])
    .build());

Это показывает сообщение об ошибке:

Cannot find method whenNumberLessThanOrEqualTo(string)

И поэтому я не могу создать объект правила, чтобы применить его к листу.

Есть ли способы создать такое же правило, которое я создал в пользовательском интерфейсе, с помощью скриптов приложений? Или альтернативные способы сделать это? Лучший путь, кажется, просто повторно реализовать это в JS и использовать TEXT_EQUAL_TO для полного перечисления буквенных значений или что-то подобное с CUSTOM_FORMULA (docs).


person Kevin Robinson    schedule 10.09.2019    source источник


Ответы (1)


К сожалению, встроенный служебный метод whenNumberLessThanOrEqualTo() ожидает числовые значения в качестве аргументов вместо строк.

Однако вместо этого вы можете использовать расширенные таблицы. Служба расширенных таблиц - это, по сути, оболочка для REST API Google Таблиц. Он более сложный и требует, чтобы вы знали многие объекты ресурсов REST (см. справочную документацию), составляющие схему API.

Кроме того, вам необходимо включить расширенный сервис Sheet API в своем проекте GAS, прежде чем вы сможете его использовать (см. документацию о том, как включить расширенную службу).

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

Следующий сценарий является примером того, как это можно сделать:

function buildRule() {
    var conditionValue = Sheets.newConditionValue();
    var booleanCondition = Sheets.newBooleanCondition();

    var color = Sheets.newColor();
    var cellFormat = Sheets.newCellFormat();

    var booleanRule = Sheets.newBooleanRule();
    var gridRange = Sheets.newGridRange();

    var formatRule = Sheets.newConditionalFormatRule();
    var addConditionalFormatRuleRequest = Sheets.newAddConditionalFormatRuleRequest();

    var request = Sheets.newRequest();

    var batchRequest = Sheets.newBatchUpdateSpreadsheetRequest();

    conditionValue.userEnteredValue = "D";

    booleanCondition.type = "NUMBER_GREATER_THAN_EQ";
    booleanCondition.values = [conditionValue];

    // #ff0000 in RGB format
    color.red = 1; // values range from 0 to 1
    color.blue = 0;
    color.green = 0;

    cellFormat.backgroundColor = color;

    booleanRule.condition = booleanCondition;
    booleanRule.format = cellFormat;

    // selects E2 as range
    gridRange.sheetId = 0;
    gridRange.startColumnIndex = 4;
    gridRange.endColumnIndex = 5;
    gridRange.startRowIndex = 1;
    gridRange.endRowIndex = 2;

    formatRule.booleanRule = booleanRule;
    formatRule.ranges = [gridRange];

    addConditionalFormatRuleRequest.rule = formatRule;
    addConditionalFormatRuleRequest.index = 0; // index of rule; increment to add other rules

    request.addConditionalFormatRule = addConditionalFormatRuleRequest;
    batchRequest.requests = [request];

    Sheets.Spreadsheets.batchUpdate(batchRequest, SpreadsheetApp.getActive().getId());
}


Приведенный выше сценарий довольно подробный, поэтому, если вы разбираетесь в типах ресурсов для схемы API Google Sheets, следующего также будет достаточно:

function buildRule() {
    var batchRequest = {
       "requests":[
          {
             "addConditionalFormatRule":{
                "rule":{
                   "booleanRule":{
                      "condition":{
                         "type":"NUMBER_GREATER_THAN_EQ",
                         "values":[
                            {
                               "userEnteredValue":"D"
                            }
                         ]
                      },
                      "format":{
                         "backgroundColor":{
                            "red":1,
                            "blue":0,
                            "green":0
                         }
                      }
                   },
                   "ranges":[
                      {
                         "sheetId":0,
                         "startColumnIndex":4,
                         "endColumnIndex":5,
                         "startRowIndex":1,
                         "endRowIndex":2
                      }
                   ]
                },
                "index":0
             }
          }
       ]
    };

    Sheets.Spreadsheets.batchUpdate(batchRequest, SpreadsheetApp.getActive().getId());
}
person TheAddonDepot    schedule 10.09.2019