Renk biçimlendirmeli hücre başvurusu


16

Google E-Tablolar'daki bir hücreye, görüntülendiği hücrenin aynı metin ve hücre rengi biçimlendirmesini kullanarak göstermesi de mümkün müdür?

=A1

Yalnızca hücrenin değerini belirtir. Ancak o hücrenin kırmızı arka planı ve beyaz metni varsa, bunun da kopyalanmasını istiyorum.

Komut dosyaları yerine mevcut formül çözümlerine yöneliyorum. Varsa tabii ki.


Bu site yalnızca web uygulamaları içindir. Microsoft Excel bunun bir parçası değildir. Ayrıca, Excel VBA ve Google E-Tablolar bu tür çözümler için Google Apps Komut Dosyası kullanır. Lütfen sorunuzu düzenleyin ya da SU'dan sorun.
Jacob Jan Tuinstra

@JacobJanTuinstra: Kullanabileceğim bazı mevcut formülleri dört gözle bekliyordum. Google E-Tablolar Excel'de bulunan birçok formülü kapsadığı için bunu etiket olarak da ekledim. Ama aksi halde bunun web uygulamaları ile ilgili olduğunu biliyorum. Yine de Excel ile etiketlenmiş birkaç soru gördüm, bu yüzden etiketim. Ama teşekkürler. Gelecekte eklemeyeceğim.
Robert Koritnik

1
Robert, Google E-Tablolar ve Microsoft Excel (2010) arasında birçok fark var. Verdiğim
Jacob Jan Tuinstra

1
@JacobJanTuinstra: my Yani çok çok olanlar% 85 bahsediyor. Bu, Excel formüllerinin çoğunu kapsadığını kanıtlıyor. :) Ve bağlantıyı gönderdiğiniz için teşekkürler. İyi fikir.
Robert Koritnik

Yanıtlar:


8

Google E-Tablolar için bir komut dosyası yazarak mümkündür:

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

Komut dosyası işlevi için bir tetikleyici ekleyin , böylece her elektronik tablo değişikliğinde çalışır.

Burada örnek bir e-tablo oluşturdum . Kendi hesabınıza kopyalamaktan çekinmeyin ve denemeye başlayın.


Sorumda açıkça belirtmedim, ama daha çok senaryolara değil, mevcut formüllere bakıyordum. Bu işi yapmak için hiçbir formül kombinasyonu varsa o kullanıldıysa bir formül ie denilen, sonra da komut çok daha iyi olacağını fullCellRef(cellReference)kimse olarak kullanabilirsiniz böylece =fullCellRef(A1)örneğin
Robert Koritnik

Ah, anlıyorum. Ama sanmıyorum (yanlışsam beni düzeltin) biçimlendirmeyi belirten herhangi bir formül var.
Vidar S. Ramdal

Benim sorumu kesin olarak bilseydim seni düzeltirdim. :) Ama başka türlü. Yine de hiç şüphesiz. Komut dosyanızı bir hücre formülü olarak kullanılmak üzere yeniden yazarsanız, cevabınızı kabul edeceğim çünkü eldeki özellikler için mümkün olan en iyi çözüm olacaktır.
Robert Koritnik

1
Hmm, şu anda bir hücre formülü işlevinin, kullanılan biçimlendirmeyi ayarlamak için gerekli olan hücreye nasıl başvurabileceğini bilmiyorum. Biraz araştırma yapacağım.
Vidar S. Ramdal

Hayır, üzgünüm, bu imkansız görünüyor. Bir formül işlevinin hücre biçimlendirmesini ayarlama erişimi yoktur. Bu yüzden sizi tetikleme seçeneğiyle bırakmam gerekecek.
Vidar S. Ramdal

5

Vidar ve Jacob'un cevaplarını temel alarak, A1'den değeri ve biçimi kopyalayacak olan = fullCellRef (A1) yazmanızı sağlayacak aşağıdaki çözümü oluşturdum.

Küçük bir yan etki, bu formülü kullanarak bir hücreyi sürükleyip kopyalarsanız, yeni hücrelerin başlangıçta orijinal hücrenin biçimlendirmesini (normal olarak olduğu gibi) kopyalaması, ancak daha sonra küçük bir duraklamadan sonra başvurulan biçimlendirmeye geçmesidir.

Örnek sayfa burada .

/**
 * 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'un komut dosyası için Satır 52 ve 53'te bir hata var. Birisi düzgün bir şekilde yürütmek için yardımcı olabilir.

@SwapnilGosavi - Kodu ek formatlar içerecek şekilde güncelledim ve düzgün çalışıyor gibi görünüyor. Hala sorun yaşıyorsanız bana bildirin
Tom Horwood

Bu oldukça harika. Ancak, kaynak kodu okurken, bu sekmeler arasında işe yaramaz, değil mi?
Jade

@Yeşim - Hayır - sekmeler arasında çalışmaz. Gerçekten bakmadım, ancak bunu yapmak için yapılabilir.
Tom Horwood

3

Bu, formül hissine sahip olabileceğiniz en yakın şeydir.

kod

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

Açıklaması

Düzenleme üzerine bir mesaj kutusu belirir ve bir giriş değeri ister (eksi de izin verilir). Daha sonra Vidar'ın harika bir şekilde sunulduğu gibi biçimlendirme (değer dahil) uygulanır.

Misal

Kopyalanan Vidar dosyası: Cell Formatting


Güzel! Belki de tetikleyicinizi 'düzenleme' yerine 'değişiklik' olarak kaydedebilirsiniz. Böylece, sadece format değişiklikleri de yayılacaktır.
Vidar S. Ramdal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.