Условное форматирование границ в Google Sheets (удовлетворяет нескольким условиям) - PullRequest
2 голосов
/ 02 марта 2020

У меня есть расписание в Google Sheets, для которого необходимо изменить границы в зависимости от того, встречается ли класс в это время.

Он должен быть запущен onEdit, чтобы при изменении электронной таблицы границы обновлялись. Мне нужно будет удалить границы в начале каждого триггера, и у меня есть этот код из другого ответа на вопрос:

    function RemoveBorders() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var cell = sheet.getRange("C5:G29");

cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.solid);
}

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

Условное форматирование фона было выполнено с использованием этой формулы, и оно работает очень хорошо.

=SUMPRODUCT(($B5>=($L$5:$L)),(C$4=($K$5:$K)),($B5<($M$5:$M)))>=1     

У меня есть код, который работает для редактирования границ в Excel с помощью условного форматирования. Но так как я новичок в сценариях Google и Java, это действительно ошеломляет, как преобразовать концепцию

У меня есть три условных правила

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

=SUMPRODUCT((C$4=($K$5:$K)),($B5=($L$5:$L)))>=1

Правило 2: для "средних ячеек" класс, добавить борде rs слева и справа: , если ячейка находится в столбце расписания, который имеет класс в этот день И если период ячейки (9: 00-9: 30) больше или равен классу Начальные значения времени И период времени ячейки меньше значений времени окончания класса.

   =SUMPRODUCT((C$4=($K$5:$K)),($B5>=($L$5:$L)),($B5<($M$5:$M)))>=1

Правило 3: Добавьте границу вверху ячейки (для ячеек сразу после конец класса) если ячейка находится в столбце расписания, у которого есть класс в этот день, И если период ячейки находится в столбцах времени окончания класса.

=SUMPRODUCT((C$4=($K$5:$K)),($B5=($M$5:$M)))>=1

Это мой последний шаг в завершении импорта и манипуляции с данными динамического c, который динамически обновляет расписание отдельного учителя. Я искал и искал и искал столько всего, но я все время зацикливаюсь на том, как добиться этого в форме сценария. Любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ: Как полный новичок ie для всего этого, я просто пытался заставить вещи работать. В процессе я наткнулся на несколько других ответов на вопросы и собрал воедино этот код, который хотя бы немного очерчивает классы, хотя и не является идеальным решением

    function onEdit() {
var sheet = SpreadsheetApp.getActiveSheet();
   var range = sheet.getRange("C5:g30");
  var adress= range.getA1Notation();
  Logger.log("changed cell %s", adress);
  sheet.getRange('F2').setValue(adress);


  // Remove all borders
  var range = sheet.getRange("c5:g30");
  range.setBorder(true, true, true, true, true, true,"#D3D3D3",SpreadsheetApp.BorderStyle.SOLID);


//addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      Logger.log("changed cell %s", range.getCell(i,j).getA1Notation() );
      if(currentValue != "") {
        Logger.log("positive on %s", range.getCell(i,j).getA1Notation());
        range.getCell(i,j).setBorder(true, null, null, null, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }
    }
  }
}

1 Ответ

0 голосов
/ 05 марта 2020

Вопрос:

Как добавить границы в ячейки с несколькими условиями?

Из этого:

enter image description here

На это:

enter image description here

Ответ:

Протестируйте этот фрагмент и приспособьте его к своим потребностям:

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("C5:g29");
  var adress = range.getA1Notation();
  sheet.getRange('F2').setValue(adress);

  // Remove all borders
  var range = sheet.getRange("c5:g29");
  range.setBorder(true, true, true, true, true, true, "#D3D3D3", SpreadsheetApp.BorderStyle.SOLID);

  //addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var row = 1; row <= numRows; row++) {
    for (var column = 1; column <= numCols; column++) {

      var currentValue = range.getCell(row, column).getValue();
      // setBorder(top, left, bottom, right, vertical, horizontal, color, style)
      if ( (currentValue != "" && range.getCell(row+2, column).getValue() != "" ) || (currentValue != "" && range.getCell(row-2, column).getValue() != "" )) {
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      } else if (currentValue != ""){
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+2, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+3, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }

    }
  }
}

Ссылка:

  • setBorder - Устанавливает свойство границы с цветом и / или стилем. Допустимые значения: true (включено), false (выключено) и null (без изменений). Для цвета используйте Цвет в обозначении CSS (например, '#ffffff' или 'white').
...