색상 서식이있는 셀 참조


16

표시되는 셀에도 동일한 텍스트 및 셀 색상 형식을 사용하여 표시되도록 Google 스프레드 시트에서 셀을 참조 할 수 있습니까?

=A1

셀 값만 참조합니다. 그러나 해당 특정 셀에 빨간색 배경과 흰색 텍스트가 있으면 복사해야합니다.

스크립트가 아닌 기존의 수식 솔루션에 기울고 있습니다. 물론 해당되는 경우.


이 사이트는 웹 애플리케이션 전용입니다. Microsoft Excel은 그 일부가 아닙니다. 또한 Excel은 VBA를 사용하고 Google 스프레드 시트는 이러한 종류의 솔루션에 Google Apps Script를 사용합니다. 질문을 수정하거나 SU에 질문하십시오.
Jacob Jan Tuinstra

@ JacobJanTuinstra : 내가 사용할 수있는 이미 존재하는 공식을 기대하고있었습니다. Google 스프레드 시트는 Excel에있는 많은 수식을 다루므로 태그로 추가했습니다. 그러나 그렇지 않으면 이것이 웹 앱에 관한 것임을 알고 있습니다. 어쨌든 Excel로 태그가 지정된 몇 가지 질문을 보았으므로 태그입니다. 하지만 고마워 나중에 추가하지 않습니다.
Robert Koritnik

1
Robert, Google 스프레드 시트와 Microsoft Excel (2010)에는 많은 차이점이 있습니다. : 내가 준 대답을 참조하십시오 webapps.stackexchange.com/a/44719/29140
야곱 월 Tuinstra

1
@JacobJanTuinstra : 많은 사람들 이 85 %를 언급하고 있습니다. 이것은 대부분의 Excel 수식을 다루고 있음을 증명합니다. :) 링크를 게시 해 주셔서 감사합니다. 훌륭한 통찰력.
Robert Koritnik

답변:


8

Google 스프레드 시트의 경우 스크립트를 작성하면 가능합니다.

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

모든 스프레드 시트 수정에서 실행될 수 있도록 스크립트 기능에 대한 트리거추가하십시오 .

여기에 샘플 스프레드 시트를 만들었습니다 . 자신의 계정으로 자유롭게 복사 한 후 실험 해보십시오.


나는 내 질문에 명확하게 언급하지 않았지만 스크립트가 아닌 기존 수식을 더 많이 찾고있었습니다. 이 작품을 만들기 위해 어떤 공식 조합이없는 경우가 사용 된 경우 수식 즉, 전화로, 다음 스크립트는 훨씬 더 나은 것 fullCellRef(cellReference)하나가로 사용할 수 있도록 =fullCellRef(A1)예를 들어
로버트 Koritnik

아, 알겠습니다 그러나 형식을 지정 하는 수식이 있다고 생각하지 않습니다 (잘못된 경우 수정하십시오) .
Vidar S. Ramdal

내가 확실히 내 질문을 알고 있다면 나는 당신을 수정합니다. :) 그러나 그렇지 않다. 어쨌든 없다고 생각합니다. 따라서 셀 수식으로 사용되도록 스크립트를 다시 작성하면 해당 기능에 가장 적합한 솔루션이므로 답변을 수락합니다.
Robert Koritnik 08 년

1
흠, 나는 현재 셀 수식 함수가 셀을 참조하는 방법을 모른다. 포맷을 설정하는 데 필요하다. 나는 약간의 연구를 할 것이다.
Vidar S. Ramdal

아뇨, 죄송합니다. 불가능 해 보입니다. 수식 함수는 셀 서식 설정에 액세스 할 수 없습니다. 트리거 옵션을 남겨 두어야합니다.
Vidar S. Ramdal

5

Vidar와 Jacob의 답변을 기본으로 사용하여 A1의 값과 형식을 복사하는 = fullCellRef (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

@Jade-아니요-탭에서 작동하지 않습니다. 내가 실제로 조사하지는 않았지만 가능할 수도 있습니다.
Tom Horwood

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.