Referencia de celda con formato de color

16

¿Es posible hacer referencia a una celda en Hojas de cálculo de Google para que la celda donde se muestra también la muestre usando el mismo texto y el mismo formato de color de celda?

=A1

Solo hará referencia al valor de la celda. Pero si esa celda en particular tiene fondo rojo y texto en blanco, me gustaría que también se copiara.

Me estoy inclinando hacia soluciones de fórmulas existentes en lugar de guiones. Si corresponde, por supuesto.

Robert Koritnik
fuente
Este sitio es solo para aplicaciones web. Microsoft Excel no es parte de eso. Además, Excel usa VBA y Google Spreadsheets usa Google Apps Script para este tipo de soluciones. Edite su pregunta o pregúntela en SU.
Jacob Jan Tuinstra
@JacobJanTuinstra: Estaba esperando alguna fórmula ya presente que pudiera usar. Y dado que las hojas de cálculo de Google cubren muchas fórmulas presentes en Excel, también lo agregué como etiqueta. Pero por lo demás sé que se trata de aplicaciones web. De todas formas, he visto varias preguntas etiquetadas con Excel, de ahí mi etiqueta. Pero gracias. No lo agregaré en el futuro.
Robert Koritnik
1
Robert, hay muchas diferencias entre las hojas de cálculo de Google y Microsoft Excel (2010). Vea la respuesta que di: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra
1
@JacobJanTuinstra: Mis muchos se refieren a esos 85%. Esto demuestra que cubre la mayoría de las fórmulas de Excel. :) Y gracias por publicar el enlace. Gran idea
Robert Koritnik

Respuestas:

8

Para las hojas de cálculo de Google, es posible escribiendo un script:

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

Agregue un disparador para la función de script, de modo que se ejecute en cada modificación de hoja de cálculo.

He creado una hoja de cálculo de muestra aquí . Siéntase libre de copiarlo en su propia cuenta y comenzar a experimentar con él.

Vidar S. Ramdal
fuente
No lo dije claramente en mi pregunta, pero estaba más buscando fórmulas existentes y no guiones. Si no hay una combinación de fórmulas para que esto funcione, entonces su secuencia de comandos sería mucho mejor si se usara como una fórmula llamada, por ejemplo, fullCellRef(cellReference)se podría usar como, =fullCellRef(A1)por ejemplo
Robert Koritnik,
Ah, ya veo. Pero no creo (corríjame si me equivoco) hay alguna fórmula que especifique el formato.
Vidar S. Ramdal
Te corregiría si definitivamente conociera mi pregunta. :) Pero de otro modo. Sospecho que no hay ninguno de todos modos. Entonces, si reescribe su script para usarlo como una fórmula de celda, aceptaré su respuesta porque sería la mejor solución posible para las características disponibles.
Robert Koritnik
1
Hmm, actualmente no sé cómo una función de fórmula de celda podría hacer referencia a la celda desde la que se usa, lo cual es necesario para establecer el formato. Investigaré un poco.
Vidar S. Ramdal
No, lo siento, esto parece imposible. Una función de fórmula no tiene acceso para configurar el formato de celda. Así que tendré que dejarte con la opción de activación.
Vidar S. Ramdal
5

Utilizando las respuestas de Vidar y Jacob como base, he creado la siguiente solución que le permitirá escribir = fullCellRef (A1) que copiará el valor y el formato de A1.

Un efecto secundario menor es que si arrastra y copia una celda con esta fórmula, las nuevas celdas copiarán inicialmente el formato de la celda original (como es normal), pero luego cambiarán al formato de referencia después de una pequeña pausa.

Hoja de muestra aquí .

/**
 * 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
fuente
Hay un error en las líneas 52 y 53 para el script de Tom. ¿Alguien puede ayudar a ejecutarlo correctamente?
@SwapnilGosavi: acabo de actualizar el código para incluir formatos adicionales y parece que se ejecuta correctamente. Avíseme si todavía tiene problemas
Tom Horwood
Esto es bastante asombroso. Sin embargo, mientras leo el código fuente, esto no funcionaría en todas las pestañas, ¿correcto?
Jade
@Jade - No, no funcionaría en todas las pestañas. Posiblemente podría hacerse para hacerlo, aunque realmente no lo he investigado.
Tom Horwood
3

Esto es lo más cercano que puede llegar a tener una sensación de fórmula.

Código

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

Explicado

Al editar, aparece un cuadro de mensaje y solicita un valor de entrada (también se permite menos). Luego se aplica el formato (valor incluido), como Vidar maravillosamente ya presentado.

Ejemplo

Archivo de Vidar copiado: formato de celda

Jacob Jan Tuinstra
fuente
¡Frio! Tal vez podría registrar su desencadenante como 'en modificación', en lugar de 'en edición'. Por lo tanto, los cambios de formato solamente se propagarán también.
Vidar S. Ramdal