2013-06-14 4 views
0

Я пытаюсь адаптировать пример сценария от this предыдущий, родственный вопрос. Для строк, где значение ячейки в столбце K равно нулю, я хочу сделать строку желтой.Формат строки цвета на основе значения ячейки

Вот мой текущий адаптированный код:

function colorAll() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var startRow = 3; 
    var endRow = sheet.getLastRow(); 

    for (var r = startRow; r <= endRow; r++) { 
    colorRow(r); 
    } 
} 

function colorRow(r){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var c = sheet.getLastColumn(); 
    var dataRange = sheet.getRange(r, 1, 1, c); 

    var data = dataRange.getValue(); 
    var row = data[0]; 

    if(row[0] === "0"){ 
    dataRange.setBackground("white"); 
    }else{ 
    dataRange.setBackground("yellow"); 
    } 

    SpreadsheetApp.flush(); 
} 

function onEdit(event) 
{ 
    var r = event.source.getActiveRange().getRowIndex(); 
    if (r >= 3) { 
    colorRow(r); 
    } 
} 

function onOpen(){ 
    colorAll(); 
} 

Моя проблема, я не могу понять, как ссылаться на столбец К. В связанном ответ выше, претензии создателя сценария, "[ч] Пример сценария Google Apps Script для изменения цвета фона всей строки на основе значения в столбце A. «Во-первых, и самое главное, я не могу понять, где он ссылается на столбец А. Я думал, что нужно изменить« var dataRange » = sheet.getRange (r, 1, 1, c); to "var dataRange = sheet.getRange (r, , 1, c);" сделало бы это, но это только добавило 10 пустых столбцов в конец моего листа, а затем скрипт разбился. Я не понимаю, почему.

Во-вторых, однако, его утверждение о том, что сценарий затрагивает целые строки, является неточным, поскольку его исходный «var dataRange = sheet.getRange (r, 1, 1, 3);» только цветные первые три столбца - вот почему я добавил «var c» и изменил «3» на «c».

Кроме того, когда я играю/отлаживать сценарий, или запустить «onEdit» от менеджера таблицы сценария, я получаю «TypeError: Не удается прочитать свойство„источник“из неопределенного.» Я вижу, что «источник» не определен - я ошибочно предположил, что это был метод сначала, но я не уверен, как исправить эту проблему.

И, наконец, столбец K не всегда будет ссылочным столбцом, поскольку я хочу добавить больше столбцов слева от него. Я предполагаю, что мне придется обновлять скрипт каждый раз, когда я добавляю столбцы, но заголовок столбца в строке 2 не изменится, поэтому, если кто-то может помочь мне разработать немного кода, который будет искать определенную строку в строке 2, то получите эту ссылку столбца для использования в функции colorRow(), я был бы признателен.

Я не могу определить, действительно ли этот сценарий структурирован, но в идеале я хочу, чтобы моя таблица была реактивной - я не хочу повторять этот сценарий после редактирования управляющей ячейки или при ее открытии; он читается так, как будто он должен это делать (если он не глючит), но это моя первая попытка использовать скрипт Google Apps, и я ничего не чувствую.

Я не очень разбираюсь в написании сценариев, но в 2006 году я изучил основы программирования/класс Python в школе градиента и провел 4 года работы с Excel & Доступ вскоре после этого, часто создавая и адаптируя макросы. Я не могу создать дизайн с нуля, но я понимаю основные принципы и концепции, даже если я не могу перевести все (например, я не понимаю, что означает «++» в третьем аргументе в «for», заявление я использую: «для (вара г = StartRow; г < = EndRow; г ++).» Я думаю, что я иносказательно эквивалентен грамотный испанского языка пытается читать итальянские

Помощь и познавательны. объяснения/примеры, будем очень благодарны.Спасибо за чтение/skimming/пропущенное к этому предложению.

ответ

0

1.The onEdit - это специальная функция, которая автоматически вызывается при редактировании электронной таблицы. Если вы запустите ее вручную, требуемые аргументы не будут доступный для него.

2.Чтобы изменить цвет всей строки, когда столбец K равен 0, вы должны внести простые изменения в скрипт.Ниже

function colorRow(r){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var c = sheet.getLastColumn(); 
    var dataRange = sheet.getRange(r, 1, 1, c); 

    var data = dataRange.getValues(); 

    if(data[0][10].toString() == "0"){ //Important because based on the formatting in the spreadsheet, this can be a String or an integer 
    dataRange.setBackground("white"); 
    }else{ 
    dataRange.setBackground("yellow"); 
    } 

    SpreadsheetApp.flush(); 
} 
+0

Это почти сработало. Правильные строки меняются на желтый, но только из столбца K, а скрипт все еще создает дополнительные 10 столбцов в правом конце листа. Спасибо за улучшения, надеюсь, я скоро смогу это решить ... У меня есть некоторые идеи/догадки о том, почему это происходит. Но, может быть, вы точно знаете? – Thucydides16

+0

См. Отредактированный код. Он окрашивает всю строку. Вам просто нужно изменить выбранный вами диапазон. – Srik

+0

Я вижу, что вы редактировали, и я подумал, что изменения будут исправлены, но я получаю эту ошибку: «TypeError: Невозможно вызывать метод« toString »неопределенного.» Нужно ли нам определять другой var для установки данных [0] [11], а затем поставить var перед .toString()? Хм ... Я очень ценю всю вашу помощь. – Thucydides16

2

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

My problem is, I can't figure out how to reference column K.

Колонка A = 1, B = 2, ... K = 10.

I can't figure out where he's referencing column A. 

Вы были близки, когда вы изменили .getRange. .getRange выполняет разные действия в зависимости от количества аргументов в(). С 4 аргументами это getRange (строка, столбец, numRows, numColumns).

sheet.getRange(r, 1, 1, c) // the first '1' references column A 

начинается с строки (r), которая изначально является строкой (3) и столбцом (1). Итак, это ячейка (A3). Диапазон расширяется для столбцов 1 строки и (в). Поскольку c = sheet.getLastColumn(), это означает, что вы приняли диапазон в 1 строку и все столбцы.

Когда вы изменили это

var dataRange = sheet.getRange(r, 11, 1, c) // the '11' references column L 

У вас есть диапазон, начиная с ряда (3) колонка (L), как 11 = L. Это бежит к строке (3) столбец (getLastColumn()). Это будет делать странные вещи, если вы вышли за пределы диапазона. Вы можете подтолкнули его к бесконечному циклу, который может вызвать сценарий к сбою

Secondly, but more as an aside, his claim that the script affects entire rows is inaccurate, as his original "var dataRange = sheet.getRange(r, 1, 1, 3);" only colored the first three columns - which is why I added "var c" and changed "3" to "c".

Вы правильно. В (3) говорится, что диапазон простирается на 3 столбца.

"TypeError: Cannot read property "source" from undefined." 

То, что здесь происходит, не является интуитивно понятным. Вы не можете запустить функцию onEdit (событие) из диспетчера сценариев электронной таблицы, потому что она ожидает «событие».

  • onEdit - специальный триггер google, который запускается всякий раз, когда редактирует таблицу.
  • передано (событие), которое активировало его, и
  • event.source. относится к листу, где произошло событие
  • var r = event.source.getActiveRange(). getRowIndex(); получает номер строки, где произошло редактирование, которое является строкой, которая изменит цвет.

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

Lastly, column K will not always be the reference column, as I mean to add more columns to the left of it. I assume I'll have to update the script every time I add columns, but there is a column heading in row 2 that will never change, so if someone can help me devise a bit of code that will look for a specific string in row 2, then get that column reference for use in function colorRow(), I would appreciate it.

Перед тем, как дать вам ее код помощи, у меня есть альтернативное предложение, потому что вы также говорить об эффективности и часто быстрее запускать функции в таблице, чем с помощью сценариев. Вы можете попробовать иметь столбец A в качестве столбцов индекса, где ColumnA (Row #) = ColumnK (Row #). Если поместить следующее в ячейку (A1), Columna будет точным соответствием колонке К.

=ArrayFormula(K:K) 

Еще лучше, если добавить/удалить столбцы между А и К, то формула будет менять свою ссылку без вас делать что-либо.Теперь просто скройте столбец А, и ваш лист вернется к внешнему виду оригинатора.

Вот ваша помощь по коду, используя свой собственный код.

function findSearchColumn() { 
    var colNo; // This is what we are looking for. 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var c = sheet.getLastColumn(); 

    // gets the values form the 2nd row in array format 
    var values = sheet.getRange(2, 1, 1, c).getValues(); 
    // Returns a two-dimensional array of values, indexed by row, then by column. 

    // we are going to search through values[0][col] as there is only one row 
    for (var col = 0; col < data[0].length; col++) { // data[0].length should = c 
    if (data[0][col] == value) { 
     colNo = col; 
     break; // we don't need to do any more here. 
    } 
    } 
    return(colNo); 
} 

Если перерыв дает вам проблемы просто удалите его и пусть внешний вид полностью или заменить его цв = данные [0] .length;

I can't tell if this script is structured efficiently, but ideally, I want my spreadsheet to be reactive - I don't want to have to rerun this script after editing a driving cell, or upon opening; it reads like it's supposed to do that (were it not buggy), but this is my first attempt at using Google Apps Script, and I don't feel certain of anything.

Это нормально, тонкая настройка эффективности зависит от таблицы. function onEdit (событие) будет запускаться каждый раз, когда отредактирован лист, вы ничего не можете с этим поделать. Однако первое, что он должен сделать, это проверить, отредактирован ли соответствующий диапазон. Линия if (r> = 3), похоже, делает это. Вы можете сделать это как можно более конкретным. Мое предложение о скрытой колонке индексов было нацелено на эффективность, а также на то, чтобы было намного проще реализовать.

I'm not great with scripting,

Вы делаете хорошо, но могли бы сделать некоторые фоне чтения, просто посмотреть вещи, как для петель. Несчастливый Python грамматически отличается от многих других языков. Цикл for в скрипте Google аналогичен VBA, C, JAVA и многим другим. Поэтому чтение об этих основных операциях на самом деле учит вас многим языкам.

I don't understand what the "++" means in the third argument in the "for" statement Именно поэтому язык C++ получил свое название, как шутка программиста.

г ++ является такой же, как говорят г = г + 1

r-- означает, г = г-1

г + 2 означает, что R = R + 2

So

for (var r = startRow; r <= endRow; r++) 
  • означает, г начинается как StartRow, который в данном случае является 3.
  • цикл будет работать ип til r < = endRow, который в этом случае является sheet.getLastRow()
  • после каждого цикла цикла r увеличивается на 1, поэтому, если endRow == 10, цикл будет работать от r = 3 до r = 10 = > 8 раз
Смежные вопросы