Гугл листы: автоматически объединять идентичные ячейки - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь объединить ячейки, которые расположены вертикально и имеют одинаковые значения.

|"X"|         |"X"|
|"X"|   --->  |   |
|"X"|         |   | (merged)

Я делаю таблицу учета рабочего времени, и объединение подобных действий было бы здорово пример изображения с моего листа (Таким образом, «сон» будет объединен в один большой блок, а также «отслеживание этого листа»)

Я хочу объединить ячейки только по вертикали

(также я работаю только в диапазоне B26: H121)

Я пытался поработать с некоторым существующим кодом в stackoverflow для этого - Google Sheets - Горизонтальное объединение идентичных ячеек в одну строку и Объединение ячеек с одинаковыми словами - но у меня нет ' не смог заставить что-либо работать. Может быть, это потому, что я не знаю javascript хаха.

---

Еще одна вещь, если возможно, я хочу каким-то образом хранить размер объединенной ячейки. (На рисунке выше это будет 16 и 4 для сна и отслеживания этого листа соответственно.) Это позволило бы мне отслеживать время выполнения любой конкретной задачи, когда ячейки объединяются. (Может быть, сохранить этот номер в заметке, прикрепленной к ячейке?)

Пожалуйста, помогите, Пол

1 Ответ

0 голосов
/ 01 июля 2019

Вы можете объединить все вертикальные ячейки в данном диапазоне, используя метод merge(), который доступен для использования на объектах Range.Вы можете ознакомиться с документацией о том, как работает метод merge() здесь .

Следующий код объединит ячейки по вертикали, если они имеют одно и то же непустое значение и находятся рядом сдруг друга.

function numberToLetter(number){
  var temp = "" 
  var letter = "";
  while (number > 0){
    temp = (number - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    number = (number - temp - 1) / 26;
  }
  return letter;
}

function myFunction() {
  var ss = SpreadsheetApp.getActiveSheet();

  for (col = 2; col <=8; col++){ //Do from Columns B to H (B = 2, H = 8)
    var start = 26; // Start row range
    var end = 121;  // End of Row range
    var mergeArr = [];
    var colData = ss.getRange(start, col, end, 1).getValues().toString().split(","); 
    var last = false;
    var count = -1;

    colData.forEach(function(e) {
      if (e == last){
        count++;
      }
      else if (e != last){
        mergeArr.push(count + 1);
        count = 0;
      }
      last = e;
    });

    var mergeStart = start;   
    for (each = 0; each < mergeArr.length; each++){

      var mergeEnd = mergeStart + mergeArr[each] - 1;      

      if (ss.getRange(numberToLetter(col) + mergeStart).getValue() == "" ){        
      }
      else{
        if (mergeEnd - mergeStart >= 1){
          ss.getRange(numberToLetter(col) + mergeStart + ':' + numberToLetter(col) + mergeEnd).merge(); 
        }
      }
      mergeStart = mergeEnd + 1;      
    }     
  }
}

Вы можете изменить это для любого диапазона, изменив значения start, end и диапазон col в цикле for.

...