Переместить столбцы на основе массива номеров столбцов - PullRequest
1 голос
/ 07 февраля 2020

У меня есть массив столбцов, которые я хочу сохранить. У меня есть этот код ниже:

  //Keep only columns user wants.
  if(keepColumnsArray != ""){    
    for (var col = sourceShtLC; col > 0; col--) {
      if (keepColumnsArray.indexOf(col) == -1) {
        // This isn't a keeper, delete it
        destSht.deleteColumn(col);
      }    
    }
  }

Теперь я хочу расположить столбцы в соответствии с порядком, который есть у keepColumnsArray.

Образцы:

var keepColumnsArray = [3,2,1,4,5]

Используя приведенный выше пример, я хочу, чтобы столбец 3 был первым, столбец 2 - вторым, столбец 1 - третьим, столбец 4 - четвертым, а столбец 5 - пятым.

Текущий заказ:

enter image description here

Заказ, который я хочу. Как вы можете видеть, это тот же порядок, в котором находится массив.

enter image description here

Решение: Вместо того, чтобы сначала удалить столбцы, я использовал код из принятого ответа на переместите столбцы, которые я хочу оставить вперед. В этом случае столбцы с 1 по 5 я сохранил, а затем удалил остальные, потому что все, что осталось, это столбцы, которые мне не нужны. Вот мой окончательный код.

  //Use order of array to reorder columns and then delete the rest of the columns
  var offset = keepColumnsArray.length;
  destSht.insertColumns(1, offset);
  keepColumnsArray.forEach(function(e, i) {
    destSht.getRange(1, (e + offset), destSht.getLastRow(), 1).copyTo(destSht.getRange(1, i + 1));
  });
  destSht.deleteColumns(offset + 1, sourceShtLC);  //Keep only columns user wants.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020
  • Вы хотите расположить столбцы на листе с помощью var keepColumnsArray = [3,2,1,4,5].
    • Например, вы хотите расположить столбцы от 1, 2, 3, 4, 5 до 3, 2, 1, 4, 5.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

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

Шаблон 1:

В этом случае используется moveColumns. Этот сценарий выполняется следующим образом.

  1. Создание объекта массива, включая исходный индекс и целевой индекс столбцов.
  2. Сортировка массива.
  3. столбцы расположены с использованием moveColumns.

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

function myFunction() {
  var keepColumnsArray = [3,2,1,4,5];

  var obj = keepColumnsArray.reduce(function(ar, e, i) {
    ar.push({from: i + 1, to: e});
    return ar;
  }, []);
  obj.sort(function(a, b) {return  a.to < b.to ? -1 : 1});
  var sheet = SpreadsheetApp.getActiveSheet();
  obj.forEach(function(o) {
    var columnSpec = sheet.getRange(1, o.from);
    if (o.from != o.to) sheet.moveColumns(columnSpec, o.to);
    for (var j = 0; j < obj.length; j++) {
      if (obj[j].from < o.from) obj[j].from += 1;
    }
  });
}

Шаблон 2:

В этом случае каждый столбец копируется в порядке keepColumnsArray с использованием временного листа и поместите упорядоченные столбцы на исходный лист.

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

function myFunction() {
  var keepColumnsArray = [3,2,1,4,5];

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var temp = ss.insertSheet("temp");
  sheet.activate();
  keepColumnsArray.forEach(function(e, i) {
    sheet.getRange(1, e, sheet.getLastRow(), 1).copyTo(temp.getRange(1, i + 1));
  });
  temp.getDataRange().copyTo(sheet.getRange(1, 1));
  ss.deleteSheet(temp);
}

Ссылка:

Добавлено:

Из комментарий OP , В этом примере сценария столбцы вставляются и помещаются упорядоченные столбцы.

Вместо того, чтобы создавать временную таблицу, мы не можем добавить 5 столбцов в начало и затем скопировать их в эти новые столбцы?

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

function myFunction() {
  var keepColumnsArray = [3,2,1,4,5];

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var offset = keepColumnsArray.length;
  sheet.insertColumns(1, offset);
  keepColumnsArray.forEach(function(e, i) {
    sheet.getRange(1, e + offset, sheet.getLastRow(), 1).copyTo(sheet.getRange(1, i + 1));
  });
  sheet.deleteColumns(offset, offset);
}
2 голосов
/ 07 февраля 2020

Проблема

  1. Фильтрация столбцов по критериям
  2. Изменение порядка столбцов по критериям

Решение

Сначала добавьте logi c, который фильтрует и сортирует ваши значения. Один из возможных алгоритмов выглядит следующим образом: map source так, что каждая строка имеет mapped , так что каждая ячейка является ячейкой на index order из столбцов источника и фильтра, например что его индекс является индексом хранения .

var input = [3,2,1,4,5];

var initial = [
  ['Column1','Column2','Column3','Column4','Column5','Column6','Column7'],
  ['2first','2second','2third','2fourth','2fifth','2sixth','2seventh'],
];

function filterAndReorder (source,order) {
  return source
  .map(function(row,r){        
    return row.map(function(cell,c){
      return source[r][order[c]-1];
    })
    .filter(function(cell,c){
      return cell !== undefined;
    });
  })
}

var output = filterAndReorder(initial,input);

console.log(output);

Затем используйте тот факт, что setValues() принимает 2D Array и заменяет Range содержимое:

var lrow = destSht.getLastRow();
var range = destSht.getRange(1,1,lrow,5);
var inputVals = range.getValues();

var keepColumnsArray = []; //obtain the keep Array somehow;

var outputVals = filterAndReorder(inputVals,keepColumnsArray);

var range.setValues(outputVals);

Примечания

  1. keepColumnsArray - это Array, поэтому != "" является избыточным (если только вы не ожидаете, что это будет пустая строка, и в этом случае я бы предложил переписать логи c, которые выводит Array - это сэкономит вам как минимум 1 операцию + сэкономит ваше время отладки в будущем.
  2. Как общее практическое правило, пожалуйста, избегайте максимально возможного использования ввода / вывода (особенно в al oop) и держите вход близко к началу логики c и выводите до конца. deleteColumn является вводом-выводом и, следовательно, по крайней мере, должен выполняться в пакетном режиме.
  3. UPD если вы переупорядочиваете частично (то есть столбцы остаются неизменными), вы можете сложить результирующие пустые столбцы через deleteColumns()

Ссылки

  1. filter() метод ref on MDN
  2. map() метод ref в MDN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...