如果我理解正确的话,您想要转换一行单元格,如下所示:
Jan | Jan | Feb | Feb | Feb | Mar | Apr | Apr | Apr |
进入这个:
Jan | Feb | Mar | Apr |
如果是这样,我可以帮忙!
步骤 1. 获取数据
我认为你的问题部分来自于你的电话getRange(row, column, numRows, numColumns) https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow-column-numrows-numcolumns.
在评论中你说var start = 6
是起始行,但您将其放在列位置。不确定你的意图是什么,但有一个可能更清楚startRow
and a startCol
多变的。例如,
var startRow = 1;
var startCol = 1;
// Later...
ss.getRange(startRow, startCol, 1, ss.getLastColumn())
Calling Range.getValues()
在 Google 脚本中返回一个二维“数组的数组”。通过我提供的示例单元格,您将得到类似以下内容的内容:
data = [['Jan', 'Jan', 'Feb', 'Feb', 'Feb', 'Mar', 'Apr', 'Apr', 'Apr']]
由于我们只处理一行,因此我们可以获取该外部数组的第一项并调用that数据,稍微简化了事情。所以我会这样做:
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
将是“一月”,然后再次是“一月”,然后是“二月”)。我们将计数存储在一个对象中,c
它开始时是空白的,当我们完成时将如下所示:
c = {Feb: 3.0, Apr: 3.0, Jan: 2.0, Mar: 1.0}
The ?
and :
东西很花哨的 JavaScriptternary https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator语法,基本上是说:
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);
and
Logger.log("e: %s", e);
到处查看,然后检查 Google 脚本日志(查看 > 日志)以了解不同点的变量。