gpt4 book ai didi

javascript - Google表格 - 水平合并单行中的相同单元格

转载 作者:行者123 更新时间:2023-11-29 17:39:50 27 4
gpt4 key购买 nike

我正在努力更新在以下位置看到的代码示例: 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];
});
}

为了 100% 清楚:我希望检查给定(排序)行中的单元格是否具有重复的相同内容的单元格,然后合并重复的单元格。(我正在处理日历类型的图表,每个单元格每周一次,但想将顶部标记为几个月,因此合并重复的“...Dec,Jan,Jan,Jan,Jan,Feb ...”进入标题。

如果有人想给我指点一些可能对我的旅程有所帮助的读物,或者可以伸出援手,我将不胜感激。

最佳答案

如果我没理解错的话,您想转换一行单元格,如下所示:

一月 |简 |二月 |二月 |二月 |三月 |四月 |四月 |四月 |

进入这个:

一月 |二月 |三月 |四月 |

如果是这样,我可以帮忙!

第 1 步。获取数据

我认为您的部分问题来自您调用 getRange(row, column, numRows, numColumns) 的电话.

在评论中你说 var start = 6 是起始行,但你把它放在了列位置。不确定您的意图,但使用 startRowstartCol 变量可能会更清楚。例如,

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 现在是一维数组而不是二维数组。

完整代码

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 Scripts 日志(查看 > 日志)以了解您的变量在不同点的情况。

关于javascript - Google表格 - 水平合并单行中的相同单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com