Référence de cellule avec mise en forme des couleurs

16

Est-il possible de référencer une cellule dans Google Sheets afin que la cellule où elle s'affiche s'affiche également en utilisant le même format de texte et de couleur de cellule?

=A1

Ne référencera que la valeur de la cellule. Mais si cette cellule particulière a un fond rouge et du texte blanc, j'aimerais que cela soit également copié.

Je penche vers des solutions de formule existantes plutôt que vers des scripts. Le cas échéant, bien sûr.

Robert Koritnik
la source
Ce site est réservé aux applications Web. Microsoft Excel n'en fait pas partie. En outre, Excel utilise VBA et Google Spreadsheets utilise Google Apps Script pour ce type de solutions. Modifiez votre question ou posez-la sur SU.
Jacob Jan Tuinstra
@JacobJanTuinstra: J'attendais avec impatience une formule déjà présente que je pourrais utiliser. Et puisque Google Spreadsheets couvre de nombreuses formules présentes dans Excel, je l'ai également ajouté comme balise. Mais sinon, je sais qu'il s'agit d'applications Web. J'ai de toute façon vu plusieurs questions marquées avec Excel, d'où ma balise. Mais merci. Je ne l'ajouterai pas à l'avenir.
Robert Koritnik
1
Robert, il existe de nombreuses différences entre Google Spreadsheets et Microsoft Excel (2010). Voir la réponse que j'ai donnée: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra
1
@JacobJanTuinstra: Donc, mon grand nombre fait référence à ces 85%. Cela prouve qu'il couvre la majorité des formules d'Excel. :) Et merci d'avoir posté le lien. Grande perspicacité.
Robert Koritnik

Réponses:

8

Pour Google Spreadsheets, c'est possible en écrivant 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);
}

Ajoutez un déclencheur pour la fonction de script, afin qu'elle s'exécute à chaque modification de la feuille de calcul.

J'ai créé un exemple de feuille de calcul ici . N'hésitez pas à le copier sur votre propre compte et à commencer à l'expérimenter.

Vidar S. Ramdal
la source
Je ne l'ai pas dit clairement dans ma question, mais je regardais plutôt les formules existantes et non les scripts. S'il n'y a pas de combinaison de formule pour que cela fonctionne, alors votre script serait beaucoup mieux s'il était utilisé comme une formule appelée c'est-à-dire fullCellRef(cellReference)afin que l'on puisse l'utiliser comme =fullCellRef(A1)par exemple
Robert Koritnik
Ah, je vois. Mais je ne pense pas (corrigez-moi si je me trompe) qu'il existe une formule qui spécifie le formatage.
Vidar S. Ramdal,
Je vous corrigerais si je savais définitivement d'où ma question. :) Mais sinon. Je suppose qu'il n'y en a pas de toute façon. Donc, si vous réécrivez votre script pour l'utiliser comme formule de cellule, j'accepterai votre réponse car ce serait la meilleure solution possible pour les fonctionnalités à portée de main.
Robert Koritnik
1
Hmm, je ne sais pas actuellement comment une fonction de formule de cellule pourrait référencer la cellule à partir de laquelle elle est utilisée, ce qui est nécessaire pour définir le formatage. Je ferai des recherches.
Vidar S. Ramdal,
Non, désolé, cela semble impossible. Une fonction de formule n'a pas accès à la définition du formatage des cellules. Je vais donc devoir vous laisser avec l'option de déclenchement.
Vidar S. Ramdal,
5

En utilisant les réponses de Vidar et Jacob comme base, j'ai créé la solution suivante qui vous permettra d'écrire = fullCellRef (A1) qui copiera la valeur et le format depuis A1.

Un effet secondaire mineur est que si vous faites glisser-copier une cellule avec cette formule, les nouvelles cellules copieront initialement la mise en forme de la cellule d'origine (comme c'est normal), mais passeront ensuite à la mise en forme référencée après une petite pause.

Exemple de feuille ici .

/**
 * 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
la source
Il y a une erreur sur les lignes 52 et 53 pour le script de Tom. Quelqu'un peut-il aider à l'exécuter correctement?
@SwapnilGosavi - Je viens de mettre à jour le code pour inclure des formats supplémentaires, et il semble fonctionner correctement. Faites-moi savoir si vous avez encore des problèmes
Tom Horwood
C'est assez génial. Cependant, en lisant le code source, cela ne fonctionnerait pas entre les onglets, n'est-ce pas?
Jade
@Jade - Non - cela ne fonctionnerait pas entre les onglets. On pourrait peut-être le faire, même si je n'y ai pas vraiment réfléchi.
Tom Horwood
3

C'est le plus proche que vous pouvez obtenir en ayant une sensation de formule.

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

Expliqué

Lors de la modification, une boîte de message apparaît et demande une valeur d'entrée (le moins est également autorisé). Ensuite, le formatage (valeur incluse), comme Vidar l'a déjà merveilleusement présenté, est appliqué.

Exemple

Fichier Vidar copié: formatage des cellules

Jacob Jan Tuinstra
la source
Cool! Vous pourriez peut-être enregistrer votre déclencheur comme «en cas de modification», au lieu de «en cas de modification». Ainsi, les modifications de format uniquement se propageront également.
Vidar S. Ramdal,