【问题标题】:Google sheets: automatically merge identical cells谷歌表格:自动合并相同的单元格
【发布时间】:2019-06-30 14:44:19
【问题描述】:

我正在尝试合并垂直相邻且具有相同值的单元格。

|"X"|         |"X"|
|"X"|   --->  |   |
|"X"|         |   | (merged)

我正在制作时间跟踪表,并且合并类似的活动会很棒 example image from my sheet (所以,“sleep”会合并成一个大块,“tracking this sheet”也会合并)

我只想垂直合并单元格

(另外,我只在B26:H121的范围内操作)

为此,我已尝试使用 stackoverflow 上的一些现有代码 - Google Sheets - Horizontal merge identical cells in single rowMerge cells with same words - 但我无法让任何工作。可能是因为我不懂javascript哈哈。

——

还有最后一件事,如果可能的话,我希望有办法存储合并单元格的大小。 (在上图中,睡眠和跟踪此工作表分别为 16 和 4。)这将允许我在合并单元格时跟踪任何特定任务的时间。 (也许将此号码存储在单元格的附注中?)

请帮忙, 保罗

【问题讨论】:

  • 欢迎来到 StackOverFlow,请借此机会参加 tour 并学习如何使用 How to Askminimal reproducible example
  • 欢迎。冒着重复 @Cooper 的 cmets 的风险,您能否编辑您的问题以分享您开发的代码并突出显示错误发生的位置。你也可以分享你的电子表格吗?而且由于 StackOverflow 不是定制的编码服务,最好将一些问题推迟到另一个问题。

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

您可以使用可用于 Range 对象的merge() 方法合并给定范围内的所有垂直单元格。您可以查看merge() 方法如何工作的文档here

以下代码将垂直合并单元格,只要它们具有相同的非空值并且它们彼此相邻。

function numberToLetter(number){
  var temp = "" 
  var letter = "";
  while (number > 0){
    temp = (number - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    number = (number - temp - 1) / 26;
  }
  return letter;
}

function myFunction() {
  var ss = SpreadsheetApp.getActiveSheet();

  for (col = 2; col <=8; col++){ //Do from Columns B to H (B = 2, H = 8)
    var start = 26; // Start row range
    var end = 121;  // End of Row range
    var mergeArr = [];
    var colData = ss.getRange(start, col, end, 1).getValues().toString().split(","); 
    var last = false;
    var count = -1;

    colData.forEach(function(e) {
      if (e == last){
        count++;
      }
      else if (e != last){
        mergeArr.push(count + 1);
        count = 0;
      }
      last = e;
    });

    var mergeStart = start;   
    for (each = 0; each < mergeArr.length; each++){

      var mergeEnd = mergeStart + mergeArr[each] - 1;      

      if (ss.getRange(numberToLetter(col) + mergeStart).getValue() == "" ){        
      }
      else{
        if (mergeEnd - mergeStart >= 1){
          ss.getRange(numberToLetter(col) + mergeStart + ':' + numberToLetter(col) + mergeEnd).merge(); 
        }
      }
      mergeStart = mergeEnd + 1;      
    }     
  }
}

您可以通过在for 循环中更改startend 的值和col 的范围来修改任何范围。

【讨论】:

    【解决方案2】:

    Rafa Guillermo 的解决方案几乎正是我想要的,但我做了两个小改动:1) 我想将列指定为数组(基于 1 的索引)和 2) 我的一些数据在单元格中包含逗号,这不会toString().split(",") 方法不能很好地工作。

    function numberToLetter(number){
      var temp = "" 
      var letter = "";
      while (number > 0){
        temp = (number - 1) % 26;
        letter = String.fromCharCode(temp + 65) + letter;
        number = (number - temp - 1) / 26;
      }
      return letter;
    }
    
    function mergeColumns() {
      var ss = SpreadsheetApp.getActiveSheet();
      cols = [1, 2, 4, 5, 6, 7, 11]   
      var start = 1; // Start row range
      var end = 500;  // End of Row range
    
      cols.forEach( function (col) { // For each relevant column
        var mergeArr = [];
        var colData = ss.getRange(start, col, end, 1).getValues() 
        var last = null;
        var count = -1;
    
        colData.forEach(function(e) {
          eStr = e.toString()
          if (eStr === last){
            count++;
          } else {
            mergeArr.push(count + 1);
            count = 0;
          }
          last = eStr;
        });
    
        var mergeStart = start;   
        for (each = 0; each < mergeArr.length; each++){
    
          var mergeEnd = mergeStart + mergeArr[each] - 1;      
    
          if (ss.getRange(numberToLetter(col) + mergeStart).getValue() == "" ){        
          }
          else{
            if (mergeEnd - mergeStart >= 1){
              ss.getRange(numberToLetter(col) + mergeStart + ':' + numberToLetter(col) + mergeEnd).merge(); 
            }
          }
          mergeStart = mergeEnd + 1;      
        }     
      })
    }
    
    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      // Or DocumentApp or FormApp.
      ui.createMenu('Custom Menu')
          .addItem('First item', 'mergeColumns')
          .addToUi();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多