Google apps script 谷歌工作表:自动合并相同的单元格

Google apps script 谷歌工作表:自动合并相同的单元格,google-apps-script,google-sheets,google-sheets-api,Google Apps Script,Google Sheets,Google Sheets Api,我正在尝试合并垂直相邻且具有相同值的单元格 |"X"| |"X"| |"X"| ---> | | |"X"| | | (merged) 我正在做一个时间跟踪表,合并类似的活动会很棒 (因此,“睡眠”将被合并成一个大块,“跟踪这张表”) 我只想垂直合并单元格 (此外,我仅在B26:H121范围内操作) 为此,我尝试了使用stackoverflow上的一些现有代码,但是我没有得到任何工作。也许是因为我不懂javascript哈哈 --- 还有最后

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

|"X"|         |"X"|
|"X"|   --->  |   |
|"X"|         |   | (merged)
我正在做一个时间跟踪表,合并类似的活动会很棒 (因此,“睡眠”将被合并成一个大块,“跟踪这张表”)

我只想垂直合并单元格

(此外,我仅在B26:H121范围内操作)

为此,我尝试了使用stackoverflow上的一些现有代码,但是我没有得到任何工作。也许是因为我不懂javascript哈哈

---

还有最后一件事,如果可能的话,我想用某种方法来存储合并单元格的大小。(在上面的图片中,睡眠和跟踪这张表分别是16和4。)这将允许我跟踪单元格合并时任何特定任务的时间。(可能将此号码存储在单元格的便笺中?)

请帮忙,
Paul

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

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

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;      
    }     
  }
}
函数编号字母(数字){
var temp=“”
var字母=”;
而(数量>0){
温度=(数字-1)%26;
字母=字符串.fromCharCode(temp+65)+字母;
编号=(编号-temp-1)/26;
}
回信;
}
函数myFunction(){
var ss=SpreadsheetApp.getActiveSheet();
对于(列=2;列=1){
getRange(numberToLetter(col)+mergeStart+':'+numberToLetter(col)+mergeEnd.merge();
}
}
mergeStart=mergeEnd+1;
}     
}
}

您可以通过更改
for
循环中
开始
结束
的值和
的范围来修改任何范围。

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();
}
函数编号字母(数字){
var temp=“”
var字母=”;
而(数量>0){
温度=(数字-1)%26;
字母=字符串.fromCharCode(temp+65)+字母;
编号=(编号-temp-1)/26;
}
回信;
}
函数mergeColumns(){
var ss=SpreadsheetApp.getActiveSheet();
cols=[1,2,4,5,6,7,11]
var start=1;//开始行范围
var end=500;//行范围结束
forEach(函数(col){//用于每个相关列
var mergeArr=[];
var colData=ss.getRange(开始、列、结束、1).getValues()
var last=null;
var计数=-1;
colData.forEach(函数(e){
eStr=e.toString()
如果(eStr==最后一次){
计数++;
}否则{
合并合并推送(计数+1);
计数=0;
}
last=eStr;
});
var mergeStart=start;
对于(每个=0;每个=1){
getRange(numberToLetter(col)+mergeStart+':'+numberToLetter(col)+mergeEnd.merge();
}
}
mergeStart=mergeEnd+1;
}     
})
}
函数onOpen(){
var ui=SpreadsheetApp.getUi();
//或文档或格式。
ui.createMenu(“自定义菜单”)
.addItem('第一项','合并列')
.addToUi();
}

欢迎使用StackOverFlow。请借此机会学习如何使用和。欢迎使用。冒着重复@Cooper评论的风险,请您编辑您的问题,以共享您开发的代码,并突出显示错误发生的位置。你也可以分享你的电子表格吗。由于StackOverflow不是定制的编码服务,因此最好将一些问题推迟到另一个问题上。