色の書式設定付きのセル参照


16

Googleスプレッドシートでセルを参照して、表示されるセルにも同じテキストとセルの色の書式を使用して表示することは可能ですか?

=A1

セルの値のみを参照します。しかし、その特定のセルの背景が赤でテキストが白の場合は、それもコピーしたいと思います。

スクリプトではなく、既存のフォーミュラソリューションに傾倒しています。もちろん該当する場合。


このサイトはWebアプリケーション専用です。Microsoft Excelはその一部ではありません。さらに、ExcelはVBAを使用し、Google Spreadsheetsはこれらの種類のソリューションにGoogle Apps Scriptを使用します。質問を編集するか、SUで質問してください。
ジェイコブヤントゥインストラ

@JacobJanTuinstra:私が使用できる既に存在する式をいくつか楽しみにしていました。また、GoogleスプレッドシートはExcelに存在する多くの数式をカバーしているため、タグとしても追加しました。しかし、それ以外の場合、これはWebアプリに関するものであることを知っています。とにかくExcelでタグ付けされたいくつかの質問を見てきましたので、私のタグです。しかし、ありがとう。今後追加しないでください。
ロバートKoritnik

1
ロバート、GoogleスプレッドシートとMicrosoft Excel(2010)には多くの違いがあります。私が与えた答えを参照してください: webapps.stackexchange.com/a/44719/29140
ジェイコブJan Tuinstra

1
@JacobJanTuinstra:だから、私の多くの多くがそれらの85%に言及しています。これは、Excelの式の大半をカバーしていることを証明しています。:)そして、リンクを投稿してくれてありがとう。素晴らしい洞察。
ロバート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);
}

スクリプト関数のトリガー追加して、スプレッドシートが変更されるたびに実行されるようにします。

ここでサンプルスプレッドシートを作成しました。自分のアカウントに自由にコピーして、試してみてください。


私の質問では明確に述べていませんでしたが、スクリプトではなく、既存の式に目を向けていました。この作業を行うには、no式の組み合わせをがない場合は、それを使用した場合の式はすなわちと呼ばれるように、そしてあなたのスクリプトははるかに良いだろうfullCellRef(cellReference)1としてそれを使用することができるように=fullCellRef(A1)例えば
ロバートKoritnik

ああ、分かった。しかし、私はあります(私が間違っているなら、私を修正)とは思わないの任意指定の書式という式は。
ヴィダールS.ラムダル

私は私の質問を明確に知っていた場合、私はあなたを修正します。:) それ以外の場合。とにかく何もないと思います。したがって、セル式として使用するようにスクリプトを書き直した場合、それは手元の機能にとって最良の解決策になるため、答えを受け入れます。
ロバートKoritnik

1
うーん、私は現在、セル式関数がそれが使用されているセルをどのように参照できるかわかりません。これはフォーマットを設定するために必要です。調査を行います。
ヴィダールS.ラムダル

いいえ、申し訳ありませんが、これは不可能のようです。数式関数は、セルの書式設定にアクセスできません。そのため、トリガーオプションを残しておく必要があります。
ヴィダールS.ラムダル

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

トムのスクリプトの52行目と53行目にエラーがあります。誰かがそれを適切に実行するのを助けることができます。

@SwapnilGosavi-コードを更新して追加の形式を含めるようにしましたが、正しく実行されるようです。問題が解決しない場合はお知らせください
トムホーウッド

これはすごいです。ただし、ソースコードを読むと、これはタブ間で機能しません。
ジェイド

@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のファイルをコピー:Cell Formatting


涼しい!おそらく、トリガーを「編集時」ではなく「変更時」として登録できます。したがって、フォーマットのみの変更も伝播されます。
ヴィダールS.ラムダル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.