it-swarm.com.de

Zellreferenz mit Farbformatierung

Ist es möglich, auf eine Zelle in Google Sheets zu verweisen, sodass diese Zelle, in der sie angezeigt wird, auch dieselbe Text- und Zellfarbenformatierung verwendet?

=A1

Wird nur den Wert der Zelle referenzieren. Aber wenn diese bestimmte Zelle einen roten Hintergrund und weißen Text hat, möchte ich, dass dieser ebenfalls kopiert wird.

Ich neige eher zu vorhandenen Formellösungen als zu Skripten. Gegebenenfalls natürlich.

14
Robert Koritnik

Für Google Spreadsheets ist es möglich, ein Skript zu schreiben:

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

Fügen Sie einen Auslöser hinz für die Skriptfunktion, damit diese bei jeder Änderung der Tabelle ausgeführt wird.

Ich habe eine Beispieltabelle erstellt hier . Fühlen Sie sich frei, es auf Ihr eigenes Konto zu kopieren und damit zu experimentieren.

8
Vidar S. Ramdal

Auf der Grundlage der Antworten von Vidar und Jacob habe ich die folgende Lösung erstellt, mit der Sie = fullCellRef (A1) schreiben können, mit der der Wert und das Format von A1 kopiert werden.

Ein geringfügiger Nebeneffekt ist, dass beim Ziehen und Kopieren einer Zelle mit dieser Formel die neuen Zellen zunächst die Formatierung der ursprünglichen Zelle kopieren (wie üblich), nach einer kurzen Pause jedoch zur angegebenen Formatierung wechseln.

Beispielblatt hier .

/**
 * 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;
}
5
Tom Horwood

Dies ist das Beste, was Sie erreichen können, wenn Sie ein Formelgefühl haben.

Code

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

Erklärt

Beim Bearbeiten wird ein Meldungsfeld angezeigt, in dem Sie nach einem Eingabewert gefragt werden (Minus ist ebenfalls zulässig). Dann wird die Formatierung (Wert eingeschlossen) angewendet, wie Vidar bereits wunderbar dargestellt hat.

Beispiel

Kopierte Vidar-Datei: Zellenformatierung

3