2013-07-09 2 views
3

Как изменить цвет фона ячейки на основе содержимого ячейки в функции onEdit()?Изменить цвет фона ячейки onEdit на основе значения

У меня было много версий кода, которые я тестировал для этого - некоторые работают почти правильно, некоторые не работают вообще. Но мне еще нужно, чтобы это работало так, как мне нужно.

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

Ok, так что здесь идет ...

function onEdit(event) 
{ 
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
var changedCell= event.source.getActiveRange().getA1Notation(); 

if (changedCell == 'B3') { 
var c = ss.getRange("B3").getValue(); 
    if (c < 2); { 
    ss.getRange("B3").setBackgroundColor('#ff0000'); 
    ss.getRange("B12").setBackgroundColor('#ff0000'); 
    } 
    if (c > 1); { 
    ss.getRange("B3").setBackgroundColor('#000000'); 
    ss.getRange("B12").setBackgroundColor('#000000'); 
    } 
} 
} 

ответ

6

несколько вещей, чтобы отметить

1. Имя метода является setBackground и не setBackgroundColor

2.How является клетка B3 отформатирован. Сравнение работает только в том случае, если оно форматируется как целое число. В большинстве случаев Google Spreadsheet автоматически форматирует ячейки на основе типа данных, но если я пишу код, я бы дважды проверял. Поэтому использовать что-то вроде

var c = parseInt(ss.getRange("B3").getValue()) ; 

3. точка с запятой не требуется после того, как условия if. Это немедленно прекратит условие if. Так что используйте

if (c < 2) { 

и

if (c > 1) { 

4.Finally, я не знаю, как данные поступают в В3, но если у вас есть 1,5 дюйма B3, то оба if условия становятся истинными и ваш фон цвет перезаписывается. Итак, я предлагаю вам использовать if..elseif

Для лучшей читаемости я бы использовал setBackground('red') и setBackground('white') для общих цветов.

+1

Re 1 - хотя это уже не в документации или автозаполнения, 'setBackgroundColor' все еще не работает. – Mogsdad

+0

Ничего себе. Спасибо, что поставили меня прямо на использование точек с запятой. Думаю, я мог бы добавить их только для того, чтобы понять, поможет ли это, но я признаю, что я не совсем понимаю их цель, поэтому я хватался. Кстати, я только недавно понял, что поиск решений GAS, как правило, очень мало напоминает полезную информацию. Примером может служить «parseInt». Поиск Google «скрипт Google Apps и parseInt» не возвратил ничего полезного, кроме 1 (!) Ссылки на ссылку w3schools на javascript. Очевидно, мне нужно тратить больше времени на поиск ресурсов javascript. Спасибо, Шрик! – 5th4x4

+0

@Mogsdad - Я нашел «setBackgroundColor» где-то, и это действительно сработало для меня. Но я понятия не имел, что сейчас это не в моде в ГАЗ. Кстати, я получил электронное письмо от googlecode в отношении проблемы проверки: «проверка данных по-прежнему является открытым запросом функции, который мы находимся в процессе реализации. Методы были случайно обнародованы, пока работа над этой функцией все еще продолжалась. Поэтому, мы рекомендуем не кодировать этот предварительно выпущенный API, так как это возможно, его можно изменить ». Теперь вы это видите, теперь вы этого не делаете ... Наверное. – 5th4x4

3

В дополнение к совету от Srik, вы должны учитывать эффективность вашей функции onEdit(). Общая идея заключается в том, чтобы определить, следует ли вам выручить как можно скорее и как можно дешевле, а затем оптимизировать оставшуюся часть кода в соответствии с Best Practices (главным образом, сворачивайте служебные вызовы).

Похоже, что вы хотите onEdit() выполнять только на «Лист2», но так, как вы написали его, она будет срабатывать при изменении на любого листа, но возиться с цветами на «Лист2». (Неважная проблема, так как условия на «Sheet2» - это те, которые используются для определения раскраски, но вы будете без проблем запускать время выполнения скрипта.) Используя информацию event, чтобы выяснить, какой лист был обновлен, и выход, если это не «Лист2», стоимость onEdit() падает.

Я согласен с Шриком в отношении заявлений if ... Я просто не могу сказать, что вы хотели. Я не думаю, что предложение else if само по себе решит его, потому что оно будет обрабатывать c > 1 как c > 2 ... если вы этого хотели, почему бы не написать его? Возможно, вам не нужен цвет для 1 < c < 2, с красным для c < 1 и черный для c > 2?Вы должны разобраться в логике в этой части.

Вот как оптимизированный onEdit() будет выглядеть, делая максимальное использование информации event:

function onEdit(event) 
{ 
    var ss = event.range.getSheet(); 
    if (ss.getName() !== "Sheet2") return; // Get out quickly 
    var changedCell = event.source.getActiveRange(); 
    var changedCellA1 = changedCell.getA1Notation(); 
    if (changedCellA1 !== 'B3') return; 

    var c = event.value; // We know we edited cell B3, just get the value 
    var background = 'white'; // Assume 1 <= c <= 2 
    if (c > 2) { 
    background = 'red'; 
    } 
    else if (c < 1) { 
    background = 'black'; 
    } 
    changedCell.setBackground(background); 
    ss.getRange("B12").setBackground(background); 
} 
+0

Должен признать, что я где-то скрепил OnEdit. И, как обычно, я не находил основную урезанную информацию; Мне на самом деле пришлось разбирать его из сложного процесса, который был намного выше моего понимания. Я знаю, что вам нравится рекламировать документацию разработчиков Google, но я нахожу ее в значительной степени разочаровывающей и желающей. Мне просто не кажется, что он хорошо учится на этом ресурсе, что является полярной противоположностью ресурсов vba, которые, как мне кажется, довольно легко находят. К счастью, я многому учусь здесь ... хотя обычно я не прошу, пока я уже не сгорел, преследуя бесконечные тупики. В любом случае, спасибо! – 5th4x4

Смежные вопросы