Если я правильно понимаю, вы хотите преобразовать ряд ячеек, который выглядит следующим образом:
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())
Вызов Range.getValues()
в скрипте Google возвращает двумерный «массив массивов».С предоставленными мною примерами ячеек вы получите что-то вроде:
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
будет «январь», затем снова «январь», затем «февраль»).Мы храним счетчики в объекте, c
, который начинается пустым и будет выглядеть так, когда мы закончим:
c = {Feb: 3.0, Apr: 3.0, Jan: 2.0, Mar: 1.0}
Материал ?
и :
- это фантастический JavaScript *Синтаксис 1052 * троичного , который в основном гласит:
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 Scripts (просмотр> журналы), чтобы понятькакие ваши переменные находятся в разных точках.