Riferimento di cella con formattazione del colore


16

È possibile fare riferimento a una cella in Fogli Google in modo che anche la cella in cui viene visualizzata la visualizzi utilizzando lo stesso testo e la stessa formattazione del colore della cella?

=A1

Farà riferimento solo al valore della cella. Ma se quella particolare cella ha uno sfondo rosso e un testo bianco, vorrei che anche quello fosse copiato.

Mi sto orientando verso soluzioni formula esistenti piuttosto che con script. Se applicabile ovviamente.


Questo sito è solo per applicazioni web. Microsoft Excel non fa parte di questo. Inoltre, Excel utilizza VBA e Google Spreadsheets utilizza Google Apps Script per questo tipo di soluzioni. Modifica la tua domanda oppure chiedila su SU.
Jacob Jan Tuinstra,

@JacobJanTuinstra: non vedevo l'ora di avere una formula già presente che avrei potuto usare. E poiché Google Spreadsheets copre molte formule presenti in Excel, l'ho aggiunto anche come tag. Ma per il resto so che si tratta di app Web. Ho visto comunque diverse domande taggate con Excel, quindi il mio tag. Ma grazie. Non lo aggiungerò in futuro.
Robert Koritnik,

1
Robert, ci sono molte differenze tra Google Spreadsheets e Microsoft Excel (2010). Vedi la risposta che ho dato: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra

1
@JacobJanTuinstra: Quindi molti dei miei si riferiscono a questi 85%. Ciò dimostra che copre la maggior parte delle formule di Excel. :) E grazie per aver pubblicato il link. Ottima intuizione.
Robert Koritnik,

Risposte:


8

Per Google Spreadsheets, è possibile scrivere uno 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);
}

Aggiungi un trigger per la funzione di script, in modo che venga eseguito su ogni modifica del foglio di calcolo.

Ho creato un foglio di calcolo di esempio qui . Sentiti libero di copiarlo sul tuo account e inizia a sperimentarlo.


Non l'ho affermato chiaramente nella mia domanda, ma ero più alla ricerca di formule esistenti e non di script. Se non ci fosse una combinazione di formule per far funzionare questo, allora il tuo script sarebbe molto meglio se fosse usato come una formula chiamata ie fullCellRef(cellReference)così uno potrebbe usarlo come =fullCellRef(A1)per esempio
Robert Koritnik

Ah, capisco. Ma non credo (correggimi se sbaglio) esiste una formula che specifica la formattazione.
Vidar S. Ramdal

Ti correggerei se sapessi definitivamente da qui la mia domanda. :) Ma altrimenti. Sospetto che non ce ne sia comunque. Quindi, se riscrivi il tuo script per usarlo come una formula di cella, accetterò la tua risposta perché sarebbe la migliore soluzione possibile per le funzionalità a portata di mano.
Robert Koritnik,

1
Hmm, attualmente non so come una funzione di formula di cella possa fare riferimento alla cella da cui viene utilizzata, che è necessaria per impostare la formattazione. Farò qualche ricerca.
Vidar S. Ramdal

No, scusa, questo sembra impossibile. Una funzione formula non ha accesso all'impostazione della formattazione della cella. Quindi dovrò lasciarti con l'opzione trigger.
Vidar S. Ramdal

5

Usando le risposte di Vidar e Jacob come base ho creato la seguente soluzione che ti permetterà di scrivere = fullCellRef (A1) che copierà il valore e il formato da A1.

Un effetto collaterale minore è che se si trascina e copia una cella con questa formula, le nuove celle copieranno inizialmente la formattazione della cella originale (come è normale), ma passeranno quindi alla formattazione di riferimento dopo una piccola pausa.

Foglio di esempio qui .

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

C'è un errore sulla riga 52 e 53 per la sceneggiatura di Tom. Qualcuno può aiutare a eseguirlo correttamente.

@SwapnilGosavi - Ho appena aggiornato il codice per includere formati aggiuntivi e sembra funzionare correttamente. Fammi sapere se hai ancora problemi
Tom Horwood

Questo è davvero fantastico. Tuttavia, mentre leggo il codice sorgente, questo non funzionerebbe tra le schede, giusto?
Giada

@Jade - No - non funzionerebbe tra le schede. Potrebbe forse essere fatto per farlo, anche se non ci ho davvero pensato.
Tom Horwood,

3

Questo è il più vicino che puoi ottenere, avendo una sensazione formula.

Codice

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

spiegato

Al momento della modifica, viene visualizzata una finestra di messaggio che richiede un valore di input (è consentito anche il meno). Quindi viene applicata la formattazione (valore incluso), come Vidar meravigliosamente già presentato.

Esempio

File di Vidar copiato: formattazione delle celle


Freddo! Forse potresti registrare il tuo trigger come "in modifica", anziché "in modifica". Pertanto, si propagheranno anche le modifiche solo al formato.
Vidar S. Ramdal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.