Google Spreadsheet单元格引用合并单元格

时间:2017-01-31 20:57:15

标签: google-sheets google-spreadsheet-api

我想引用一个合并的单元格,并从合并单元格范围内的任何单元格中获取合并单元格的值。

在C1中使用=CONCATENATE(A2, " ",B2)并向下拖动适用于:未合并的单元格和合并单元格的第一个单元格。它不适用于合并组中的后续单元格。这在MS Excel中可以正常工作,但不是谷歌电子表格,有没有办法实现这一目标?

Spreadsheet example

4 个答案:

答案 0 :(得分:3)

我编写了以下脚本,该脚本仅适用于合并列(这是我想要的):

/**
 * Returns the value at the top of a merged cell. If the merged cell is blank, not at the top of the sheet, and below another merged cell, the the function overflows into the above merged cell and returns incorrect input.
 *
 * @param {int} column Column number of the cell.
 * @param {int} row Row number of the cell.
 * @return The value shown in the merged cell.
 * @customfunction
 */
function FIRST_IN_MERGED_COLUMN(column, row) {
  var sheet = SpreadsheetApp.getActiveSheet();

  var cell = sheet.getRange(row, column);

  if (!cell.isPartOfMerge())
    return cell.getValue();
  else if (cell.getValue() != "")
    return cell.getValue();
  else {
    var r = row;
    var newCell = cell, oldCell = cell;
    while (r > 1) {
      if (!(newCell = sheet.getRange(--r, column)).isPartOfMerge())
        return oldCell.getValue();
      if (newCell.getValue() != "")
        return newCell.getValue();
      oldCell = newCell;
    }
    return ""; // Blank merged cell at top of sheet
  }
}

不幸的是,如果一个合并列直接在另一个合并列上方,并且底部合并列为空,则脚本将使用顶部合并列的值。

在下面使用,D列显示B栏中的公式,成功或错误案例显示在C栏中。

enter image description here

答案 1 :(得分:1)

这是我尝试整理所有其他答案的所有最佳属性。我已经尽我所能地对它进行了折磨测试,它看起来还算不错。也就是说,欢迎提供错误报告。

用法:使用单元格引用(用引号:{{1})而不是=MERGED_CELL_VALUE("H19")来调用它。如果您不带引号调用该函数,就无法使它总是引发信息错误,因为H19的 contents 可以很容易地变成=MERGED_CELL_VALUE(H19)之类的东西。但这通常会以一种有用的方式抱怨。

如果您希望以此来使用单击和拖动自动填充功能,则有一个相当简单的解决方法。像这样使用A2CELL()。现在,H19已裸露,因此如果您四处移动,它将进行更新。此技巧也适用于=MERGED_CELL_VALUE(CELL("address", H19))等。

H$19

答案 2 :(得分:0)

我找到了一个更好的方法:

// example inputs for cell position
var row = 5;
var column = 7;

// Get the range that the cell belongs and then get the displayed value.
var cell = sheet.getRange(row, column);

var result;

if (!cell.isPartOfMerge()) {
  result = cell.getValue();
} else {
  // get the range the cell belongs
  var range = cell.getMergedRanges()[0];

  // getting the column and the row of the top left cell in the range
  var colRef = range.getColumn();
  var rowRef = range.getRow();

  // getting the value
  result = range.getDisplayValue();
}

答案 3 :(得分:0)

我结合了此功能的其他答案:

function MERGED_CELL_VALUE(column, row) {
  var sheet = SpreadsheetApp.getActiveSheet();

  var cell = sheet.getRange(row, column);

  if (!cell.isPartOfMerge())
    return cell.getValue();
  else if (cell.getValue() != "")
    return cell.getValue();
  else {
    var range = cell.getMergedRanges()[0];
    return range.getDisplayValue();
  }
}