Google Sheets - Горизонтальное объединение идентичных ячеек в одной строке - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над обновлением образца кода, видимого по адресу: Объединение ячеек с одинаковыми словами Предоставлено @ 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%ясно: я надеюсь проверить ячейки в данной (отсортированной) строке на наличие ячеек с идентичным содержимым, которые повторяются, а затем объединить повторяющиеся ячейки.(Я работаю над диаграммой типа календаря на недельном уровне для каждой ячейки, но хочу пометить верхнюю часть как месяцы, поэтому объединяю повторяющиеся слова «... дек, январь, январь, январь, январь, февраль ...»в заголовки.

Если кто-то захочет указать мне на какое-нибудь чтение, которое может помочь мне в моем путешествии или может помочь, это будет очень признательно.

1 Ответ

0 голосов
/ 14 декабря 2018

Если я правильно понимаю, вы хотите преобразовать ряд ячеек, который выглядит следующим образом:

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 (просмотр> журналы), чтобы понятькакие ваши переменные находятся в разных точках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...