我正在努力更新以下示例代码:
Merge cells with same words
由@Tanaike提供
我实质上是在尝试与上面的示例代码做相同的事情,但有一个不同之处是,我希望将其旋转为在类似的列上水平工作,而不是在类似的行上垂直工作。
我尽了最大的努力来翻转功能,但是我是一个初学者,陷入了僵局。下面是我编辑过的代码段,我标记了我理解的特定行,因此,我认为那里有些问题。
function mergeMonths() {
var start = 6; // Start row number for values.
var c = {};
var k = "";
var offset = 0;
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BlockingChart1");
// Retrieve values of column B.
var data = ss
.getRange(4, start, 1, ss.getLastColumn())
.getValues()
.filter(String);
// Retrieve the number of duplicate values. //This is where my eyebrow starts to raise.
data.forEach(function(e) {
c[e[0]] = c[e[0]] ? c[e[0]] + 1 : 1;
});
// Merge cells.
data.forEach(function(e) {
if (k != e[0]) {
ss.getRange(4, start + offset, 1, c[e[0]]).merge();
offset += c[e[0]];
}
k = e[0];
});
}
只是要百分百清楚:
我希望检查给定(排序)行中具有重复内容相同的单元格,然后合并重复的单元格。
(我正在制作日历类型图表,每个单元格每周一次,但希望将顶部标记为几个月,因此合并重复的“ ... Dec,Jan,Jan,Jan,Jan,Feb ...”。进入标题。
如果有人想给我一些阅读资料,可能对我的旅程有帮助,或者可以伸出援手,那将不胜感激。
最佳答案
如果我理解正确,则希望转换一行像这样的单元格:Jan | Jan | Feb | Feb | Feb | Mar | Apr | Apr | Apr |
到这个:Jan | Feb | Mar | Apr |
如果是这样,我可以帮忙!
步骤1.获取数据
我认为您问题的部分原因是您致电getRange(row, column, numRows, numColumns)
。
在注释中,您说var start = 6
是开始行,但将其放在列位置。不确定您要使用的是什么,但是使用startRow
和startCol
变量可能会更清楚。例如,
var startRow = 1;
var startCol = 1;
// Later...
ss.getRange(startRow, startCol, 1, ss.getLastColumn())
在Google脚本中调用
Range.getValues()
会返回一个二维的“数组数组”。使用我提供的示例单元格,您将获得类似以下内容的信息:data = [['Jan', 'Jan', 'Feb', 'Feb', 'Feb', 'Mar', 'Apr', 'Apr', 'Apr']]
由于我们只处理一行,因此我们可以采用此外部数组的第一项并调用该数据,从而简化了一些事情。所以我会做:
var data = ss
.getRange(startRow, startCol, 1, ss.getLastColumn())
.getValues()
.filter(String)[0];
这给你:
data = ['Jan', 'Jan', 'Feb', 'Feb', 'Feb', 'Mar', 'Apr', 'Apr', 'Apr']
步骤2.计算重复值
下一部分代码用于计算每月重复的次数。使用我们的漂亮的一维数组,我们可以使代码更简单:
data.forEach(function(e) {
c[e] = c[e] ? c[e] + 1 : 1;
});
在这里,我们遍历数组
data
,依次处理每个条目“ e
”。 (e
将是“ Jan”,然后是“ Jan”,然后是“ Feb”)。我们将计数存储在对象c
中,该对象开始为空白,完成后将如下所示:c = {Feb: 3.0, Apr: 3.0, Jan: 2.0, Mar: 1.0}
?
和:
的东西是精美的JavaScript ternary语法,基本上是这样说的: c[e] = c[e] ? c[e] + 1 : 1;
[-----] [-----][-------][---]
| | | |
| v | |
(1) "have we already created an entry in c for this month e (eg, "Jan")?
| | |
| v |
(2) "if so, COUNT is the current value (look it up) plus 1
| |
| v
(3) | "if not, COUNT is 1"
|
v
(4) "store the COUNT we found in c"
步骤3.合并重复值
最后一步可能看起来像这样:
data.forEach(function(e) {
if (e != k) {
ss.getRange(startRow, startCol + offset, 1, c[e]).merge();
offset += c[e];
}
k = e;
});
同样,事情要简单一点,因为
data
现在是一个1d数组,而不是2d数组。完整的代码
function mergeMonths() {
var startRow = 1;
var startCol = 1;
var c = {};
var k = "";
var offset = 0;
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BlockingChart1");
// Get data from sheet
var data = ss
.getRange(startRow, startCol, 1, ss.getLastColumn())
.getValues()
.filter(String)[0];
// Count duplicates
data.forEach(function(e) {
c[e] = c[e] ? c[e] + 1 : 1;
});
// Merge duplicate cells
data.forEach(function(e) {
if (e != k) {
ss.getRange(startRow, startCol + offset, 1, c[e]).merge();
offset += c[e];
}
k = e;
});
}
小建议
最后一个提示:记录器对于查看代码中的内容非常有用。当您测试代码时,我会坚持如下代码:
Logger.log("data: %s", data);
和
Logger.log("e: %s", e);
在所有地方,然后查看Google脚本日志(查看>日志)以了解变量在不同点的位置。
关于javascript - Google表格-水平合并单行中的相同单元格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53780869/