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

У меня есть лист Google, где мне нужно объединить ячейки, если значения повторяются

Ожидается, что ячейка будет объединена из А1 в А4 и будет иметь одно значение А.

Я пробовал,

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
//var values = range.getValues();
var numCols = values[0].length;

    values = [
        ["A", "B", "C", "D", "E"],
        ["A", "B", "S", "D", "E"],
        ["A", "D", "C", "D", "E"],
        ["A", "B", "C", "D", "K"],
        ["c", "B", "W", "D", "K"],
        ["A", "B", "C", "D", "E"],
    ]

    for (var j = 0; j < numCols; j++) {
        var placer = '';
        for (var i = 0; i < values.length - 1; i++) {
            if (values[i][j] == values[i + 1][j])
                range.getCell(i + 2, j + 1).setValue('');
        }
    }

1 Ответ

2 голосов
/ 28 июня 2019
  • Вы хотите объединить ячейки по вертикали, когда ячейки имеют одинаковые значения в вертикальном направлении.
  • Вы хотите получить следующую ситуацию.

  • Input enter image description here

  • Выход enter image description here

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Процесс моего примера сценария выглядит следующим образом.

  1. Транспонировать значения.
  2. Начальные и конечные адреса для объединяющихся ячеек извлекаются из транспонированных значений.
  3. Объединить ячейки, используя найденные адреса.

Пример сценария:

// Retrieve values from the active sheet.
var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getDataRange().getValues();

// Transpose values.
var res1 = values[0].map(function(_, i) {return values.map(function(e) {return e[i]})});

// Merge cells.
res1.forEach(function(col, i) {
  var temp = {};
  col.forEach(function(row, j) {
    if (row === col[j + 1] && !(row in temp)) {
      temp[row] = j;
    } else if (row != col[j + 1] && row in temp) {
      sheet.getRange(temp[row] + 1, i + 1, (j - temp[row]) + 1, 1).merge();
      temp = {};
    }
  });
});

Примечание:

  • Это простой пример сценария. Поэтому, пожалуйста, измените это для вашей ситуации.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, прошу прощения.

Edit:

Это ответ на дополнительный вопрос .

Использование:

  1. Вручную выберите ячейки «A2: C6» на «Лист1».
  2. Запустите скрипт.

Сценарий:

// Retrieve values from the active sheet.
var range = SpreadsheetApp.getSelection().getActiveRange();
var sheet = range.getSheet();
var values = range.getValues();

// Transpose values.
var res1 = values[0].map(function(_, i) {return values.map(function(e) {return e[i]})});

// Offset
var r = range.getRow() - 1;
var c = range.getColumn() - 1;

// Merge cells.
res1.forEach(function(col, i) {
  var temp = {};
  col.forEach(function(row, j) {
    if (row === col[j + 1] && !(row in temp) && row != "") {
      temp[row] = j;
    } else if (row != col[j + 1] && row in temp) {
      sheet.getRange(r + temp[row] + 1, c + i + 1, (j - temp[row]) + 1, 1).merge();
      temp = {};
    }
  });
});

Результат:

До:

enter image description here

После:

enter image description here

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