Tham chiếu ô với định dạng màu


16

Có thể tham chiếu một ô trong Google Sheets để ô đó được hiển thị cũng hiển thị nó bằng cách sử dụng cùng định dạng màu văn bản và ô không?

=A1

Sẽ chỉ tham chiếu giá trị của ô. Nhưng nếu ô cụ thể đó có nền đỏ và văn bản màu trắng thì tôi cũng muốn sao chép nó.

Tôi đang nghiêng về các giải pháp công thức hiện có hơn là các kịch bản. Nếu áp dụng tất nhiên.


Trang web này chỉ dành cho các ứng dụng web. Microsoft Excel không phải là một phần của điều đó. Hơn nữa, Excel sử dụng VBA và Google Bảng tính sử dụng Tập lệnh Google Apps cho các loại giải pháp này. Vui lòng chỉnh sửa câu hỏi của bạn nếu không hãy hỏi nó trên SU.
Jacob Jan Tuinstra

@JacobJanTuinstra: Tôi đã mong đợi một số công thức đã có sẵn mà tôi có thể sử dụng. Và vì Bảng tính Google bao gồm nhiều công thức có trong Excel, tôi cũng đã thêm nó dưới dạng thẻ. Nhưng nếu không thì tôi biết đây là về ứng dụng web. Tôi đã thấy một số câu hỏi được gắn thẻ bằng Excel dù sao, do đó thẻ của tôi. Nhưng cảm ơn. Sẽ không thêm nó trong tương lai.
Robert Koritnik

1
Robert, có nhiều sự khác biệt giữa Bảng tính Google và Microsoft Excel (2010). Xem câu trả lời tôi đã đưa ra: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra

1
@JacobJanTuinstra: Vì vậy, nhiều người của tôi đang đề cập đến 85% đó. Điều này chứng tỏ rằng nó bao gồm phần lớn các công thức của Excel. :) Và cảm ơn vì đã đăng liên kết. Cái nhìn sâu sắc
Robert Koritnik

Câu trả lời:


8

Đối với Bảng tính Google, có thể bằng cách viết một tập lệnh:

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

Thêm một kích hoạt cho chức năng tập lệnh, để nó chạy trên mọi sửa đổi bảng tính.

Tôi đã tạo một bảng tính mẫu ở đây . Hãy sao chép nó vào tài khoản của bạn và bắt đầu thử nghiệm với nó.


Tôi đã không nói rõ trong câu hỏi của mình, nhưng tôi đã tìm kiếm nhiều hơn về các công thức hiện có và không phải là các tập lệnh. Nếu không có sự kết hợp công thức để làm cho công việc này, thì kịch bản của bạn sẽ tốt hơn nhiều nếu nó được sử dụng như một công thức được gọi là ví dụ fullCellRef(cellReference)để người ta có thể sử dụng nó như một =fullCellRef(A1)ví dụ
Robert Koritnik

Ah tôi thấy. Nhưng tôi không nghĩ (sửa tôi nếu tôi sai) có bất kỳ công thức nào chỉ định định dạng.
Vidar S. Ramdal

Tôi sẽ sửa cho bạn nếu tôi chắc chắn biết do đó câu hỏi của tôi. :) Nhưng nếu không. Tôi nghi ngờ không có dù sao đi nữa. Vì vậy, nếu bạn viết lại tập lệnh của mình để sử dụng làm công thức ô, tôi sẽ chấp nhận câu trả lời của bạn vì đó sẽ là giải pháp tốt nhất có thể cho các tính năng trong tay.
Robert Koritnik

1
Hmm, hiện tại tôi không biết làm thế nào một hàm công thức ô có thể tham chiếu đến ô được sử dụng từ đó, điều này là cần thiết để đặt định dạng. Tôi sẽ làm một số nghiên cứu.
Vidar S. Ramdal

Không, xin lỗi, điều này dường như là không thể. Hàm công thức không có quyền truy cập để thiết lập định dạng ô. Vì vậy, tôi sẽ phải để lại cho bạn với tùy chọn kích hoạt.
Vidar S. Ramdal

5

Sử dụng câu trả lời của Vidar và Jacob làm cơ sở Tôi đã tạo ra giải pháp sau đây cho phép bạn viết = fullCellRef (A1) sẽ sao chép giá trị và định dạng từ A1.

Một tác dụng phụ nhỏ là nếu bạn kéo sao chép một ô có công thức này, các ô mới ban đầu sẽ sao chép định dạng của ô ban đầu (như bình thường), nhưng sau đó sẽ chuyển sang định dạng được tham chiếu sau một khoảng dừng nhỏ.

Mẫu tờ ở đây .

/**
 * 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ó lỗi trên Dòng 52 và 53 cho kịch bản của Tom. Ai đó có thể giúp để thực hiện nó đúng cách.

@SwapnilGosavi - Tôi vừa cập nhật mã để bao gồm các định dạng bổ sung và dường như nó chạy chính xác. Hãy cho tôi biết nếu bạn vẫn gặp sự cố
Tom Horwood

Điều này là khá tuyệt vời. Tuy nhiên, khi tôi đọc mã nguồn, điều này sẽ không hoạt động trên các tab, đúng không?
Ngọc

@Jade - Không - nó sẽ không hoạt động trên các tab. Nó có thể được thực hiện để làm như vậy, mặc dù tôi không thực sự nhìn vào nó.
Tom Horwood

3

Đây là gần nhất bạn có thể nhận được, trong một cảm giác công thức.

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

Giải thích

Khi chỉnh sửa, một hộp thông báo xuất hiện và yêu cầu một giá trị đầu vào (trừ cũng được cho phép). Sau đó, định dạng (bao gồm giá trị), như Vidar đã trình bày tuyệt vời, được áp dụng.

Thí dụ

Tệp sao chép của Vidar: Định dạng ô


Mát mẻ! Có lẽ bạn có thể đăng ký kích hoạt của mình là 'về sửa đổi', thay vì 'trên chỉnh sửa'. Do đó, những thay đổi chỉ định dạng cũng sẽ lan truyền.
Vidar S. Ramdal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.