Referensi sel dengan pemformatan warna

16

Apakah mungkin untuk mereferensikan sel di Google Sheets sehingga sel yang ditampilkan juga menampilkannya menggunakan teks dan format warna sel yang sama?

=A1

Hanya akan mereferensikan nilai sel. Tetapi jika sel itu memiliki latar belakang merah dan teks putih, saya ingin itu juga disalin.

Saya condong ke arah solusi formula yang ada daripada skrip. Jika berlaku tentu saja.

Robert Koritnik
sumber
Situs ini hanya untuk aplikasi web. Microsoft Excel bukan bagian dari itu. Selanjutnya, Excel menggunakan VBA dan Google Spreadsheets menggunakan Google Apps Script untuk solusi semacam ini. Harap edit pertanyaan Anda atau tanyakan pada SU.
Jacob Jan Tuinstra
@JacobJanTuinstra: Saya menantikan beberapa formula yang sudah ada yang bisa saya gunakan. Dan karena Google Spreadsheets mencakup banyak formula hadir di Excel saya menambahkannya sebagai tag juga. Tapi kalau tidak, saya tahu ini tentang aplikasi web. Saya telah melihat beberapa pertanyaan yang ditandai dengan Excel, karenanya tag saya. Tapi terima kasih. Tidak akan menambahkannya di masa mendatang.
Robert Koritnik
1
Robert, ada banyak banyak perbedaan antara Google Spreadsheets dan Microsoft Excel (2010). Lihat menjawab saya berikan: webapps.stackexchange.com/a/44719/29140
Jacob Jan Tuinstra
1
@ JacobJanTuinstra: Banyak sekali yang saya maksud adalah 85% itu. Ini membuktikan bahwa itu mencakup sebagian besar rumus Excel. :) Dan terima kasih telah mengirimkan tautannya. Wawasan luar biasa.
Robert Koritnik

Jawaban:

8

Untuk Google Spreadsheets, dimungkinkan dengan menulis skrip:

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

Tambahkan pemicu untuk fungsi skrip, sehingga dijalankan pada setiap modifikasi spreadsheet.

Saya telah membuat sampel spreadsheet di sini . Jangan ragu untuk menyalinnya ke akun Anda sendiri, dan mulai bereksperimen dengannya.

Vidar S. Ramdal
sumber
Saya tidak menyatakannya dengan jelas dalam pertanyaan saya, tetapi saya lebih mencari formula yang ada dan bukan skrip. Jika tidak ada kombinasi rumus untuk membuat ini berfungsi, maka skrip Anda akan jauh lebih baik jika digunakan sebagai rumus yang disebut yaitu fullCellRef(cellReference)sehingga orang dapat menggunakannya sebagai =fullCellRef(A1)contoh
Robert Koritnik
Ah, begitu. Tapi saya tidak berpikir (benar kalau saya salah) ada setiap formula yang menspesifikasikan format.
Vidar S. Ramdal
Saya akan memperbaiki Anda jika saya secara pasti tahu maka pertanyaan saya. :) Tetapi sebaliknya. Saya kira tidak ada. Jadi jika Anda menulis ulang skrip Anda untuk digunakan sebagai formula sel saya akan menerima jawaban Anda karena itu akan menjadi solusi terbaik untuk fitur yang ada.
Robert Koritnik
1
Hmm, saat ini saya tidak tahu bagaimana fungsi formula sel dapat mereferensikan sel yang digunakannya, yang diperlukan untuk mengatur pemformatan. Saya akan melakukan riset.
Vidar S. Ramdal
Tidak, maaf, ini sepertinya tidak mungkin. Fungsi rumus tidak memiliki akses ke pengaturan pemformatan sel. Jadi saya harus meninggalkan Anda dengan opsi pemicu.
Vidar S. Ramdal
5

Menggunakan jawaban Vidar dan Jacob sebagai dasar saya telah menciptakan solusi berikut yang akan memungkinkan Anda untuk menulis = fullCellRef (A1) yang akan menyalin nilai dan format dari A1.

Efek samping kecil adalah bahwa jika Anda menyeret-menyalin sel dengan rumus ini, sel-sel baru pada awalnya akan menyalin pemformatan sel asli (seperti biasa), tetapi kemudian akan beralih ke pemformatan yang dirujuk setelah jeda kecil.

Lembar contoh di sini .

/**
 * 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
sumber
Ada kesalahan pada Baris 52 dan 53 untuk skrip Tom. Adakah yang bisa membantu menjalankannya dengan benar.
@SwapnilGosavi - Saya baru saja memperbarui kode untuk memasukkan format tambahan, dan sepertinya berjalan dengan benar. Beri tahu saya jika Anda masih memiliki masalah
Tom Horwood
Ini sangat mengagumkan. Namun, ketika saya membaca kode sumber, ini tidak akan bekerja lintas tab, benar?
Jade
@ Jade - Tidak - itu tidak akan berfungsi lintas tab. Mungkin bisa dilakukan untuk itu, meskipun saya belum benar-benar melihatnya.
Tom Horwood
3

Ini adalah yang terdekat yang bisa Anda dapatkan, dalam memiliki perasaan formula.

Kode

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

Dijelaskan

Setelah diedit, kotak pesan muncul dan meminta nilai input (dikurangi juga diizinkan). Kemudian format (termasuk nilai), seperti yang sudah disajikan Vidar dengan luar biasa, diterapkan.

Contoh

File Vidar yang disalin: Pemformatan Sel

Jacob Jan Tuinstra
sumber
Keren! Mungkin Anda bisa mendaftarkan pemicu Anda sebagai 'pada modifikasi', bukan 'pada edit'. Dengan demikian, perubahan format saja akan menyebar juga.
Vidar S. Ramdal