Zellreferenz mit Farbformatierung

16

Ist es möglich, auf eine Zelle in Google Sheets zu verweisen, sodass die 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 roten Hintergrund und weißen Text hat, möchte ich, dass auch dieser kopiert wird.

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

Robert Koritnik
quelle
Diese Website ist nur für Webanwendungen bestimmt. Microsoft Excel ist nicht Teil davon. Darüber hinaus verwendet Excel VBA und Google Spreadsheets verwendet Google Apps Script für diese Art von Lösungen. Bitte bearbeiten Sie Ihre Frage oder stellen Sie sie auf SU.
Jacob Jan Tuinstra
@JacobJanTuinstra: Ich freute mich auf einige bereits vorhandene Formeln, die ich verwenden konnte. Und da Google Spreadsheets viele, viele in Excel vorhandene Formeln abdeckt, habe ich es auch als Tag hinzugefügt. Aber ansonsten weiß ich, dass es um Web-Apps geht. Ich habe sowieso mehrere mit Excel getaggte Fragen gesehen, daher mein Tag. Aber danke. Wird in Zukunft nicht mehr hinzugefügt.
Robert Koritnik
1
Robert, es gibt viele, viele Unterschiede zwischen Google Spreadsheets und Microsoft Excel (2010). Siehe Antwort, die ich gegeben habe: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra
1
@JacobJanTuinstra: Also meine vielen vielen beziehen sich auf diese 85%. Dies beweist, dass es die meisten Excel-Formeln abdeckt. :) Und danke für den Link. Großartige Einsicht.
Robert Koritnik

Antworten:

8

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 für die Skriptfunktion hinzu, 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.

Vidar S. Ramdal
quelle
Ich habe es in meiner Frage nicht klar formuliert, aber ich habe mich mehr mit vorhandenen Formeln beschäftigt und nicht mit Skripten. Wenn es keine Formel Kombination ist diese Arbeit zu machen, dann würde das Skript viel besser, wenn es verwendet wurde , als eine Formel dh genannt , fullCellRef(cellReference)so man es als verwenden könnte =fullCellRef(A1)zum Beispiel
Robert Koritnik
Ah ich sehe. Aber ich glaube nicht, dass es eine Formel gibt, die die Formatierung spezifiziert (korrigiere mich, wenn ich mich irre) .
Vidar S. Ramdal
Ich würde dich korrigieren, wenn ich meine Frage definitiv wüsste. :) Aber sonst. Ich vermute, es gibt sowieso keine. Wenn Sie also Ihr Skript neu schreiben, um es als Zellenformel zu verwenden, nehme ich Ihre Antwort an, da dies die bestmögliche Lösung für die vorliegenden Funktionen wäre.
Robert Koritnik
1
Hmm, ich weiß derzeit nicht, wie eine Zellformelfunktion auf die Zelle verweisen kann, aus der sie verwendet wird. Dies ist erforderlich, um die Formatierung festzulegen. Ich werde etwas recherchieren.
Vidar S. Ramdal
Nein, sorry, das scheint unmöglich. Eine Formelfunktion hat keinen Zugriff auf das Festlegen der Zellenformatierung. Also muss ich Sie mit der Trigger-Option verlassen.
Vidar S. Ramdal
5

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.

Musterblatt 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;
}
Tom Horwood
quelle
In Zeile 52 und 53 ist ein Fehler für Toms Skript aufgetreten. Kann jemand helfen, es richtig auszuführen.
@ SwapnilGosavi - Ich habe gerade den Code aktualisiert, um zusätzliche Formate einzuschließen, und es scheint richtig zu laufen. Lassen Sie mich wissen, wenn Sie noch Probleme haben
Tom Horwood
Das ist ziemlich genial. Beim Lesen des Quellcodes würde dies jedoch nicht über mehrere Registerkarten hinweg funktionieren, richtig?
Jade
@Jade - Nein - es würde nicht über Tabs hinweg funktionieren. Es könnte möglicherweise dazu gebracht werden, obwohl ich mich nicht wirklich damit befasst habe.
Tom Horwood
3

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

Jacob Jan Tuinstra
quelle
Cool! Vielleicht können Sie Ihren Trigger als "bei Änderung" anstatt als "bei Bearbeitung" registrieren. Nur-Format-Änderungen werden daher ebenfalls weitergegeben.
Vidar S. Ramdal