自底向下合并具有相同值的单元格

时间:2019-06-28 08:57:46

标签: google-apps-script google-sheets

我有一个Google工作表,如果值重复则需要合并单元格

期望是将单元格从A1合并到A4,并在其中具有单个值A。

我尝试过,

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
//var values = range.getValues();
var numCols = values[0].length;

    values = [
        ["A", "B", "C", "D", "E"],
        ["A", "B", "S", "D", "E"],
        ["A", "D", "C", "D", "E"],
        ["A", "B", "C", "D", "K"],
        ["c", "B", "W", "D", "K"],
        ["A", "B", "C", "D", "E"],
    ]

    for (var j = 0; j < numCols; j++) {
        var placer = '';
        for (var i = 0; i < values.length - 1; i++) {
            if (values[i][j] == values[i + 1][j])
                range.getCell(i + 2, j + 1).setValue('');
        }
    }

1 个答案:

答案 0 :(得分:2)

  • 当单元格具有与垂直方向相同的值时,您想垂直合并单元格。
  • 您要实现以下情况。

  • 输入 enter image description here

  • 输出 enter image description here

如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。

我的示例脚本的流程如下。

  1. 转置值。
  2. 从转置的值中检索合并单元格的开始和结束地址。
  3. 使用检索到的地址合并单元格。

示例脚本:

// Retrieve values from the active sheet.
var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getDataRange().getValues();

// Transpose values.
var res1 = values[0].map(function(_, i) {return values.map(function(e) {return e[i]})});

// Merge cells.
res1.forEach(function(col, i) {
  var temp = {};
  col.forEach(function(row, j) {
    if (row === col[j + 1] && !(row in temp)) {
      temp[row] = j;
    } else if (row != col[j + 1] && row in temp) {
      sheet.getRange(temp[row] + 1, i + 1, (j - temp[row]) + 1, 1).merge();
      temp = {};
    }
  });
});

注意:

  • 这是一个简单的示例脚本。因此,请根据您的情况进行修改。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

编辑:

这是the additional question的答案。

用法:

  1. 手动选择“ Sheet1”上的单元格“ A2:C6”。
  2. 运行脚本。

脚本:

// Retrieve values from the active sheet.
var range = SpreadsheetApp.getSelection().getActiveRange();
var sheet = range.getSheet();
var values = range.getValues();

// Transpose values.
var res1 = values[0].map(function(_, i) {return values.map(function(e) {return e[i]})});

// Offset
var r = range.getRow() - 1;
var c = range.getColumn() - 1;

// Merge cells.
res1.forEach(function(col, i) {
  var temp = {};
  col.forEach(function(row, j) {
    if (row === col[j + 1] && !(row in temp) && row != "") {
      temp[row] = j;
    } else if (row != col[j + 1] && row in temp) {
      sheet.getRange(r + temp[row] + 1, c + i + 1, (j - temp[row]) + 1, 1).merge();
      temp = {};
    }
  });
});

结果:

之前:

enter image description here

后:

enter image description here