具有颜色格式的单元格引用


16

是否可以引用Google表格中的单元格,以便显示该单元格的单元格也使用相同的文本和单元格颜色格式进行显示?

=A1

将仅引用单元格的值。但是,如果该特定单元格具有红色背景和白色文本,我也希望将其复制。

我倾向于现有的公式解决方案,而不是脚本。如果适用,当然可以。


该站点仅适用于Web应用程序。Microsoft Excel不在其中。此外,对于此类解决方案,Excel使用VBA,而Google Spreadsheets使用Google Apps脚本。请编辑您的问题,否则在SU上提问。
2013年

@JacobJanTuinstra:我很期待可以使用的一些已经存在的公式。由于Google Spreadsheets涵盖了Excel中存在的许多公式,因此我也将其添加为标签。但除此之外,我知道这与网络应用有关。无论如何,我已经看到了几个用Excel标记的问题,因此也就是我的标记。但是,谢谢。将来不会添加。
罗伯特·科里特尼克

1
罗伯特,Google Spreadsheets和Microsoft Excel(2010)之间有很多区别。请参阅我给的答案: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra 2013年

1
@JacobJanTuinstra:所以我很多人都提到这85%。这证明它确实涵盖了大多数Excel公式。:)并且感谢您发布链接。真知灼见。
罗伯特·科里特尼克

Answers:


8

对于Google Spreadsheets,可以通过编写脚本来实现:

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

为脚本功能添加一个触发器,以便它可以在每次电子表格修改时运行。

我在这里创建了一个示例电子表格。随时将其复制到您自己的帐户,然后开始尝试。


我没有在问题中明确说明这一点,但我更关注的是现有公式,而不是脚本。如果没有公式组合可以完成这项工作,那么将脚本用作名为ie的公式会更好,fullCellRef(cellReference)因此您可以使用它=fullCellRef(A1),例如
Robert Koritnik

知道了 但是我不认为(如果我错了,请纠正我)没有任何公式可以指定格式。
Vidar S. Ramdal

如果我绝对知道我的问题,我会纠正你的。:) 然而在其他方面。我怀疑仍然没有。因此,如果您重写脚本以用作单元格公式,我会接受您的回答,因为这将是针对现有功能的最佳解决方案。
罗伯特·科里特尼克

1
嗯,我目前不知道单元格公式函数如何引用使用它的单元格,这对于设置格式是必不可少的。我会做一些研究。
Vidar S. Ramdal

不,对不起,这似乎是不可能的。公式函数无权设置单元格格式。因此,我必须将触发器选项留给您。
Vidar S. Ramdal

5

使用Vidar和Jacob的答案作为基础,我创建了以下解决方案,使您能够编写= fullCellRef(A1),该操作将从A1复制值和格式。

较小的副作用是,如果使用此公式拖动-复制单元格,则新单元格将首先复制原始单元格的格式(正常情况下),但稍作停顿后将切换为引用的格式。

样本表在这里

/**
 * 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的脚本在52和53行上存在错误。有人可以帮助您正确执行它吗?

@SwapnilGosavi-我刚刚更新了代码以包含其他格式,它似乎可以正常运行。让我知道您是否还有问题
Tom Horwood

太棒了 但是,当我阅读源代码时,这在各个选项卡中都无法正常工作,对吗?
翡翠,

@Jade-否-跨选项卡不起作用。可以这样做,尽管我没有真正研究过。
汤姆·霍伍德

3

这是您获得配方感时最接近的。

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

解释

编辑后,将出现一个消息框,询问输入值(也允许减号)。然后应用格式化(包括值),如Vidar所介绍的那样。

Vidar复制的文件:单元格格式


凉!也许您可以将触发器注册为“修改时”,而不是“修改时”。因此,仅格式更改也会传播。
Vidar S. Ramdal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.