Ссылка на ячейку с цветовым форматированием

16

Можно ли ссылаться на ячейку в Google Sheets так, чтобы ячейка, в которой она отображалась, отображала ее, используя тот же формат текста и цвета ячейки?

=A1

Будет ссылаться только на значение ячейки. Но если эта конкретная ячейка имеет красный фон и белый текст, я бы хотел, чтобы это тоже было скопировано.

Я склоняюсь к существующим решениям формул, а не к сценариям. Если применимо, конечно.

Роберт Коритник
источник
Этот сайт предназначен только для веб-приложений. Microsoft Excel не является частью этого. Кроме того, Excel использует VBA, а Google Spreadsheets использует Google Apps Script для таких решений. Пожалуйста, отредактируйте ваш вопрос или задайте его на SU.
Джейкоб Ян Туинстра
@JacobJanTuinstra: Я с нетерпением ждал какой-нибудь уже существующей формулы, которую мог бы использовать. А поскольку таблицы Google Spreadsheets охватывают множество формул, представленных в Excel, я также добавил их в качестве тега. Но в остальном я знаю, что это о веб-приложениях. В любом случае я видел несколько вопросов, помеченных с помощью Excel, отсюда и мой тег. Но спасибо. Не добавлю это в будущем.
Роберт Коритник
1
Роберт, между таблицами Google и Microsoft Excel есть много различий (2010). Смотрите ответ, который я дал: webapps.stackexchange.com/a/44719/29140
Джейкоб Ян Туинстра,
1
@JacobJanTuinstra: Так что многие из них ссылаются на эти 85%. Это доказывает, что он охватывает большинство формул Excel. :) И спасибо за размещение ссылки. Отличное понимание.
Роберт Коритник

Ответы:

8

Для таблиц Google это возможно, написав скрипт:

function copyValuesAndFormatting() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet();

    var fromRange = sheet.getRange("A2:A");
    var toRange = sheet.getRange("B2:B");
    var values = fromRange.getValues();
    var fontColors = fromRange.getFontColors();
    var backgrounds = fromRange.getBackgrounds();
    var fonts = fromRange.getFontFamilies();
    var fontWeights = fromRange.getFontWeights();
    var fontStyles = fromRange.getFontStyles();

    toRange.setBackgrounds(backgrounds);
    toRange.setFontColors(fontColors);
    toRange.setValues(values);
    toRange.setFontFamilies(fonts);
    toRange.setFontWeights(fontWeights);
    toRange.setFontStyles(fontStyles);
}

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

Я создал образец электронной таблицы здесь . Не стесняйтесь скопировать его в свой аккаунт и начать экспериментировать с ним.

Видар С. Рамдал
источник
Я не четко сформулировал это в своем вопросе, но я больше смотрел на существующие формулы, а не на сценарии. Если для этой работы не существует комбинации формул, то ваш сценарий был бы намного лучше, если бы он использовался в качестве формулы, называемой, т. fullCellRef(cellReference)=fullCellRef(A1)
Е. Можно было
Ах я вижу. Но я не думаю (поправьте меня, если я ошибаюсь), есть какая-то формула, которая определяет форматирование.
Видар С. Рамдал
Я бы поправил тебя, если бы я точно знал мой вопрос. :) Но в остальном. Я подозреваю, что нет в любом случае. Поэтому, если вы переписываете свой сценарий для использования в качестве формулы ячейки, я приму ваш ответ, потому что это будет наилучшим возможным решением для имеющихся функций.
Роберт Коритник
1
Хм, в настоящее время я не знаю, как функция формулы ячейки может ссылаться на ячейку, из которой она используется, что необходимо для настройки форматирования. Я сделаю некоторые исследования.
Видар С. Рамдал
Нет, извините, это кажется невозможным. Функция формулы не имеет доступа к настройке форматирования ячейки. Поэтому мне придется оставить вас с опцией триггера.
Видар С. Рамдал
5

Используя в качестве основы ответы Видара и Джейкоба, я создал следующее решение, которое позволит вам написать = fullCellRef (A1), который будет копировать значение и формат из A1.

Незначительный побочный эффект заключается в том, что при перетаскивании ячейки с этой формулой новые ячейки первоначально будут копировать форматирование исходной ячейки (как обычно), но затем переключатся на ссылочное форматирование после небольшой паузы.

Образец листа здесь .

/**
 * Dummy function to be the equivalent of using simple reference,
 * but is used to identify which cells to copy format.
 * The immediate effect of =fullCellRef(A1) is the same as =A1
 * 
 * @param  {string} value The value of the referred cell
 * @return {string}       The given value
 */
function fullCellRef(value){
  return value;
}

/**
 * For each cell with the formula eg B2=fullCellRef(A1), the format of
 * the referred cell (eg A1) is copied to the calling cell (eg B2)
 */
function copyFormatting() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var offsetRow = range.getRow() - 1;
  var offsetCol = range.getColumn() - 1;

  var formulas = range.getFormulas();

  var formats = {
    fontColors: range.getFontColors(),
    backgrounds: range.getBackgrounds(),
    fonts: range.getFontFamilies(),
    fontWeights: range.getFontWeights(),
    fontStyles: range.getFontStyles(),
    verticalAlignments: range.getVerticalAlignments(),
    horizontalAlignments: range.getHorizontalAlignments(),
    numberFormats: range.getNumberFormats()
  };
  var formulaIsUsed = false;
  for (var row = 0; row < formulas.length; row ++ ) {
    for (var column = 0; column < formulas[row].length; column ++ ) {
      var refersTo = findReferenceCells(formulas[row][column]);
      if (refersTo){
        formulaIsUsed = true;
        var refRow = refersTo.row - offsetRow;
        var refCol = refersTo.column - offsetCol;
        for (var key in formats) {
          formats[key][row][column] = formats[key][refRow][refCol];
        }
      }
    }
  }

  if (formulaIsUsed) {
    range.setBackgrounds(formats.backgrounds);
    range.setFontColors(formats.fontColors);
    range.setFontFamilies(formats.fonts);
    range.setFontWeights(formats.fontWeights);
    range.setFontStyles(formats.fontStyles); 
    range.setVerticalAlignments(formats.verticalAlignments);
    range.setHorizontalAlignments(formats.horizontalAlignments);
    range.setNumberFormats(formats.numberFormats);
  }

}

/**
 * Returns the 2D array indices to identify the referred cell.
 * @param  {string} formula The cell formula
 * @return {Array.integer}         The row and column array indices
 */
function findReferenceCells(formula) {
  if (formula === "") {
    return false;
  }
  var refPattern = /^=fullcellref\(([a-z]{1,2})(\d+)\)$/i;
  var matches = refPattern.exec(formula.replace(" ", ""));
  matches.shift();
  if (!matches) {
    return false;
  }
  // convert cell reference to array indices
  var column = colToInteger(matches[0]) - 1;
  var row = matches[1] - 1;

  return {row: row, column: column};
}

/**
 * Converts a column name to a column number
 * @param  {string} columnName eg "A", "BB"
 * @return {integer}            Between 1 and 256
 */
function colToInteger(columnName){
  var nameParts = columnName.toLowerCase().split();
  //97 is char code of "a", but we need 1 based indices
  var colNum = nameParts.pop().charCodeAt(0) - 96;
  if (nameParts.length === 1){
    colNum += 26 * (nameParts.pop().charCodeAt(0) - 96);
  }
  return colNum;
}
Том Хорвуд
источник
В строке 52 и 53 есть ошибка для сценария Тома. Может ли кто-нибудь помочь выполнить это правильно.
@SwapnilGosavi - я только что обновил код, добавив дополнительные форматы, и, похоже, он работает правильно. Дайте мне знать, если у вас все еще есть проблемы
Том Хорвуд
Это довольно круто. Однако, когда я читаю исходный код, это не сработает на разных вкладках, верно?
Джейд
@ Джейд - Нет - это не будет работать через вкладки. Возможно, это можно сделать, хотя я на самом деле не смотрел на это.
Том Хорвуд
3

Это самое близкое, что вы можете получить, имея чувство формулы.

Код

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var aCell = sh.getActiveCell(), value = aCell.getValue();

  // get formatting
  var fontColor = aCell.getFontColor();
  var background = aCell.getBackground();
  var font = aCell .getFontFamily();
  var fontWeight = aCell.getFontWeight();
  var fontStyle = aCell.getFontStyle();
  var target = Browser.inputBox('Give column number, relative to active cell', 
    Browser.Buttons.OK);
  var tCell = aCell.offset(0,parseInt(target));

  // set formatting
  tCell.setBackground(background).setFontColor(fontColor).setFontFamily(font)
    .setFontWeight(fontWeight).setFontStyle(fontStyle).setValue(value);
}

Разъяснения

После редактирования появляется окно сообщения с запросом ввода значения (также допускается минус). Затем применяется форматирование (включая значение), как замечательно уже представлено Видаром.

пример

Скопировал файл Видара: форматирование ячеек

Джейкоб Ян Туинстра
источник
Здорово! Возможно, вы могли бы зарегистрировать свой триггер как «при модификации», а не «при редактировании». Таким образом, изменения только формата будут распространяться также.
Видар С. Рамдал