Условные границы в Google Sheets - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь сделать именно то, что Добавляет формат границы в строку, если запрашивается условие, выполненное в Google Sheets , но принятый ответ просто не работает. Оригинальный пост был очень понятным, так что вот еще раз:

Excel, по-видимому, имеет этот тип условного форматирования встроенный .

Я бы хотел сделать то же самое в Google Sheets через Google Apps Сценарий . Следующее должно продемонстрировать до и после Условия:

Пример набора данных

        A           B           C
  1   apple     Macintosh
  2   apple     Granny Smith
  3   orange    Florida
  4   orange    Valencia
  5   pear      Garden
  6   banana    Chiquita

Результирующий пример набора данных

        A           B           C
  1   apple     Macintosh
  2   apple     Granny Smith
  -----------------------------------
  3   orange    Florida
  4   orange    Valencia
  -----------------------------------
  5   pear      Garden
  -----------------------------------
  6   banana    Chiquita
  -----------------------------------  

Сценарий / ответ на этот вопрос должен отображать нижнюю границу под всей строкой (из столбцов «A», «B» и «C») для строк: 2, 4, 5 и 6.

Принятый ответ на этот оригинальный пост содержит следующий сценарий:

function onOpen() {
   GroupMyData(); // trigger this function on sheet opening
}

function GroupMyData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet 1'); // apply to sheet name only
  var rows = sheet.getRange('a1:g'); // range to apply formatting to
  var numRows = rows.getNumRows(); // no. of rows in the range named above
  var values = rows.getValues(); // array of values in the range named above
  var testvalues = sheet.getRange('a1:a').getValues(); // array of values to be tested (1st column of the range named above)

  rows.setBorder(false, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // remove existing borders before applying rule below
      //Logger.log(numRows);

  for (var i = 0; i <= numRows - 1; i++) {
      var n = i + 1;
      //Logger.log(n);
      //Logger.log(testvalues[i] > 0);
      //Logger.log(testvalues[i]);
      if (testvalues[i] > 0) { // test applied to array of values
        sheet.getRange('a' + n + ':g' + n).setBorder(null, null, true, null, null, null, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
      }
  }
};

Этот скрипт работает так: Внизу каждой строки появится рамка, где в ячейке столбца А есть номер (и нет букв), независимо от того, совпадает ли номер с номером в ячейке над ним или отличается.

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

1 Ответ

0 голосов
/ 13 ноября 2018

Спрашивающий ссылается на предыдущие вопросы и ответы, которые были основаны на оценке числа. В случае спрашивающих оценка основана на строке.

Я сослался на вопрос, отмеченный Ответчиком. Я также сослался на Как сравнить строки в скрипте приложений Google , который содержит очень элегантный и эффективный подход Гарольда , который я провел в этом ответе. При этом используется indexof для обнаружения новых значений, поэтому подчеркивание может быть связано с каждым новым значением.

function so53053492() {

    //setup spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet1");

    // get key variables
    var LastRow = sheet.getLastRow();
    var LastColumn = sheet.getLastColumn();

    //erase any current formatting 
    var ClearRange = sheet.getRange(1, 1, LastRow, LastColumn).setBorder(false, false, false, false, false, false); // clear all formatting

    // get the data
    var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();

    // setup new array  
    var ListofFruits = new Array();

    // Loop through the fruits (Column A)
    for (var i in data) {
        var row = data[i][0].toString();


        // search for unqiue values
        if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique

            // Logger.log(row+" is not referenced. Adding it");//DEBUG
            // underline the previous row
            var range = sheet.getRange((+i + 1), 1, 1, 2).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true

            // continue to build array
            ListofFruits.push(row);
        }

    }
    // underline the last row of the fruits column
    var range = sheet.getRange(LastRow, 1, 1, LastColumn).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
    // Logger.log(ListofFruits);// DEBUG
}

BeforeAfter


ОБНОВЛЕНИЕ - Учет заголовков


Предыдущая версия не предполагала заголовков. Эта версия учитывает заголовки. Имеется несколько строк кода, но ключевой переменной является headerRows, которая позволяет пользователю назначать глубину заголовков.

function so53053492_01() {

    //setup spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet3");

    // get key variables
    var LastRow = sheet.getLastRow();
    var LastColumn = sheet.getLastColumn();
    var NumColumns = sheet.getMaxColumns();

    // allow for headers
    var headerRows = 2;

    //erase any current formatting 
    var ClearRange = sheet.getRange(1, 1, LastRow, NumColumns).setBorder(false, false, false, false, false, false); // clear all formatting

    // get the data
    var data = sheet.getRange((+1 + headerRows), 1, (LastRow - headerRows), LastColumn).getValues();

    // setup new array  
    var ListofFruits = new Array();

    // Loop through the fruits (Column A)
    for (var i in data) {

        var row = data[i][0].toString();
        // Logger.log("Inside LOOP: i = "+i+", value = "+ row);// DEBUG

        // search for unqiue values
        if (ListofFruits.indexOf(row) == -1) { // if value =-1, then the variable is unique

            // Logger.log("Inside IF#1: i = "+i+", "+row+" is not referenced. Adding it");//DEBUG
            // underline the previous row

            if (i != 0) {
                // This IF statement to avoid underlining the Header row
                var range = sheet.getRange((+i + 1 + headerRows), 1, 1, NumColumns).setBorder(true, false, false, false, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
            }
            // continue to build array
            ListofFruits.push(row);
        }

    }
    // underline the last row of the fruits column
    var range = sheet.getRange(LastRow, 1, 1, NumColumns).setBorder(null, null, true, null, false, false, "red", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
    //Logger.log(ListofFruits);// DEBUG
}

Снимок экрана с заголовками:
Full width borders


...