Посилання на клітинку з кольоровим форматуванням


16

Чи можна посилатися на клітинку в Google Таблицях, щоб комірка, де вона відображається, відображала її за допомогою того самого форматування тексту та кольору комірки?

=A1

Буде лише опорне значення комірки. Але якщо ця конкретна клітина має червоний фон і білий текст, я б хотів, щоб це було скопійовано.

Я схиляюся до існуючих формульних рішень, а не до сценаріїв. Якщо застосовується, звичайно.


Цей веб-сайт призначений лише для веб-додатків. Microsoft Excel не є частиною цього. Крім того, Excel використовує VBA, а електронні таблиці Google використовує сценарій Google Apps для таких рішень. Будь ласка, відредагуйте своє запитання або поставте його на SU.
Яків Ян Туінстра

@JacobJanTuinstra: Я з нетерпінням чекав на якусь вже наявну формулу, яку я міг би використати. А оскільки Google Spreadsheets охоплює безліч формул, присутніх в Excel, я додав її також як тег. Але в іншому випадку я знаю, що це стосується веб-додатків. Я завжди бачив кілька питань, позначених темою Excel, звідси мій тег. Але спасибі Не додаватимуть його в майбутньому
Роберт Коритник

1
Роберто, існує багато розбіжностей між електронними таблицями Google і Microsoft Excel (2010). Дивіться відповідь, яку я дав: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra

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 - Я щойно оновив код, щоб включити додаткові формати, і він, здається, працює правильно. Повідомте мене, якщо у вас все ще є проблеми
Том Хорвуд,

Це досить приголомшливо. Однак, коли я читав вихідний код, це не працюватиме на вкладках, правильно?
Нефрит

@Jade - Ні - це не працюватиме на вкладках. Можливо, це можна було б зробити так, хоча я насправді цього не заглядав.
Том Хорвуд

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);
}

Пояснив

Після редагування з'являється вікно з повідомленням і запитує значення введення (мінус також дозволено). Тоді застосовується форматування (включене значення), як це чудово представлено у Відара.

Приклад

Скопійовано файл Видара: Форматування комірок


Класно! Можливо, ви можете зареєструвати тригер як "при зміні", а не "редагувати". Таким чином, також поширюватимуться лише зміни формату.
Відар С. Рамдал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.