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不是定制的编码服务,因此最好将一些问题推迟到另一个问题上。