2014-11-10 2 views
0

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

function MakeRed(){ 
    var book = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = book.getActiveSheet(); 
    var first_column = "B"; 
    var first_row = 1; 
    var last_row = sheet.getLastRow(); 
    var last_column = sheet.getLastColumn(); 
    var active_row = 1; 
    var range_input = sheet.getRange(1,1,last_row,last_column); 
    var range_output = sheet.getRange("A1"); 
    var cell_colors = range_input.getBackgroundColors(); 
    var color = "#ff0000"; 
    var count = 0; 

    for(var r = 0; r < cell_colors.length; r++) { 
    for(var c = 0; c < cell_colors[0].length; c++) { 
     if(cell_colors[r][c] == color) { 
     count++; 
     range_output.setBackground("#ff0000"); 
     } else { 
     count--; 
     if (count == 0) { 
      range_output.setBackground("#ffffff"); 
     } 
     } 
    } 
    } 
} 

ответ

1

Я хотел бы предложить вам сделать весь материал в массиве цветов фона у вас уже есть вместо того, чтобы Вызов сервиса электронной таблицы каждый раз, когда условие истинно.

код становится проще, потому что я использовал метод массива IndexOf в состоянии

function MakeRed(){ 
    var book = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = book.getActiveSheet(); 
    var first_column = "B"; 
    var first_row = 1; 
    var last_row = sheet.getLastRow(); 
    var last_column = sheet.getLastColumn(); 
    var active_row = 1; 
    var range_input = sheet.getRange(1,1,last_row,last_column); 
    var range_output = sheet.getRange("A1"); 
    var cell_colors = range_input.getBackgroundColors(); 
    var color = "#ff0000"; 
    var count = 0; 

    for(var r = 0; r < cell_colors.length; r++) { 
    Logger.log(cell_colors[r].indexOf(color));// just to check, you can remove this of course ... 
    if(cell_colors[r].indexOf(color)>-1) { 
     count++; 
     cell_colors[r][0]=color; 
    } else { 
     count--; 
     if (count == 0) { 
     cell_colors[r][0]="#ffffff"; 
     } 
    } 
    } 
    range_input.setBackgroundColors(cell_colors);// update sheet colors 
} 

EDIT: Я не очень понимаю, идея позади «счета» вещь ... это работает так же, как и без него (код ниже):

function MakeRed(){ 
    var book = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = book.getActiveSheet(); 
    var first_column = "B"; 
    var first_row = 1; 
    var last_row = sheet.getLastRow(); 
    var last_column = sheet.getLastColumn(); 
    var active_row = 1; 
    var range_input = sheet.getRange(1,1,last_row,last_column); 
    var range_output = sheet.getRange("A1"); 
    var cell_colors = range_input.getBackgroundColors(); 
    var color = "#ff0000"; 

    for(var r = 0; r < cell_colors.length; r++) { 
    Logger.log(cell_colors[r].indexOf(color)) 
    if(cell_colors[r].indexOf(color)>-1) { 
     cell_colors[r][0]=color; 
    } else { 
     cell_colors[r][0]="#ffffff"; 
    } 
    } 
    range_input.setBackgroundColors(cell_colors);// update sheet colors 
} 

редактировать 2: эта версия сбросит Col A до Wh Ite, если нет других красных клеток не находятся в ряде

function MakeRed(){ 
    var book = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = book.getActiveSheet(); 
    var first_column = "B"; 
    var first_row = 1; 
    var last_row = sheet.getLastRow(); 
    var last_column = sheet.getLastColumn(); 
    var active_row = 1; 
    var range_input = sheet.getRange(1,1,last_row,last_column); 
    var range_output = sheet.getRange("A1"); 
    var cell_colors = range_input.getBackgroundColors(); 
    var color = "#ff0000"; 

    for(var r = 0; r < cell_colors.length; r++) { 
    var rowWoColA = cell_colors[r].slice(1); 
    if(rowWoColA.indexOf(color)>-1) { 
     cell_colors[r][0]=color; 
    } else { 
     cell_colors[r][0]="#ffffff"; 
    } 
    } 
    range_input.setBackgroundColors(cell_colors);// update sheet colors 
} 
+0

Спасибо, граф был старый кодом от первого лица, пытавшегося сделать это, он просто инкремент счетчика (код он нашел в Интернете). Это хорошо работает, только часть, которая не работает, - это если фон меняется с красного, первый столбец должен очищаться, но нет? –

+0

Вы не упомянули об этом, не так ли? если вы хотите, я могу обновить ... –

+0

код обновлен, теперь я проверяю цвета во всех ячейках, кроме ячеек в столбце A, поэтому он работает как ожидается (надеюсь ;-) –

0

Изменить var range_output = sheet.getRange("A1"); в интересующий вас диапазон.

Вы можете сделать это в цикле:

for(var r = 0; r < cell_colors.length; r++) { 
    for(var c = 0; c < cell_colors[0].length; c++) { 
     if(cell_colors[r][c] == color) { 
     count++; 
     // Assuming you only want to change bg color of the first column on each row 
     sheet.getRange(r,1).setBackground("#ff0000"); 
     } else { 
     count--; 
     if (count == 0) { 
      sheet.getRange(r,1).setBackground("#ffffff"); 
     } 
     } 
    } 
    } 
Смежные вопросы